[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: загрузка картинок на сервер
Ramzes_Ra
По теме загрузки картинок на сервер в интернете и в книгах очень много описано, начиная с
 <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)
думаю, что если я буду писать сам, то уязвимости точно будут..

конечно пиши сам, и выкладывай код здесь. Будем обсуждать. Это единственный способ научится программировать. На чужой код не надейся, он то же не застрахован от уязвимостей wink.gif

Спустя 4 часа, 59 минут, 6 секунд (5.08.2012 - 21:48) Ramzes_Ra написал(а):
Эврика) я разбираюсь постепенно со второй проблемой.. вот обработчик загрузки картинки, форму думаю не надо..
есть 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)
Цитата (vital @ 6.08.2012 - 00:43)
не затирает пхп код внутри картинки.


Естественно, если картинка невалидная, ресайз средствами GD невозможен в принципе. Семейство функций imagecreatefrom... несможет воссоздать бит мап из поврежденной картинки. Как раз эту её особенность я и предлагал использовать для валидации изображений.

Я просто не так понял. Ясно.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.