Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Как защититься от взлома при загрузке пользователем изображения?

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Веб-программинг] >> Как защититься от взлома при загрузке пользователем изображения?
Имя
Сообщение << Старые топики   Новые топики >>
Как защититься от взлома при загрузке пользователем изображения? - 2009-01-16 01:43:47.160000   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
Лично я, что бы уберечься делаю так (здесь reload определенная функция, которая выводить в браузер определенным методом сообщение об ошибке):

  &nbsp; if (isset($_FILES['file']['size'])) &nbsp;&nbsp;&nbsp; {$fotosize=$_FILES['file']['size'];} // Запоминаем размер файла &nbsp;&nbsp;&nbsp; else &nbsp;&nbsp;&nbsp; {reload ("Не могу определить размер загружаемого изображения.");} &nbsp;&nbsp;&nbsp; $valid_images=array("gif","jpg","png","jpeg");// проверяем расширение файла &nbsp;&nbsp;&nbsp; $ext = strtolower(substr($fotoname, 1 + strrpos($fotoname, ".")));// &nbsp;&nbsp;&nbsp; if (!in_array($ext, $valid_images)) &nbsp;&nbsp;&nbsp; {reload ("ФАЙЛ НЕ загружен.&nbsp; Возможные причины:\\n - разрешена загрузка только файлов с такими расширениями: gif, jpg, png, jpeg.\\n - Вы пытаетесь загрузить не графический файл;\\n - неверно введён адрес или выбран файл");} &nbsp; /*************************************************************\ &nbsp; |______________________ЗАЩИТЫ от ВЗЛОМА_______________________| &nbsp; \*************************************************************/ &nbsp;&nbsp; /* 1. считаем кол-во точек в выражении - если большей одной - СВОБОДЕН!*/ &nbsp;&nbsp;&nbsp; $findtchka=substr_count($fotoname, "."); &nbsp;&nbsp;&nbsp; if ($findtchka&gt;1) &nbsp;&nbsp;&nbsp; {reload ("ТОЧКА встречается в имени файла $findtchka раз(а). Это ЗАПРЕЩЕНО!");} &nbsp;&nbsp;&nbsp; /* 2. если в имени есть .php, .html, .htm - свободен!*/ &nbsp;&nbsp;&nbsp; $bago="Извините. В имени ФАйла &lt;B&gt;запрещено&lt;/B&gt; использовать .php, .html, .htm"; &nbsp;&nbsp;&nbsp; if (preg_match("/\.php/i",$fotoname)) &nbsp;&nbsp;&nbsp; {reload ("Вхождение *.php найдено.".$bago."");} &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (preg_match("/\.html/i",$fotoname)) &nbsp;&nbsp;&nbsp; {reload ("Вхождение *.html найдено.".$bago."");} &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (preg_match("/\.htm/i",$fotoname)) &nbsp;&nbsp;&nbsp; {reload ("Вхождение *.htm найдено.".$bago."");} &nbsp;&nbsp; /***********************************************************\ &nbsp;&nbsp; |___Генерация уникального имени для большого изображения____| &nbsp;&nbsp; \***********************************************************/ здесь ещё часть кода, которую я не буду показывать, которая генерирует уникальное имя, что будет присвоено новому изображению.

Что ещё можно придумать, что бы уберечь себя от того, что пользователи будет грузить вместо изображений всякую чушь, а так оно в большинстве случаев и происходит?
Post #: 1
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-16 01:51:57.090000   
Pashkela

Сообщений: 3756
Оценки: 736
Присоединился: 2007-01-03 06:19:40.900000
http://habrahabr.ru/blogs/php/44610/

http://habrahabr.ru/blogs/php/44615/

и вообще курить всю хабру

самое главное не расширения и прочее, хотя и это важно, а содержимое
Post #: 2
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-16 13:55:57.500000   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
Прочитал первую статью. Думал, будут какие-то фундаментальные мысли, но лажа, хотя и не полная. Действительно на элементарном уровне защиту таким способом можно сделать, но пол статьи можно урезать, если использовать проверку поступленной информации вообще, а не конкретно изображения. То есть, где-то возле кнопочки сабмит вставить такие 2 строки:
<?$where=$_SERVER['HTTP_HOST'];
session_register("where");?>
а потом проверить при получении данных, существует ли переменная where и совпадает ли она с текущим именем сервера. Это заставляет от 80 до 90% злоумышленников прекратить любые попытки получения доступа.
 
А во второй статье вообще полный бред. Большая часть статьи рассказывает о том, что может сделать уже загруженный на сервер файл и как от этого влияния уберечься.
 
Из 2 статей можно сделать несколько выводов:
1. Нужно проверять расширение файла и допускать, только определенные расширения.
2. Нужно проверять getimagesize. Если есть ширина и высота, то тут уже 50 на 50, что это картинка.
3. Проверять where.
Но, так и не было написанного самого важного, вернее автору упомянул об этом, но так и не дал ответ:
Что если имеджфайл может иметь расширение gif (например), при этом иметь высоту и ширине, но содержат нестандартные php коды внутри обычного двоичного кода рисунка, которые очень трудно найти невооруженным глазом и которые абсолютно не влияют на отображение рисунка. Они выполняются лишь PHP интерпретатором, когда вы просматриваете загруженное изображение.
Post #: 3
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-16 18:14:15.883333   
Ingoo

Сообщений: 36
Оценки: 0
Присоединился: 2008-12-13 17:03:37.080000
Вот написал, подскажите пожалуста, вроде безопасно:

форма загузки:
quote:

&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Загрузка файлов на сервер&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&nbsp;&nbsp;&nbsp;&nbsp; &lt;h2&gt;&lt;p&gt;&lt;b&gt; Форма для загрузки файлов &lt;/b&gt;&lt;/p&gt;&lt;/h2&gt;
&nbsp;&nbsp;&nbsp;&nbsp; &lt;form action="upload.php" method="post" enctype="multipart/form-data"&gt;
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="file" name="filename"&gt;&lt;br&gt;
&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type="submit" value="Загрузить"&gt;&lt;br&gt;
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;



upload.php:
quote:

&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Результат загрузки файла&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;?php
&nbsp; if($_FILES["filename"]["size"] &gt; 1024*70)
&nbsp; {
&nbsp;&nbsp;&nbsp; echo ("Размер файла превышает 70 Кб");
&nbsp;&nbsp;&nbsp; exit;
&nbsp; }
&nbsp; $poslpos=strrpos($_FILES["filename"]["name"],".");
&nbsp; $rashfile = substr($_FILES["filename"]["name"], $poslpos+1, 3);
&nbsp; if($rashfile=="gif" || $rashfile=="jpg" || $rashfile=="GIF" || $rashfile=="JPG") { // если расширение нормальное, загрузим
&nbsp;
&nbsp; echo "$rashfile &lt;br&gt;";
&nbsp;
&nbsp; if(copy($_FILES["filename"]["tmp_name"],$_FILES["filename"]["name"]))
&nbsp; {
&nbsp;&nbsp;&nbsp; echo("Файл успешно загружен &lt;br&gt;");
&nbsp;&nbsp;&nbsp; echo("Характеристики файла: &lt;br&gt;");
&nbsp;&nbsp;&nbsp; echo("Имя файла: ");
&nbsp;&nbsp;&nbsp; echo($_FILES["filename"]["name"]);
&nbsp;&nbsp;&nbsp; echo("&lt;br&gt;Размер файла: ");
&nbsp;&nbsp;&nbsp; echo($_FILES["filename"]["size"]);
&nbsp;&nbsp;&nbsp; echo("&lt;br&gt;Каталог для загрузки: ");
&nbsp;&nbsp;&nbsp; echo($_FILES["filename"]["tmp_name"]);
&nbsp;&nbsp;&nbsp; echo("&lt;br&gt;Тип файла: ");
&nbsp;&nbsp;&nbsp; echo($_FILES["filename"]["type"]);
&nbsp; } else {
&nbsp;&nbsp;&nbsp;&nbsp; echo("Ошибка загрузки файла");
&nbsp; }
&nbsp;
&nbsp; }
else {
echo "В качестве аватарки можно юзать только .jpg, или .gif файл…";
if($rashfile=="php") {
// если расширение пхп, то сделаем запись в лог, с указанием юзера, и пометкой "интересно"..)
}

}

?&gt;
Post #: 4
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-16 22:02:39.906666   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
По скрипту, то вам действительно нужно прочитать указанную выше статью и мануал в придачу. Надеюсь, я сегодня допишу свой скрипт и выложу
Post #: 5
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-17 13:04:53.536666   
Ingoo

Сообщений: 36
Оценки: 0
Присоединился: 2008-12-13 17:03:37.080000
quote:

По скрипту, то вам действительно нужно прочитать указанную выше статью и мануал в придачу. Надеюсь, я сегодня допишу свой скрипт и выложу
Я считаю этот скрипт безопасным, если Вы чситаете иначе прошу поправить почему именно он не безопасен, и как обойти проверку…)

Post #: 6
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-17 15:06:01.506666   
mishok

Сообщений: 239
Оценки: 0
Присоединился: 2007-07-03 23:42:21.170000
Согласен с Masun и Pashkela
Ты проверяешь тока расширение файла…
Post #: 7
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-18 18:34:30.676666   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
Вот, написал скрипт загрузки изображения. Возможно он немного корявый, но работает

&lt;? if (isset($errors)) &nbsp;&nbsp; {function reload($income) &nbsp;&nbsp; &nbsp;{global $errors; &nbsp;&nbsp; &nbsp;$errors[]=$income; &nbsp;&nbsp; &nbsp;return $errors; &nbsp;&nbsp; &nbsp;} &nbsp;&nbsp; } &nbsp;&nbsp; else &nbsp;&nbsp; {function reload($income) &nbsp;&nbsp; &nbsp;{$income=str_replace('&lt;br&gt;',"\n",$income); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; echo "&lt;SCRIPT language='javascript'&gt;". &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "alert('Ошибка:&nbsp; $income')&lt;/script&gt;;". &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;SCRIPT&nbsp; language='javascript' &gt; javascript:history.back(1)&lt;/script&gt;". &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; "&lt;noscript&gt;Ошибка: $income&lt;/noscript&gt;"; &nbsp;&nbsp; &nbsp;} &nbsp;&nbsp; } while(!isset($jedhgfjerwjtewjtrqer)) { |___Переменная___|Значение по умолчанию|_______________Описание________________| |$smwidth________|____220 пискелей_____|__ширина генерируемого изображения_____| |$smheight_______|_______120 пикселей__|&nbsp; висота генерируемого изображения&nbsp;&nbsp;&nbsp;&nbsp; | |$datadir________|________foto_________|______куда его сохранять_______________| |$get_small_foto_|________true_________|_____сохраняет маленькое фото__________| |$get_big_foto___|________true_________|_____сохраняет большое изображение_____| |$quality________|_________100_________|___качество генерируемного изображения_| |$maxwidth_______|____бесконечность____|____максимальная ширина загружаемого___| |################|#####################|_____________изображения_______________| |$maxheight______|____бесконечность____|____максимальная висота загружаемого___| |################|#####################|_____________изображения_______________| |$max_file_size__|____бесконечность____|__максимальный размер в мегабайтах_____| |################|#####################|________загружаемого изображения_______| |$copiright______|_________нету________|_______копирайт на изобрежении_________| |$r $g $b________|_______190__0__0_____|__составляющие цвета копирайта в RGB___| |$x______________|_________10__________|__расстояние справа до логотипа________| |$y______________|_________10__________|___расстояние снизу до логотипа________| |$logo___________|_______нету__________|____________файл с логотипом___________| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Исходящие переменные~~~~~~~~~~~~~~~~~~~~~~~~~~~| |$smallfoto - сгенерированое имя маленького изображения&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | |$fotoname - сгенерированое имя большого изображения&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | |$sm_width, $sm_height - соответственно ширина и висота маленького изображения | |$width $heught - соответственно ширина и висота большого изображения&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | |$fotoksize - размер загруженого изображения&nbsp;&nbsp; | \*****************************************************************************/ /* &lt;form action=['Way_to_the_script'] method=post name=form enctype=\"multipart/form-data\"&gt; &lt;input type='file' name='file' size=31 ALT='Загрузить' &gt; &lt;input type=submit value='Добавить'&gt; &lt;/form&gt; */ &nbsp;&nbsp; /*************************************************************************/ &nbsp;&nbsp; /*___________________________Инициализация переменных____________________*/ &nbsp;&nbsp; /************************************************************************/ &nbsp;&nbsp; $vars=array("get_small_foto"=&gt;"true","get_big_foto"=&gt;"true","smwidth"=&gt;"220", &nbsp;&nbsp; "smheight"=&gt;"120","quality"=&gt;"100","r"=&gt;"190","g"=&gt;"0","b"=&gt;"0","x"=&gt;"10", &nbsp;&nbsp; "y"=&gt;"10","datadir"=&gt;"foto"); &nbsp;&nbsp; foreach ($vars as $key=&gt;$value) &nbsp;&nbsp; {if (!isset($$key)) $$key=$value;} &nbsp;&nbsp; for ($n=48,$chars=array();$n&lt;=122;$n++) &nbsp;&nbsp; {if (($n&gt;=48 and $n&lt;=57) or ($n&gt;=65 and $n&lt;=90) or ($n&gt;=97 and $n&lt;=122)) &nbsp;&nbsp; {$chars[]=chr($n);}} &nbsp;&nbsp; /*************************************************************************/ &nbsp;&nbsp; /*_________________________Обробка изображения___________________________*/ &nbsp;&nbsp; /*************************************************************************/ if (isset($_FILES['file']['name']) and $_FILES['file']['name']!="") {&nbsp;&nbsp;&nbsp; if (!is_dir($datadir)) &nbsp;&nbsp; {if (!mkdir($datadir)) &nbsp;&nbsp; reload("Не могу создать папку $datadir!");break;} &nbsp;&nbsp; /*************************************************************************/ &nbsp;&nbsp; /*__________________________ЗАЩИТЫ от ВЗЛОМА_____________________________*/ &nbsp;&nbsp; /*************************************************************************/ &nbsp;&nbsp; $blacklist = array(".php", ".phtml", ".php3", ".php4",".htm",".html"); &nbsp;&nbsp; foreach ($blacklist as $item) { &nbsp;&nbsp; &nbsp; if(preg_match("/$item\$/i", $_FILES['file']['name'])) { &nbsp;&nbsp; &nbsp;&nbsp; reload ("В имени Файла запрещено использовать $item");break;} &nbsp;&nbsp; } &nbsp;&nbsp; $valid_images=array("gif","jpg","png","jpeg"); &nbsp;&nbsp; $ext = strtolower(substr($_FILES['file']['name'], 1 + strrpos($_FILES['file']['name'], "."))); &nbsp;&nbsp; if (!in_array($ext, $valid_images)) &nbsp;&nbsp; {reload ("Файл не загружен.&nbsp; Возможные причины:&lt;br&gt;". &nbsp;&nbsp; " - Разрешена загрузка только файлов с такими расширениями: gif, jpg, png, jpeg.&lt;br&gt;". &nbsp;&nbsp; " - Неверно введен путь к файлу.&lt;br&gt;". &nbsp;&nbsp; " - Во время загрузки файл был изменен или удален.&lt;br&gt;");break;} &nbsp;&nbsp; if (!$size=getimagesize($_FILES['file']['tmp_name'])) &nbsp;&nbsp; {reload("Вы загружаете не графический файл или файл поврежден.");break;} &nbsp;&nbsp; if (!$fotoksize=filesize($_FILES['file']['tmp_name'])) &nbsp;&nbsp; {reload ("Не могу определить размер загружаемого изображения."); break;} &nbsp;&nbsp; If (isset($max_file_size) and ($fotoksize/1048576)&gt;$max_file_size) &nbsp;&nbsp; {reload ("Файл не загружен! Его размер должен быть не больше $max_file_size мб.");break;} &nbsp;&nbsp; do &nbsp;&nbsp; {for ($cnt=count($chars)-1,$rend=0,$foto="";$rend&lt;=16;$rend++) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {$result=mt_rand(0,$cnt); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $foto=$foto.$chars[$result]; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; $foto=$foto.".".$ext; &nbsp;&nbsp; } &nbsp;&nbsp; While(is_file($datadir."/".$foto)); &nbsp;&nbsp; /*************************************************************************/ &nbsp;&nbsp; /*_________________Заливаем исходное изображение на сервер_______________*/ &nbsp;&nbsp; /*************************************************************************/ &nbsp;&nbsp; if (!copy($_FILES['file']['tmp_name'], $datadir.'/'.$foto)) &nbsp;&nbsp; {reload ("ФАЙЛ НЕ ЗАГРУЖЕН! Ошибка сервера, обратитесь к администратору");break;} &nbsp;&nbsp; $size=getimagesize($datadir."/".$foto); &nbsp;&nbsp; /*************************************************************************/ &nbsp;&nbsp; /*________Если необходимо маленькое фото, подключается этот модуль_______*/ &nbsp;&nbsp; /*************************************************************************/ &nbsp;&nbsp; if($get_small_foto) &nbsp;&nbsp; {&nbsp; &nbsp;&nbsp;&nbsp; do &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {for ($cnt=count($chars)-1,$rend=0,$smallfoto="";$rend&lt;=16;$rend++) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {$result=mt_rand(0,$cnt); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $smallfoto=$smallfoto.$chars[$result]; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $smallfoto=$smallfoto.".".$ext; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; While(is_file($datadir."/".$smallfoto)); &nbsp;&nbsp; if ($size[0]&lt;=$smwidth and $size[1]&lt;=$smheight) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {if (!copy($datadir.'/'.$foto, $datadir.'/'.$smallfoto )) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {reload ("ФАЙЛ НЕ ЗАГРУЖЕН! Ошибка сервера, обратитесь к администратору");break;} &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $smwidth=$size[0]; $smheight=$size[1];} &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {switch ($size[2]) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {case "1":$im=ImageCreateFromGif("$datadir/$foto");break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "2": $im=ImageCreateFromJpeg("$datadir/$foto");break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "3": $im=ImageCreateFromPng("$datadir/$foto");break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default : reload ("Неизвеснтый формат созданого файла");break;break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$ratio_w=$size[0]/$smwidth; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$ratio_h=$size[1]/$smheight; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if ($ratio_h&gt;$ratio_w) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{$sm_height=$smheight; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$sm_width=intval($size[0]/$ratio_h);} &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{$sm_width=$smwidth; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$sm_height=intval($size[1]/$ratio_w);} &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$dast=imagecreatetruecolor($sm_width, $sm_height); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$tc=imageColorClosest($dast,0,255,0); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;imagecolorTransparent($dast, $tc); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (!imagecopyresampled($dast, $im, 0, 0, 0, 0, $sm_width, $sm_height, $size[0], $size[1])) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{if (!unlink($datadir.'/'.$smallfoto)) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {reload ("- Ошибка масштабирования! Не получилось создать миниизображение. Обратитесь к Администратору&lt;br&gt;". &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " - Не могу удалить исходный образец.");break;} &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; reload ("Ошибка масштабирования! Не получилось создать миниизображение. Обратитесь к Администратору");break;} &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $to=$datadir."/".$smallfoto; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;switch ($size[2]) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {case "1":imagegif ($dast,$to , $quality);break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "2": imageJpeg($dast,$to, $quality);break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "3": imagepng ($dast,$to, $quality);break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default : reload ("Неизвеснтый формат созданого файла");break;break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imageDestroy($im); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imageDestroy($dast); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; } &nbsp;&nbsp; else {$smallfoto=""; $sm_width=0; $sm_height=0;} &nbsp;&nbsp; /*************************************************************************/ &nbsp;&nbsp; /*_______________Смена габаритов загружаемого фото ______________________*/ &nbsp;&nbsp; /*************************************************************************/ &nbsp;&nbsp;&nbsp; if ($get_big_foto) &nbsp;&nbsp; {do &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {for ($cnt=count($chars)-1,$rend=0,$fotoname="";$rend&lt;=16;$rend++) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {$result=mt_rand(0,$cnt); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $fotoname=$fotoname.$chars[$result]; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $fotoname=$fotoname.".".$ext; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; While(is_file($datadir."/".$fotoname)); &nbsp;&nbsp; switch ($size[2]) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {case "1":$im=ImageCreateFromGif ("$datadir/$foto");break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "2": $im=ImageCreateFromJpeg("$datadir/$foto");break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "3": $im=ImageCreateFromPng ("$datadir/$foto");break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default : reload ("Неизвеснтый формат созданого файла");break;break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; if (isset($maxwidth) and isset($maxheight) and ($size[0]&gt;=$maxwidth or $size[1]&lt;=$maxheight)) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {$ratio_w=$size[0]/$maxwidth; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $ratio_h=$size[1]/$maxheight; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if ($ratio_h&gt;$ratio_w) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {$height=$maxheight; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $width=intval($size[0]/$ratio_h);} &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {$width=$maxwidth; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $height=intval($size[1]/$ratio_w);} &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; else &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {$width=$size[0]; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $height=$size[1];} &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $dast=imagecreatetruecolor($width, $height); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $tc=imageColorClosest($dast,0,255,0); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imagecolorTransparent($dast, $tc); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!imagecopyresampled($dast, $im, 0, 0, 0, 0, $width, $height, $size[0], $size[1])) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {if (!unlink($datadir.'/'.$fotoname)) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {reload ("- Ошибка масштабирования! Не получилось создать миниизображение. Обратитесь к Администратору&lt;br&gt;". &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; " - Не могу удалить исходный образец.");break;} &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; else &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {reload ("Ошибка масштабирования! Не получилось создать миниизображение. Обратитесь к Администратору");break;}} &nbsp;&nbsp; if (isset($copiright) and $copiright!="") &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {imagestring($dast, 20, 10, 5, $copiright, imagecolorallocate($dast, $r,$g,$b));} &nbsp;&nbsp; elseif(isset($logo) and is_file($logo)) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {$Lsize=getimagesize($logo); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; switch ($Lsize[2]) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {case "1":$log=ImageCreateFromGif($logo);break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "2": $log=ImageCreateFromJpeg($logo);break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "3": $log=ImageCreateFromPng($logo);break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default : reload ("Неизвеснтый формат логотипа. Обратитесь к администратору.");break;break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (!imagecopyresampled($dast, $log,$width-$Lsize[0]-$x,$height-$Lsize[1]-$y,0,0,$Lsize[0],$Lsize[1],$Lsize[0],$Lsize[1])) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {reload ("Не удалось наложить логотип. Файл не загружен.");break;} &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imageDestroy($log); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; switch ($size[2]) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {case "1":imagegif ($dast, $datadir."/".$fotoname, $quality);break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "2": imageJpeg($dast, $datadir."/".$fotoname, $quality);break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; case "3": imagepng ($dast, $datadir."/".$fotoname, $quality);break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; default : reload&nbsp;&nbsp; ("Неизвестный формат созданого файла");&nbsp;&nbsp; break;break; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imageDestroy($im); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; imageDestroy($dast); &nbsp;&nbsp; } &nbsp;&nbsp; else &nbsp;&nbsp; {$fotoname=""; $width=0; $height=0; $fotoksize=0;} &nbsp;&nbsp;&nbsp; if (is_file($datadir."/".$foto)) &nbsp;&nbsp; {if (!unlink($datadir.'/'.$foto)) &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {reload("Не могу удалить образец.");break;} &nbsp;&nbsp; } &nbsp;&nbsp; else {reload("Образец не найден.");break;} } else {$smallfoto=""; $sm_width=0; $sm_height=0; $fotoname=""; $fotoksize=""; $width=0; $height=0;} break; } ?&gt;
Post #: 8
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-18 18:58:13.326666   
Pashkela

Сообщений: 3756
Оценки: 736
Присоединился: 2007-01-03 06:19:40.900000
я в EXIF jpg засуну <?passthru($_GET[cmd]);?>, найду локальный инклуд и ппц твоей защите:)

+ kartinko.jpg%00.php
Post #: 9
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-18 22:12:18.143333   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
quote:

ORIGINAL: Pashkela

я в EXIF jpg засуну &lt;?passthru($_GET[cmd]);?&gt;, найду локальный инклуд и ппц твоей защите:)

+ kartinko.jpg%00.php

kartinko.jpg%00.php не покатит по 2-м причинам:
$blacklist = array(".php", ".phtml", ".php3", ".php4",".htm",".html"); &nbsp;&nbsp;&nbsp; foreach ($blacklist as $item) { &nbsp;&nbsp;&nbsp; &nbsp; if(preg_match("/$item\$/i", $_FILES['file']['name'])) { &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; reload ("В имени Файла запрещено использовать $item");break;} &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp;&nbsp; $valid_images=array("gif","jpg","png","jpeg"); &nbsp;&nbsp;&nbsp; $ext = strtolower(substr($_FILES['file']['name'], 1 + strrpos($_FILES['file']['name'], "."))); &nbsp;&nbsp;&nbsp; if (!in_array($ext, $valid_images)) &nbsp;&nbsp;&nbsp; {reload ("Файл не загружен.&nbsp; Возможные причины:&lt;br&gt;". &nbsp;&nbsp;&nbsp; " - Разрешена загрузка только файлов с такими расширениями: gif, jpg, png, jpeg.&lt;br&gt;". &nbsp;&nbsp;&nbsp; " - Неверно введен путь к файлу.&lt;br&gt;". &nbsp;&nbsp;&nbsp; " - Во время загрузки файл был изменен или удален.&lt;br&gt;");break;}
Но все же вы можете включить в код картинки свой код, который не должен помешать функции getimagesize получить ширину и высоту. Здесь, я действительно провтыкал, но я решил, что добавлю еще в защиту от взлома - проверка на наличие спецсимволов.
А ещё очень важный момент - картинка будет залита во временный каталог имя которого будет генерироваться случайным путем. Затем с этой картинки будут созданы 2 образа (или один, если её размеры сильно малы ), и потом эти образы будут сохранены в файлы, а временный каталог будет удален вместе с исходным файлом. Таким образом я отфильтрую вредную информацию из картинки, если она там есть и если её наличие не мешает распознать высоту и ширину картинки, а если мешает, то скрипт остановится ещё на первом этапе. Но это все теоретически. На практике не понятно что может получиться.
Post #: 10
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-18 23:01:41.403333   
Pashkela

Сообщений: 3756
Оценки: 736
Присоединился: 2007-01-03 06:19:40.900000
quote:

Здесь, я действительно провтыкал, но я решил, что добавлю еще в защиту от взлома - проверка на наличие спецсимволов.


base64 решит этот вопрос. Или любой другой метод шифрования

По поводу остального - внимательно, очень внимательно http://video.antichat.ru/2_1.html

Высота и ширина тут совершенно не при чем, к сведению. Забей в EXIF "lol" и сравни размеры в пикселях

Внимательно читаем это:

http://raz0r.name/articles/bezopasnost-zagruzhaemyx-izobrazhenij/



Post #: 11
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-19 15:01:42.393333   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
да, статья действительно очень интересная, но я её проверил на практике. Действительно, если просто скопировать загружаемый файл методом copy, то вылетает алерт, как в статье, но, когда ты делаешь все через imagecopyresampled, то ничего этого не происходит в независимости от того, что ты втиснул в EXIF, потому что GD создает новый файл, в свойствах которого прописано единственное Comment : CREATOR gd-jpeg v 1.0 (using IJG JPEG y62), quality=100.
Post #: 12
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-19 16:26:47.990000   
kolPeeX

Сообщений: 1456
Оценки: 0
Присоединился: 2007-01-25 14:57:57.683333

quote:

ORIGINAL: Masun

if (isset($_FILES['file']['size']))    {$fotosize=$_FILES['file']['size'];} // Запоминаем размер файла    else    {reload ("Не могу определить размер загружаемого изображения.");}    $valid_images=array("gif","jpg","png","jpeg");// проверяем расширение файла    $ext = strtolower(substr($fotoname, 1 + strrpos($fotoname, ".")));//    if (!in_array($ext, $valid_images))    {reload ("ФАЙЛ НЕ загружен.  Возможные причины:\\n - разрешена загрузка только файлов с такими расширениями: gif, jpg, png, jpeg.\\n - Вы пытаетесь загрузить не графический файл;\\n - неверно введён адрес или выбран файл");} /*************************************************************\ |______________________ЗАЩИТЫ от ВЗЛОМА_______________________| \*************************************************************/   /* 1. считаем кол-во точек в выражении - если большей одной - СВОБОДЕН!*/    $findtchka=substr_count($fotoname, ".");    if ($findtchka&gt;1)    {reload ("ТОЧКА встречается в имени файла $findtchka раз(а). Это ЗАПРЕЩЕНО!");}    /* 2. если в имени есть .php, .html, .htm - свободен!*/    $bago="Извините. В имени ФАйла &lt;B&gt;запрещено&lt;/B&gt; использовать .php, .html, .htm";    if (preg_match("/\.php/i",$fotoname))    {reload ("Вхождение *.php найдено.".$bago."");}       if (preg_match("/\.html/i",$fotoname))    {reload ("Вхождение *.html найдено.".$bago."");}       if (preg_match("/\.htm/i",$fotoname))    {reload ("Вхождение *.htm найдено.".$bago."");}   /***********************************************************\   |___Генерация уникального имени для большого изображения____|   \***********************************************************/


Автор сего опуса - редиска.
Чем плохо имя na.re4ke.v.4etverg.jpg или god.of.php.screenshot.gif?
Я тебя удивлю: ища подстроки ".htm", ты найдешь и ".html" тоже.
Если твой код болен такими штуками, то дефейс его спасет.

—-

Слегка штрихованный код с Хабры.

$ext = array( 'image/gif'=&gt;'.gif', 'image/jpeg'=&gt;'.jpg' ); $imageinfo = getimagesize($_FILES['userfile']['tmp_name']); if(isset($ext[$imageinfo['mime']])) { echo "Sorry, we only accept GIF and JPEG images\n"; exit; } //функция generate_unique_fname реализуется самостоятельно. Возвращает уникальное имя файла с заданным расширением. $new_filename = generate_unique_fname($ext[$imageinfo['mime']]); copy(....
Post #: 13
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-19 16:32:54.266666   
kolPeeX

Сообщений: 1456
Оценки: 0
Присоединился: 2007-01-25 14:57:57.683333

quote:

ORIGINAL: Masun

То есть, где-то возле кнопочки сабмит вставить такие 2 строки:
&lt;?$where=$_SERVER['HTTP_HOST'];
session_register("where");?&gt;
а потом проверить при получении данных, существует ли переменная where и совпадает ли она с текущим именем сервера. Это заставляет от 80 до 90% злоумышленников прекратить любые попытки получения доступа.

Действительно прекратят. Побоятся кодера-шизика.

quote:


А во второй статье вообще полный бред. Большая часть статьи рассказывает о том, что может сделать уже загруженный на сервер файл и как от этого влияния уберечься.
 
Из 2 статей можно сделать несколько выводов:
1. Нужно проверять расширение файла и допускать, только определенные расширения.
2. Нужно проверять getimagesize. Если есть ширина и высота, то тут уже 50 на 50, что это картинка.
3. Проверять where.
Но, так и не было написанного самого важного, вернее автору упомянул об этом, но так и не дал ответ:
Что если имеджфайл может иметь расширение gif (например), при этом иметь высоту и ширине, но содержат нестандартные php коды внутри обычного двоичного кода рисунка, которые очень трудно найти невооруженным глазом и которые абсолютно не влияют на отображение рисунка. Они выполняются лишь PHP интерпретатором, когда вы просматриваете загруженное изображение.

Что тебе даст проверка $where? Что там может быть не то? Вирус?
Post #: 14
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-19 16:49:33.750000   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
quote:

ORIGINAL: kolPeeX
Что тебе даст проверка $where? Что там может быть не то? Вирус?
Уважаемый kolPeeX, проверка $where мне дает гарантию, что данные из формы переданы именно с моего сайта, а не с какого-то локалхоста или т.п. Хотя и тут можно это обойти, если знать, какую переменную я требую, ведь я могу написать и $jrehwjhyrj_w__hejkrhjh вместо $where. Это хоть и не большая, но все таки хитрость.
quote:

$ext = array(
'image/gif'=&gt;'.gif',
'image/jpeg'=&gt;'.jpg'
);
$imageinfo = getimagesize($_FILES['userfile']['tmp_name']);
if(isset($ext[$imageinfo['mime']])) {
echo "Sorry, we only accept GIF and JPEG images\n";
exit;
}

//функция generate_unique_fname реализуется самостоятельно. Возвращает уникальное имя файла с заданным расширением.
$new_filename = generate_unique_fname($ext[$imageinfo['mime']]);
copy(
mime type можно изменить вручную. Да, его можно использовать как дополнительный элемент защиты, но на 100% полагатся нельзя.
Post #: 15
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-19 20:23:09.756666   
kolPeeX

Сообщений: 1456
Оценки: 0
Присоединился: 2007-01-25 14:57:57.683333

quote:

ORIGINAL: Masun

quote:

ORIGINAL: kolPeeX
Что тебе даст проверка $where? Что там может быть не то? Вирус?
Уважаемый kolPeeX, проверка $where мне дает гарантию, что данные из формы переданы именно с моего сайта, а не с какого-то локалхоста или т.п. Хотя и тут можно это обойти, если знать, какую переменную я требую, ведь я могу написать и $jrehwjhyrj_w__hejkrhjh вместо $where. Это хоть и не большая, но все таки хитрость.

1) Ты не понимаешь, как работают сессии.
2) Referer, как и все заголовки, отправлемые браузером, можно подделать.
3) При таких утверждениях с тобой сложно спорить. Ты - идиот.

quote:

mime type можно изменить вручную. Да, его можно использовать как дополнительный элемент защиты, но на 100% полагатся нельзя.

Увидел знакомые слова? Да там просто ошибка (не моя). С твоим кодом и с твоими "защитами" вообще лучше не позволять пользователям что-либо загружать.
Вот пофиксено:

$ext = array( 1=&gt;'.gif', 2=&gt;'.jpg' 3=&gt;'.png' ); $imageinfo = getimagesize($_FILES['userfile']['tmp_name']); if(isset($ext[$imageinfo[2]])) { echo "Sorry, we only accept GIF, PNG and JPEG images\n"; exit; } //функция generate_unique_fname реализуется самостоятельно. Возвращает уникальное имя файла с заданным расширением. $new_filename = generate_unique_fname($ext[$imageinfo[2]]); copy(
quote:

Да, его можно использовать как дополнительный элемент защиты, но на 100% полагатся нельзя.

Давай так: я прикручиваю к этому коду форму, дополняю его до рабочего состояния (generate_unique_fname(), ограничение на размер файла - 200К, изобр. - от 1x1 до 200x200), не накидывая дополнительной защиты.
А ты его обходишь: некорректная картинка, HTML-код (<script>alert()</script>), PHP-код (phpinfo()).
Папка с загрузками пусть будет доступна из Web. Я даже на свой хост это загружу, если хочешь (мне же "хуже")
Идет?

Post #: 16
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-19 22:26:56.010000   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
не нужно, так волноваться. Если честно, то спасибо за предложение, но мне просто не интересно взламывать чужие защиты, мне бы защитить свою систему.
Post #: 17
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 05:14:05.236666   
Cep}|{

Сообщений: 1396
Оценки: 0
Присоединился: 2007-06-26 01:11:51.416666
quote:

ORIGINAL: kolPeeX
3) При таких утверждениях с тобой сложно спорить. Ты - идиот.
Не ругайся!
 
А по теме, дак если ты так боишься левых картинок то хотя бы создавай их imagecreatefrom…();  а всякие проверки $where это все хрень, стоит только ID cессии получить и все… Короче не грей голову, никому не нужен твой сайт, и никто не будет туда тебе левые картинки слать (хотя предохраняться все равно надо)
Post #: 18
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 14:40:04.940000   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
quote:

ORIGINAL: Pashkela

quote:

Здесь, я действительно провтыкал, но я решил, что добавлю еще в защиту от взлома - проверка на наличие спецсимволов.


base64 решит этот вопрос. Или любой другой метод шифрования

По поводу остального - внимательно, очень внимательно http://video.antichat.ru/2_1.html

Высота и ширина тут совершенно не при чем, к сведению. Забей в EXIF "lol" и сравни размеры в пикселях

Внимательно читаем это:

http://raz0r.name/articles/bezopasnost-zagruzhaemyx-izobrazhenij/
а как ты измененные EXIF заголовки запихнешь назад в изображение?
Post #: 19
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 15:41:02.053333   
MotoKiller

Сообщений: 1732
Оценки: 56
Присоединился: 2008-03-02 20:08:53.810000
А ты собираешся каждый заливаемый файл запускать? Пускай себе лежит, он безобиден когда не напущен.
Post #: 20
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 15:58:13.516666   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
quote:

ORIGINAL: MotoKiller

А ты собираешся каждый заливаемый файл запускать? Пускай себе лежит, он безобиден когда не напущен.
интересные у вас мысли. Если юзер загружает себе аватар, как же файл будет лежать? И вообще зачем загружать файл, если он будет просто лежать.
Post #: 21
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 16:01:50.756666   
Pashkela

Сообщений: 3756
Оценки: 736
Присоединился: 2007-01-03 06:19:40.900000
quote:

а как ты измененные EXIF заголовки запихнешь назад в изображение?


А ссылка на статью там для чего лежит? Что вот твоя фраза вообще может означать, если ты ту статью прочитал?
Post #: 22
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 17:31:40.180000   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
quote:

ORIGINAL: Pashkela

quote:

а как ты измененные EXIF заголовки запихнешь назад в изображение?


А ссылка на статью там для чего лежит? Что вот твоя фраза вообще может означать, если ты ту статью прочитал?
нет, ты меня не понял
Вот код из статьи
&lt;?php $exif = exif_read_data('picture.jpg', 0, true); echo "picture.jpg:&lt;br&gt;\n"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($exif as $key =&gt; $section) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach ($section as $name =&gt; $val) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo htmlspecialchars("$key.$name: $val")."&lt;br&gt;\n"; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} ?&gt; но он не записывает измененные заголовки назад в файл, а просто их выводит в браузер. И он эти заголовки будет выводить даже если там нету ничего опасного.
Post #: 23
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 18:45:47.643333   
kolPeeX

Сообщений: 1456
Оценки: 0
Присоединился: 2007-01-25 14:57:57.683333
А зачем записываттьь обратно?

Там ясно сказано про уязвимость в движке - он выводит эту exif-информацию, не фильтруя ее достаточно.
Post #: 24
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 23:47:33.026666   
Cep}|{

Сообщений: 1396
Оценки: 0
Присоединился: 2007-06-26 01:11:51.416666
Да он наверно боится по ссылкам ходить, форум то типа хакерский..Нацеппляет всякой хрени ))):)
Post #: 25
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-21 03:10:11.473333   
azimzaim

Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
quote:

ORIGINAL: kolPeeX

А зачем записываттьь обратно?

Там ясно сказано про уязвимость в движке - он выводит эту exif-информацию, не фильтруя ее достаточно.
так что ты предлагешь, залить на сайт фото как есть, а при выводе постоянно фильтровать exif?
Кроме того на моем хостинге, как и на локалхост домашнем не подключена эта библиотека. Хотя с этого надо было и начинать.
Post #: 26
Страниц:  [1]
Все форумы >> [Веб-программинг] >> Как защититься от взлома при загрузке пользователем изображения?







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.