Дали дадено изображение наистина е такова

gearfight

Registered
Имам ъплоуд форма за картинки, но ме е страх да я пусна публично в сайта ми, за да не качат някой шел или нещо подобно. Та въпроса ми е, някой може ли да ми вкара някаква проверка в това:
Код:
if($_POST["action"] == "Давай")
{
unset($imagename);
if(!isset($_FILES) && isset($HTTP_POST_FILES))

$_FILES = $HTTP_POST_FILES;
if(!isset($_FILES['image_file']))
$error["image_file"] = "Няма ранг.";
$imagename = basename($_FILES['image_file']['name']);
//рандом име//
$random_digit=rand(00000,99999); 
$imagename=$random_digit.$imagename;
//край на рандом име//
if(empty($imagename))
$error["imagename"] = "Няма качен ранг";
if(empty($error))
{
if(!(file_exists("forum/images/ranks/" . $imagename))) {

if ($_FILES['image_file']['size'] < 15480)
{
if ($_FILES['image_file']['type'] == "image/jpeg")
{
$newimage = "forum/images/ranks/" . $imagename;
$result = @move_uploaded_file($_FILES['image_file']['tmp_name'], $newimage);
if(empty($result))
$error["result"] = "There was an error moving the uploaded file.";
}
else
{
$error["result"] = "Jpg/Jpeg формат е разрешен само.";
}
}
else
{
$error["result"] = "Надвишен е лимита от 15kb";
}
}
else
{
$error["result"] = "Такъв ранг, с такова име вече е качен";
}
}
///////////ако има грешки///////////////
if(is_array($error))
{
while(list($key, $val) = each($error))
{
echo $val;
echo "
\n";
}
} //край на ако има грешкиии///////

За да проверява дали наистина изображението е изображение.

Благодаря.
 
тъй като не разбирам много от php(все още) но намерих една форма в която можеш да опреелиш какво да се качва и какъв да е размера на файла
Ето ти и Линк
всичко е обяснено как е прави
 
Не си ме разбрал, то и аз съм ограничил да се качва само jpg, но някой може да бутне php код и да го запази като jpg и пак да го качи (примерно)
Това е проблема и искам да го отстраня.

PP: прочетох, че може да стане с getimagesize(), но не знам как точно, моля, някой ако може, нека ми го редактира с тази функция.
Максималния допустим размер за картинки е 130х30.
 
Не ме устройва.

Сега да кажа, какво направих.

Сложих под
Код:
$result = move_uploaded_file($_FILES['image_file']['tmp_name'], $newimage);
Това:

Код:
$check = getimagesize($newimage);
 if($check !== false) {
        echo "Изображението е ОК";
    }
    else {
       unlink($result);
    }

Обаче, unlink не върши работа, с exit не става, с die също, с break качва изображението,но не изпълнява скрипта по-нататък, а и страницата се прецаква и няма как да кажа с echo на потребителя, че има грешка.

Давайте идеи.
Целта е да се спре функцията $result.

edit: прочетох, че няма начин да спра ъплоуда на изображението и се оправих така:

Код:
$check = getimagesize($newimage);
if($check !== false) {
echo "";
}
else {
echo "Проблем в изображението!.";
return; 
}
 
PHP:
$extensions = array("pdf","rar","zip","html","htm","jpg","jpeg","gif","png","bmp","js","txt","css","doc","php","psd","java","mp3","mp4","swf","exe","m3u","iso","avi","wav","xls","sfd","paf","torrent","jar","sis","xsis","py","scr","bat","com","pif","xml","csv");
$extension_file = end(explode(".",$file));
$extension_file = strtolower($extension_file);
if(!in_array($extension_file,$extensions)){
echo "Забранен формат!";
exit;
}
Ето ти една проверка :)
 
Гледайй този урк -> blip.tv/videofxbg/episode-5811983 Тук всичко е обяснено .. кое как да провериш и защо ... наистина дори аз бях забравил веднъж за файловете .. ии го гледахх ии си спомних вскичкооо .. ;) :?: :?:
 
explozen каза:
PHP:
$extensions = array("pdf","rar","zip","html","htm","jpg","jpeg","gif","png","bmp","js","txt","css","doc","php","psd","java","mp3","mp4","swf","exe","m3u","iso","avi","wav","xls","sfd","paf","torrent","jar","sis","xsis","py","scr","bat","com","pif","xml","csv");
$extension_file = end(explode(".",$file));
$extension_file = strtolower($extension_file);
if(!in_array($extension_file,$extensions)){
echo "Забранен формат!";
exit;
}
Ето ти една проверка :)
Той правилно каза,че понякога може да запише php файл като jpg формат и реално тази проверка няма как да го провери файла ,поне аз не виждам :)
 
//рандом име//
$random_digit=rand(00000,99999);
$imagename=$random_digit.$imagename;
Само да кажа,че е по-удачно да записваш стандарното име в SHA-1 примерно, за да избегнеш повторения,защото ако сайта има над 1000-2000 картинки има вероятност да се "застъпят" имената.
със SHA-1 това се избягва защото при различни имена то ще генерира расличен код (a, и няма да е на случаен принцип, но ще изглеждат така).
 
Hous каза:
//рандом име//
$random_digit=rand(00000,99999);
$imagename=$random_digit.$imagename;
Само да кажа,че е по-удачно да записваш стандарното име в SHA-1 примерно, за да избегнеш повторения,защото ако сайта има над 1000-2000 картинки има вероятност да се "застъпят" имената.
със SHA-1 това се избягва защото при различни имена то ще генерира расличен код (a, и няма да е на случаен принцип, но ще изглеждат така).

Абсолютно не е вярно, хеширащата функция, не е предназначена да генерира random стрингове.

Най - удачният начин е със time();

Тоест: time().rand(0000, 9999); Отдлено може да добавяш и по някоя друга рандом буква да слага, като например ето така:

PHP:
$string = time().rand(0000, 9999).chr(rand(97,122));

time(); От 43 години не е показвала една и съща стойност (разбира се интервала при смяна на числата е 1 секунда).

rand(0000, 9999);
Да покаже една и съща стойност е 1/9999

А chr(rand(97, 122)); Да покаже една и съща стойност е 1/25

А 3 те заедно да покажат една и съща стойност, аз не мога да го сметна.




А колкото по темата:

Имаш 2 опции:

- 1. Папката за снимките е правиш извън www/public папката, по този начин няма как да ти стартират shell кода (ако има такъв качен).

- 2. При качване на изображението, ще използваш GD library и ще правиш проверка за големина на снимката, нали ако не е снимка големината ще излезне 0пкс. После самата снимка може да е презапишеш във jpeg формат от самата GD library. То тази библиотека е пълна със най - различни интересни функции, разучи е.
 
eddyy93 каза:
Абсолютно не е вярно, хеширащата функция, не е предназначена да генерира random стрингове.
Не е ,но може да обръща имената като test_test във k9adaks9dka9sdk при което шанса да се повтарят,е минимален,а шанса при генериране на числа от 0 до 9999 е доста по-голям...
Има сякакви методи дори с md5 или uniqueid просто да го има предвид.
 
И какво като качи PHP код като JPG? Как ще го пусне? Ще отвори снимката? Изненада - сървъра няма да се опита да парсне снимка.

Само за информация - в снимките има полета за информация, където пак спокойно може да се набута PHP код. Валидна снимка с код вътре. Даже и архив може да набуташ в снимката, ама това няма никакъв начин да се изпълни на сървъра ти.
 
Добре тогава, хеширай думата "image1" 100 пъти и ми кажи колко разлики има във хешираните имена. :)
 
StormBreaker каза:
И какво като качи PHP код като JPG? Как ще го пусне? Ще отвори снимката? Изненада - сървъра няма да се опита да парсне снимка.

Само за информация - в снимките има полета за информация, където пак спокойно може да се набута PHP код. Валидна снимка с код вътре. Даже и архив може да набуташ в снимката, ама това няма никакъв начин да се изпълни на сървъра ти.

http://php.webtutor.pl/en/2011/05/13/php-code-injection-a-simple-virus-written-in-php-and-carried-in-a-jpeg-image/


:?:
 
eddyy93 каза:
StormBreaker каза:
И какво като качи PHP код като JPG? Как ще го пусне? Ще отвори снимката? Изненада - сървъра няма да се опита да парсне снимка.

Само за информация - в снимките има полета за информация, където пак спокойно може да се набута PHP код. Валидна снимка с код вътре. Даже и архив може да набуташ в снимката, ама това няма никакъв начин да се изпълни на сървъра ти.

http://php.webtutor.pl/en/2011/05/13/php-code-injection-a-simple-virus-written-in-php-and-carried-in-a-jpeg-image/


:?:

Because he’s been using include() clause to read an images, his script was vulnerable to the code injection!

:?:
 
Едвали няма начин, този файл щом е качен да не се стартира. Толкова труд да качиш един файл, за да не го стартираш, трябва да има начин.

Ако успеят да качат .htaccess файл, той ще стартира jpeg файла като PHP файл <-- На тази информация попаднах туко що, която е правилна, но как ще се качи този .htaccess, нямам идея.

Начин трябва да има, но да седим на това дали някой ще успее - ами мисля, че не е правилно.
 
eddyy93 каза:
Едвали няма начин, този файл щом е качен да не се стартира. Толкова труд да качиш един файл, за да не го стартираш, трябва да има начин.

Ако успеят да качат .htaccess файл, той ще стартира jpeg файла като PHP файл <-- На тази информация попаднах туко що, която е правилна, но как ще се качи този .htaccess, нямам идея.

Начин трябва да има, но да седим на това дали някой ще успее - ами мисля, че не е правилно.

Няма начин да се стартира картинка, освен ако не го прави този дето е правил сайта. Било то с htaccess или с include/require/eval

То ако така се изпълняваха картинки и facebook да са хакнали досега.

ПП. Код в картинка може да има дори да не е в информационната част. Информацията за пикселите е поредица от байтове, кода е поредица от байтове. Въпроса дали ще го гледаш като картинка или като код е с какво ще го отвориш. И разбира се трябва да си има jpg/png хедъра.
 

Back
Горе