<input type="file" name="ufile" /><br />
<input type="submit" name="send" value="Отправить!" />
и заканчивая проверкой на безопасность, вроде:
getimagesize()
$blacklist = array(".php", ".phtml", ".php3", ".php4");
и даже затрагивается тема, что картинка может содержать код php... (P.S. последнее страшновато)
Так вот вопрос.. А есть ли на каком-нибудь сайте уже готовая форма заливки на сайт в формате php, чтобы все эти нюансы защиты, вплоть до картинка-код, были учтены?
Наиболее популярные скрипты типа uploadify, swf upload не подходят.. меня интересуют только использование php.. думаю, что если я буду писать сам, то уязвимости точно будут..
Спустя 40 минут, 11 секунд (5.08.2012 - 16:23) vagrand написал(а):
Да ту по существу то и писать нечего. Загрузили файл, вроверили его при помощи getimagesize() и сохранили его в каталоге без прав на запуск и еще в .htaccesse прописали что тут запрещен запуск php скриптов. И все будет в ажуре.
Для особых параноиков я бы порекомендовал еще сделать ресайз имеджа на те же самые размеры, но тут конечно можно нарватся на какие-то искажения или потерю прозрачного фона.
Для особых параноиков я бы порекомендовал еще сделать ресайз имеджа на те же самые размеры, но тут конечно можно нарватся на какие-то искажения или потерю прозрачного фона.
Спустя 26 минут, 2 секунды (5.08.2012 - 16:49) killer8080 написал(а):
Цитата (vagrand @ 5.08.2012 - 17:23) |
Для особых параноиков я бы порекомендовал еще сделать ресайз имеджа на те же самые размеры, но тут конечно можно нарватся на какие-то искажения или потерю прозрачного фона. |
Это не паранойя, а вполне реальная уязвимость. getimagesize() совершенно бесполезна для безопасности.
Цитата (Ramzes_Ra @ 5.08.2012 - 16:43) |
думаю, что если я буду писать сам, то уязвимости точно будут.. |
конечно пиши сам, и выкладывай код здесь. Будем обсуждать. Это единственный способ научится программировать. На чужой код не надейся, он то же не застрахован от уязвимостей

Спустя 4 часа, 59 минут, 6 секунд (5.08.2012 - 21:48) Ramzes_Ra написал(а):
Эврика) я разбираюсь постепенно со второй проблемой.. вот обработчик загрузки картинки, форму думаю не надо..
есть 2 недочета:
1. Не работает проверка на ширину - высоту
2. если я не уберу проверку на php и html код (в самом низу), то картинка загружается пустая, то бишь не открывается..
Что я сделал не так?
есть 2 недочета:
1. Не работает проверка на ширину - высоту
2. если я не уберу проверку на php и html код (в самом низу), то картинка загружается пустая, то бишь не открывается..
Что я сделал не так?
if (!defined('SID')) {session_start();}
if (isset($_FILES))
{
$uploadDir = 'uploads/'; //папка для хранения файлов
if($_FILES["filename"]["size"] > 150967)
{
echo ("Размер файла превышает 150 Kb");
return;
}
$size = getimagesize($_FILES["filename"]);
if ($size[0] > 150 || $size[1] > 150)
{
echo ("Проверте ширину и высоту. Максимум 150х150");
return;
}
$allowedExt = array('jpg', 'jpeg', 'png', 'gif');
//проверяем размер и тип файла
$ext = end(explode('.', strtolower($_FILES["filename"]["name"])));
if (!in_array($ext, $allowedExt)) {
return;
}
// Проверяем загружен ли файл
if(is_uploaded_file($_FILES["filename"]["tmp_name"]))
{
include("blocks/bd.php");
$res1=mysql_query("SELECT `team` FROM `names` WHERE `id`='".$_SESSION['id']."'", $db);
$myrow1 = mysql_fetch_array($res1);
$fileName = explode('.', $_FILES["filename"]["name"]);
$fileName = "".$uploadDir."". $myrow1['team']."".rand(1000000,9999999).".".$fileName[1]."";
// Если файл загружен успешно, перемещаем его
// из временной директории в конечную
move_uploaded_file($_FILES["filename"]["tmp_name"], $fileName);
} else {
echo("Ошибка загрузки файла");
}
//считываем содержания файла
$fp = fopen($fileName, 'r');
$contents = fread($fp, filesize ($$fileName));
fclose($fp);
//чистим от php и html дескрипторов
$contents = strip_tags($contents);
$fp = fopen($fileName, 'w');
fwrite($fp, $contents);
fclose($fp);
Спустя 50 минут, 43 секунды (5.08.2012 - 22:39) Ramzes_Ra написал(а):
//считываем содержания файла
$fp = fopen($fileName, 'r');
$contents = fread($fp, filesize ($$fileName));
fclose($fp);
//чистим от php и html дескрипторов
$contents = strip_tags($contents);
$fp = fopen($fileName, 'w');
fwrite($fp, $contents);
fclose($fp);
вот если поставить это, то картинка пустая грузится, то бишь открывается с текстом "Открыть нельзя"... а этот текст вроде как важен..
Спустя 24 минуты, 25 секунд (5.08.2012 - 23:03) killer8080 написал(а):
это
Цитата (Ramzes_Ra @ 5.08.2012 - 22:48) |
$ext = end(explode('.', strtolower($_FILES["filename"]["name"]))); |
заменяем на это
$ext = pathinfo($_FILES["filename"]["name"], PATHINFO_EXTENSION);
Цитата (Ramzes_Ra @ 5.08.2012 - 23:39) |
//считываем содержания файла $fp = fopen($fileName, 'r'); $contents = fread($fp, filesize ($$fileName)); fclose($fp); //чистим от php и html дескрипторов $contents = strip_tags($contents); $fp = fopen($fileName, 'w'); fwrite($fp, $contents); fclose($fp); |
Если речь идет о валидации графических файлов, то здесь лучше всего использовать GD. Это не только защищает от загрузки вредоносного кода, но и не позволит загрузхить поврежденную картинку.
Спустя 40 минут, 14 секунд (5.08.2012 - 23:43) vital написал(а):
Цитата |
ресайз имеджа на те же самые размеры |
не затирает пхп код внутри картинки.
Спустя 12 часов, 29 минут, 9 секунд (6.08.2012 - 12:12) killer8080 написал(а):
Цитата (vital @ 6.08.2012 - 00:43) |
не затирает пхп код внутри картинки. |
Естественно, если картинка невалидная, ресайз средствами GD невозможен в принципе. Семейство функций imagecreatefrom... несможет воссоздать бит мап из поврежденной картинки. Как раз эту её особенность я и предлагал использовать для валидации изображений.
Спустя 1 час, 49 минут, 14 секунд (6.08.2012 - 14:02) Ramzes_Ra написал(а):
Цитата |
Если речь идет о валидации графических файлов, то здесь лучше всего использовать GD |
это как? я нашёл что-то вроде такого http://php.net/manual/ru/ref.image.php, но так и не понял, как мне код поправить..
я ещё добавил одну проверку, однако, с ней почему-то не работает скрипт.. нашёл в нете, поправил под себя.. но толку нет
//проверка mime
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime = finfo_file($finfo, $_FILES['filename']['tmp_name']);
$allow_expansion = array (
"bmp" => "image/bmp",
"gif" => "image/gif",
"ief" => "image/ief",
"jpeg" => "image/jpeg",
"jpg" => "image/jpeg",
"jpe" => "image/jpeg",
"png" => "image/png"
);
if ($mime !== $_FILES['filename']['type']) {
echo 'Ваш файл не прошел проверку';
return false;
} else {
foreach ($allow_expansion as $key => $value) {
if($value == $mime){
if ($key == $exp) {
return true;
}
}
}
$messages[] = 'Ваш файл не прошел проверку';
}
//проверка mime
Спустя 36 минут, 46 секунд (6.08.2012 - 14:38) vital написал(а):
Цитата (killer8080 @ 6.08.2012 - 12:12) | ||
Естественно, если картинка невалидная, ресайз средствами GD невозможен в принципе. Семейство функций imagecreatefrom... несможет воссоздать бит мап из поврежденной картинки. Как раз эту её особенность я и предлагал использовать для валидации изображений. |
Я просто не так понял. Ясно.