Как защититься от взлома при загрузке пользователем изображения?
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Как защититься от взлома при загрузке пользователем изображения? - 2009-01-16 01:43:47.160000
|
|
|
azimzaim
Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
|
Лично я, что бы уберечься делаю так (здесь reload определенная функция, которая выводить в браузер определенным методом сообщение об ошибке):
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>1)
{reload ("ТОЧКА встречается в имени файла $findtchka раз(а). Это ЗАПРЕЩЕНО!");}
/* 2. если в имени есть .php, .html, .htm - свободен!*/
$bago="Извините. В имени ФАйла <B>запрещено</B> использовать .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."");}
/***********************************************************\
|___Генерация уникального имени для большого изображения____|
\***********************************************************/ здесь ещё часть кода, которую я не буду показывать, которая генерирует уникальное имя, что будет присвоено новому изображению. Что ещё можно придумать, что бы уберечь себя от того, что пользователи будет грузить вместо изображений всякую чушь, а так оно в большинстве случаев и происходит?
|
|
|
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/ и вообще курить всю хабру самое главное не расширения и прочее, хотя и это важно, а содержимое
|
|
|
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 интерпретатором, когда вы просматриваете загруженное изображение.
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-16 18:14:15.883333
|
|
|
Ingoo
Сообщений: 36
Оценки: 0
Присоединился: 2008-12-13 17:03:37.080000
|
Вот написал, подскажите пожалуста, вроде безопасно: форма загузки: quote:
<html> <head> <title>Загрузка файлов на сервер</title> </head> <body> <h2><p><b> Форма для загрузки файлов </b></p></h2> <form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="filename"><br> <input type="submit" value="Загрузить"><br> </form> </body> </html> upload.php: quote:
<html> <head> <title>Результат загрузки файла</title> </head> <body> <?php if($_FILES["filename"]["size"] > 1024*70) { echo ("Размер файла превышает 70 Кб"); exit; } $poslpos=strrpos($_FILES["filename"]["name"],"."); $rashfile = substr($_FILES["filename"]["name"], $poslpos+1, 3); if($rashfile=="gif" || $rashfile=="jpg" || $rashfile=="GIF" || $rashfile=="JPG") { // если расширение нормальное, загрузим echo "$rashfile <br>"; if(copy($_FILES["filename"]["tmp_name"],$_FILES["filename"]["name"])) { echo("Файл успешно загружен <br>"); echo("Характеристики файла: <br>"); echo("Имя файла: "); echo($_FILES["filename"]["name"]); echo("<br>Размер файла: "); echo($_FILES["filename"]["size"]); echo("<br>Каталог для загрузки: "); echo($_FILES["filename"]["tmp_name"]); echo("<br>Тип файла: "); echo($_FILES["filename"]["type"]); } else { echo("Ошибка загрузки файла"); } } else { echo "В качестве аватарки можно юзать только .jpg, или .gif файл…"; if($rashfile=="php") { // если расширение пхп, то сделаем запись в лог, с указанием юзера, и пометкой "интересно"..) } } ?>
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-16 22:02:39.906666
|
|
|
azimzaim
Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
|
По скрипту, то вам действительно нужно прочитать указанную выше статью и мануал в придачу. Надеюсь, я сегодня допишу свой скрипт и выложу
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-17 13:04:53.536666
|
|
|
Ingoo
Сообщений: 36
Оценки: 0
Присоединился: 2008-12-13 17:03:37.080000
|
quote:
По скрипту, то вам действительно нужно прочитать указанную выше статью и мануал в придачу. Надеюсь, я сегодня допишу свой скрипт и выложу Я считаю этот скрипт безопасным, если Вы чситаете иначе прошу поправить почему именно он не безопасен, и как обойти проверку…)
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-17 15:06:01.506666
|
|
|
mishok
Сообщений: 239
Оценки: 0
Присоединился: 2007-07-03 23:42:21.170000
|
Согласен с Masun и Pashkela… Ты проверяешь тока расширение файла…
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-18 18:34:30.676666
|
|
|
azimzaim
Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
|
Вот, написал скрипт загрузки изображения. Возможно он немного корявый, но работает <?
if (isset($errors))
{function reload($income)
{global $errors;
$errors[]=$income;
return $errors;
}
}
else
{function reload($income)
{$income=str_replace('<br>',"\n",$income);
echo "<SCRIPT language='javascript'>".
"alert('Ошибка: $income')</script>;".
"<SCRIPT language='javascript' > javascript:history.back(1)</script>".
"<noscript>Ошибка: $income</noscript>";
}
}
while(!isset($jedhgfjerwjtewjtrqer))
{
|___Переменная___|Значение по умолчанию|_______________Описание________________|
|$smwidth________|____220 пискелей_____|__ширина генерируемого изображения_____|
|$smheight_______|_______120 пикселей__| висота генерируемого изображения |
|$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 - сгенерированое имя маленького изображения |
|$fotoname - сгенерированое имя большого изображения |
|$sm_width, $sm_height - соответственно ширина и висота маленького изображения |
|$width $heught - соответственно ширина и висота большого изображения |
|$fotoksize - размер загруженого изображения |
\*****************************************************************************/
/*
<form action=['Way_to_the_script'] method=post name=form enctype=\"multipart/form-data\">
<input type='file' name='file' size=31 ALT='Загрузить' >
<input type=submit value='Добавить'>
</form>
*/
/*************************************************************************/
/*___________________________Инициализация переменных____________________*/
/************************************************************************/
$vars=array("get_small_foto"=>"true","get_big_foto"=>"true","smwidth"=>"220",
"smheight"=>"120","quality"=>"100","r"=>"190","g"=>"0","b"=>"0","x"=>"10",
"y"=>"10","datadir"=>"foto");
foreach ($vars as $key=>$value)
{if (!isset($$key)) $$key=$value;}
for ($n=48,$chars=array();$n<=122;$n++)
{if (($n>=48 and $n<=57) or ($n>=65 and $n<=90) or ($n>=97 and $n<=122))
{$chars[]=chr($n);}}
/*************************************************************************/
/*_________________________Обробка изображения___________________________*/
/*************************************************************************/
if (isset($_FILES['file']['name']) and $_FILES['file']['name']!="")
{ if (!is_dir($datadir))
{if (!mkdir($datadir))
reload("Не могу создать папку $datadir!");break;}
/*************************************************************************/
/*__________________________ЗАЩИТЫ от ВЗЛОМА_____________________________*/
/*************************************************************************/
$blacklist = array(".php", ".phtml", ".php3", ".php4",".htm",".html");
foreach ($blacklist as $item) {
if(preg_match("/$item\$/i", $_FILES['file']['name'])) {
reload ("В имени Файла запрещено использовать $item");break;}
}
$valid_images=array("gif","jpg","png","jpeg");
$ext = strtolower(substr($_FILES['file']['name'], 1 + strrpos($_FILES['file']['name'], ".")));
if (!in_array($ext, $valid_images))
{reload ("Файл не загружен. Возможные причины:<br>".
" - Разрешена загрузка только файлов с такими расширениями: gif, jpg, png, jpeg.<br>".
" - Неверно введен путь к файлу.<br>".
" - Во время загрузки файл был изменен или удален.<br>");break;}
if (!$size=getimagesize($_FILES['file']['tmp_name']))
{reload("Вы загружаете не графический файл или файл поврежден.");break;}
if (!$fotoksize=filesize($_FILES['file']['tmp_name']))
{reload ("Не могу определить размер загружаемого изображения."); break;}
If (isset($max_file_size) and ($fotoksize/1048576)>$max_file_size)
{reload ("Файл не загружен! Его размер должен быть не больше $max_file_size мб.");break;}
do
{for ($cnt=count($chars)-1,$rend=0,$foto="";$rend<=16;$rend++)
{$result=mt_rand(0,$cnt);
$foto=$foto.$chars[$result];
}
$foto=$foto.".".$ext;
}
While(is_file($datadir."/".$foto));
/*************************************************************************/
/*_________________Заливаем исходное изображение на сервер_______________*/
/*************************************************************************/
if (!copy($_FILES['file']['tmp_name'], $datadir.'/'.$foto))
{reload ("ФАЙЛ НЕ ЗАГРУЖЕН! Ошибка сервера, обратитесь к администратору");break;}
$size=getimagesize($datadir."/".$foto);
/*************************************************************************/
/*________Если необходимо маленькое фото, подключается этот модуль_______*/
/*************************************************************************/
if($get_small_foto)
{ do
{for ($cnt=count($chars)-1,$rend=0,$smallfoto="";$rend<=16;$rend++)
{$result=mt_rand(0,$cnt);
$smallfoto=$smallfoto.$chars[$result];
}
$smallfoto=$smallfoto.".".$ext;
}
While(is_file($datadir."/".$smallfoto));
if ($size[0]<=$smwidth and $size[1]<=$smheight)
{if (!copy($datadir.'/'.$foto, $datadir.'/'.$smallfoto ))
{reload ("ФАЙЛ НЕ ЗАГРУЖЕН! Ошибка сервера, обратитесь к администратору");break;}
$smwidth=$size[0]; $smheight=$size[1];}
else
{switch ($size[2])
{case "1":$im=ImageCreateFromGif("$datadir/$foto");break;
case "2": $im=ImageCreateFromJpeg("$datadir/$foto");break;
case "3": $im=ImageCreateFromPng("$datadir/$foto");break;
default : reload ("Неизвеснтый формат созданого файла");break;break;
}
$ratio_w=$size[0]/$smwidth;
$ratio_h=$size[1]/$smheight;
if ($ratio_h>$ratio_w)
{$sm_height=$smheight;
$sm_width=intval($size[0]/$ratio_h);}
else
{$sm_width=$smwidth;
$sm_height=intval($size[1]/$ratio_w);}
$dast=imagecreatetruecolor($sm_width, $sm_height);
$tc=imageColorClosest($dast,0,255,0);
imagecolorTransparent($dast, $tc);
if (!imagecopyresampled($dast, $im, 0, 0, 0, 0, $sm_width, $sm_height, $size[0], $size[1]))
{if (!unlink($datadir.'/'.$smallfoto))
{reload ("- Ошибка масштабирования! Не получилось создать миниизображение. Обратитесь к Администратору<br>".
" - Не могу удалить исходный образец.");break;}
else
reload ("Ошибка масштабирования! Не получилось создать миниизображение. Обратитесь к Администратору");break;}
$to=$datadir."/".$smallfoto;
switch ($size[2])
{case "1":imagegif ($dast,$to , $quality);break;
case "2": imageJpeg($dast,$to, $quality);break;
case "3": imagepng ($dast,$to, $quality);break;
default : reload ("Неизвеснтый формат созданого файла");break;break;
}
imageDestroy($im);
imageDestroy($dast);
}
}
else {$smallfoto=""; $sm_width=0; $sm_height=0;}
/*************************************************************************/
/*_______________Смена габаритов загружаемого фото ______________________*/
/*************************************************************************/
if ($get_big_foto)
{do
{for ($cnt=count($chars)-1,$rend=0,$fotoname="";$rend<=16;$rend++)
{$result=mt_rand(0,$cnt);
$fotoname=$fotoname.$chars[$result];
}
$fotoname=$fotoname.".".$ext;
}
While(is_file($datadir."/".$fotoname));
switch ($size[2])
{case "1":$im=ImageCreateFromGif ("$datadir/$foto");break;
case "2": $im=ImageCreateFromJpeg("$datadir/$foto");break;
case "3": $im=ImageCreateFromPng ("$datadir/$foto");break;
default : reload ("Неизвеснтый формат созданого файла");break;break;
}
if (isset($maxwidth) and isset($maxheight) and ($size[0]>=$maxwidth or $size[1]<=$maxheight))
{$ratio_w=$size[0]/$maxwidth;
$ratio_h=$size[1]/$maxheight;
if ($ratio_h>$ratio_w)
{$height=$maxheight;
$width=intval($size[0]/$ratio_h);}
else
{$width=$maxwidth;
$height=intval($size[1]/$ratio_w);}
}
else
{$width=$size[0];
$height=$size[1];}
$dast=imagecreatetruecolor($width, $height);
$tc=imageColorClosest($dast,0,255,0);
imagecolorTransparent($dast, $tc);
if (!imagecopyresampled($dast, $im, 0, 0, 0, 0, $width, $height, $size[0], $size[1]))
{if (!unlink($datadir.'/'.$fotoname))
{reload ("- Ошибка масштабирования! Не получилось создать миниизображение. Обратитесь к Администратору<br>".
" - Не могу удалить исходный образец.");break;}
else
{reload ("Ошибка масштабирования! Не получилось создать миниизображение. Обратитесь к Администратору");break;}}
if (isset($copiright) and $copiright!="")
{imagestring($dast, 20, 10, 5, $copiright, imagecolorallocate($dast, $r,$g,$b));}
elseif(isset($logo) and is_file($logo))
{$Lsize=getimagesize($logo);
switch ($Lsize[2])
{case "1":$log=ImageCreateFromGif($logo);break;
case "2": $log=ImageCreateFromJpeg($logo);break;
case "3": $log=ImageCreateFromPng($logo);break;
default : reload ("Неизвеснтый формат логотипа. Обратитесь к администратору.");break;break;
}
if (!imagecopyresampled($dast, $log,$width-$Lsize[0]-$x,$height-$Lsize[1]-$y,0,0,$Lsize[0],$Lsize[1],$Lsize[0],$Lsize[1]))
{reload ("Не удалось наложить логотип. Файл не загружен.");break;}
imageDestroy($log);
}
switch ($size[2])
{case "1":imagegif ($dast, $datadir."/".$fotoname, $quality);break;
case "2": imageJpeg($dast, $datadir."/".$fotoname, $quality);break;
case "3": imagepng ($dast, $datadir."/".$fotoname, $quality);break;
default : reload ("Неизвестный формат созданого файла"); break;break;
}
imageDestroy($im);
imageDestroy($dast);
}
else
{$fotoname=""; $width=0; $height=0; $fotoksize=0;}
if (is_file($datadir."/".$foto))
{if (!unlink($datadir.'/'.$foto))
{reload("Не могу удалить образец.");break;}
}
else {reload("Образец не найден.");break;}
}
else {$smallfoto=""; $sm_width=0; $sm_height=0; $fotoname=""; $fotoksize=""; $width=0; $height=0;}
break;
}
?>
|
|
|
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
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-18 22:12:18.143333
|
|
|
azimzaim
Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
|
quote:
ORIGINAL: Pashkela я в EXIF jpg засуну <?passthru($_GET[cmd]);?>, найду локальный инклуд и ппц твоей защите:) + kartinko.jpg%00.php kartinko.jpg%00.php не покатит по 2-м причинам:
$blacklist = array(".php", ".phtml", ".php3", ".php4",".htm",".html");
foreach ($blacklist as $item) {
if(preg_match("/$item\$/i", $_FILES['file']['name'])) {
reload ("В имени Файла запрещено использовать $item");break;}
}
$valid_images=array("gif","jpg","png","jpeg");
$ext = strtolower(substr($_FILES['file']['name'], 1 + strrpos($_FILES['file']['name'], ".")));
if (!in_array($ext, $valid_images))
{reload ("Файл не загружен. Возможные причины:<br>".
" - Разрешена загрузка только файлов с такими расширениями: gif, jpg, png, jpeg.<br>".
" - Неверно введен путь к файлу.<br>".
" - Во время загрузки файл был изменен или удален.<br>");break;} Но все же вы можете включить в код картинки свой код, который не должен помешать функции getimagesize получить ширину и высоту. Здесь, я действительно провтыкал, но я решил, что добавлю еще в защиту от взлома - проверка на наличие спецсимволов. А ещё очень важный момент - картинка будет залита во временный каталог имя которого будет генерироваться случайным путем. Затем с этой картинки будут созданы 2 образа (или один, если её размеры сильно малы ), и потом эти образы будут сохранены в файлы, а временный каталог будет удален вместе с исходным файлом. Таким образом я отфильтрую вредную информацию из картинки, если она там есть и если её наличие не мешает распознать высоту и ширину картинки, а если мешает, то скрипт остановится ещё на первом этапе. Но это все теоретически. На практике не понятно что может получиться.
|
|
|
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/
|
|
|
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.
|
|
|
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>1)
{reload ("ТОЧКА встречается в имени файла $findtchka раз(а). Это ЗАПРЕЩЕНО!");}
/* 2. если в имени есть .php, .html, .htm - свободен!*/
$bago="Извините. В имени ФАйла <B>запрещено</B> использовать .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'=>'.gif',
'image/jpeg'=>'.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(....
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-19 16:32:54.266666
|
|
|
kolPeeX
Сообщений: 1456
Оценки: 0
Присоединился: 2007-01-25 14:57:57.683333
|
quote:
ORIGINAL: Masun То есть, где-то возле кнопочки сабмит вставить такие 2 строки: <?$where=$_SERVER['HTTP_HOST']; session_register("where");?> а потом проверить при получении данных, существует ли переменная where и совпадает ли она с текущим именем сервера. Это заставляет от 80 до 90% злоумышленников прекратить любые попытки получения доступа. Действительно прекратят. Побоятся кодера-шизика. quote:
А во второй статье вообще полный бред. Большая часть статьи рассказывает о том, что может сделать уже загруженный на сервер файл и как от этого влияния уберечься. Из 2 статей можно сделать несколько выводов: 1. Нужно проверять расширение файла и допускать, только определенные расширения. 2. Нужно проверять getimagesize. Если есть ширина и высота, то тут уже 50 на 50, что это картинка. 3. Проверять where. Но, так и не было написанного самого важного, вернее автору упомянул об этом, но так и не дал ответ: Что если имеджфайл может иметь расширение gif (например), при этом иметь высоту и ширине, но содержат нестандартные php коды внутри обычного двоичного кода рисунка, которые очень трудно найти невооруженным глазом и которые абсолютно не влияют на отображение рисунка. Они выполняются лишь PHP интерпретатором, когда вы просматриваете загруженное изображение. Что тебе даст проверка $where? Что там может быть не то? Вирус?
|
|
|
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'=>'.gif', 'image/jpeg'=>'.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% полагатся нельзя.
|
|
|
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=>'.gif',
2=>'.jpg'
3=>'.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. Я даже на свой хост это загружу, если хочешь (мне же "хуже") Идет?
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-19 22:26:56.010000
|
|
|
azimzaim
Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
|
не нужно, так волноваться. Если честно, то спасибо за предложение, но мне просто не интересно взламывать чужие защиты, мне бы защитить свою систему.
|
|
|
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ессии получить и все… Короче не грей голову, никому не нужен твой сайт, и никто не будет туда тебе левые картинки слать (хотя предохраняться все равно надо)
|
|
|
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 заголовки запихнешь назад в изображение?
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 15:41:02.053333
|
|
|
MotoKiller
Сообщений: 1732
Оценки: 56
Присоединился: 2008-03-02 20:08:53.810000
|
А ты собираешся каждый заливаемый файл запускать? Пускай себе лежит, он безобиден когда не напущен.
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 15:58:13.516666
|
|
|
azimzaim
Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
|
quote:
ORIGINAL: MotoKiller А ты собираешся каждый заливаемый файл запускать? Пускай себе лежит, он безобиден когда не напущен. интересные у вас мысли. Если юзер загружает себе аватар, как же файл будет лежать? И вообще зачем загружать файл, если он будет просто лежать.
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 16:01:50.756666
|
|
|
Pashkela
Сообщений: 3756
Оценки: 736
Присоединился: 2007-01-03 06:19:40.900000
|
quote:
а как ты измененные EXIF заголовки запихнешь назад в изображение? А ссылка на статью там для чего лежит? Что вот твоя фраза вообще может означать, если ты ту статью прочитал?
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 17:31:40.180000
|
|
|
azimzaim
Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
|
quote:
ORIGINAL: Pashkela quote:
а как ты измененные EXIF заголовки запихнешь назад в изображение? А ссылка на статью там для чего лежит? Что вот твоя фраза вообще может означать, если ты ту статью прочитал? нет, ты меня не понял Вот код из статьи
<?php
$exif = exif_read_data('picture.jpg', 0, true);
echo "picture.jpg:<br>\n";
foreach ($exif as $key => $section)
{
foreach ($section as $name => $val)
{
echo htmlspecialchars("$key.$name: $val")."<br>\n";
}
}
?> но он не записывает измененные заголовки назад в файл, а просто их выводит в браузер. И он эти заголовки будет выводить даже если там нету ничего опасного.
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 18:45:47.643333
|
|
|
kolPeeX
Сообщений: 1456
Оценки: 0
Присоединился: 2007-01-25 14:57:57.683333
|
А зачем записываттьь обратно? Там ясно сказано про уязвимость в движке - он выводит эту exif-информацию, не фильтруя ее достаточно.
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-20 23:47:33.026666
|
|
|
Cep}|{
Сообщений: 1396
Оценки: 0
Присоединился: 2007-06-26 01:11:51.416666
|
Да он наверно боится по ссылкам ходить, форум то типа хакерский..Нацеппляет всякой хрени ))):)
|
|
|
RE: Как защититься от взлома при загрузке пользователем изображения? - 2009-01-21 03:10:11.473333
|
|
|
azimzaim
Сообщений: 320
Оценки: 0
Присоединился: 2009-01-04 22:14:32.760000
|
quote:
ORIGINAL: kolPeeX А зачем записываттьь обратно? Там ясно сказано про уязвимость в движке - он выводит эту exif-информацию, не фильтруя ее достаточно. так что ты предлагешь, залить на сайт фото как есть, а при выводе постоянно фильтровать exif? Кроме того на моем хостинге, как и на локалхост домашнем не подключена эта библиотека. Хотя с этого надо было и начинать.
|
|
|
|
|