|
|
|
| Пересмотрел несколько готовых решений загрузки файлов, интересует только изображений.
Имя изображения и путь будет известно пользователю.
В плане защиты меня смущает 2 момента:
1. прочитанный на хабре, про то, что хацкер может вставить произвольный код в конец изображения через текстовый редактор.
2. Обязательно ли сохранять загруженное изображение с расширением, которое возвращает функция getimagesize()?
А да, еще забыл добавить, в каталоге, где будут храниться изображения добавлю в .htaccess запрет на выполнение php кода.
Вот сам код, соответствует ли он всем критериям защиты?
<?php
/**
* Function of uploaded of a file
* Функция загрузки файла (аплоадер)
* @param int $max_file_size максимальный размер файла в килобайтах
* @param array $valid_extensions массив допустимых расширений
* @param string $upload_dir директория загрузки
* @return array сообщение о ходе выполнения
*
* @author IT studio IRBIS-team (www.irbis-team.com)
* @copyright © 2009 IRBIS-team
*/
function uploadHandle($max_file_size = 100, $valid_extensions = array(), $upload_dir = '.')
{
$error = NULL;
$info = NULL;
$max_file_size *= 1024;
if ($_FILES['userfile']['error'] === UPLOAD_ERR_OK)
{
# проверяем расширение файла
$file_extension = strtolower(pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION));
if (in_array($file_extension, $valid_extensions))
{
# проверяем размер файла
if ($_FILES['userfile']['size'] < $max_file_size)
{
# проверяем, действительно ли загруженный файл является изображением
$imageinfo = getimagesize($_FILES["userfile"]["tmp_name"]);
if ($imageinfo["mime"] == "image/gif" or $imageinfo["mime"] == "image/jpeg" or $imageinfo["mime"] == "image/png")
{
# проверяем ширину и высоту баннера
if ($imageinfo[0] == 468 and $imageinfo[1] == 60)
{
$destination = $upload_dir.'/myname.jpg';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $destination))
$info = 'Баннер успешно загружен';
else
$error = 'Не удалось загрузить баннер';
}
else
$error = 'Баннер должен быть размером 468x60';
}
else
$error = 'Загруженный файл не является изображением';
}
else
$error = 'Размер баннера больше допустимого';
}
else
$error = 'У файла недопустимое расширение';
}
else
{
# массив ошибок
$error_values = array(
UPLOAD_ERR_INI_SIZE => 'Размер файла больше разрешенного директивой upload_max_filesize в php.ini',
UPLOAD_ERR_FORM_SIZE => 'Размер файла превышает указанное значение в MAX_FILE_SIZE',
UPLOAD_ERR_PARTIAL => 'Файл был загружен только частично',
UPLOAD_ERR_NO_FILE => 'Не был выбран файл для загрузки',
UPLOAD_ERR_NO_TMP_DIR => 'Не найдена папка для временных файлов',
UPLOAD_ERR_CANT_WRITE => 'Ошибка записи файла на диск'
);
$error_code = $_FILES['userfile']['error'];
if (!empty($error_values[$error_code]))
$error = $error_values[$error_code];
else
$error = 'Не известная ошибка, сообщите о проблеме администраторам';
}
return array('info' => $info, 'error' => $error);
}
##################################/
$extensions = array('jpg', 'jpeg', 'png', 'gif');
$upload_dir = 'uploads';
# Запускаем функцию
if(!empty($_POST['upload_submit']))
{
$message = uploadHandle(100, $extensions, $upload_dir);
# Выводим сообщение
echo $message['error'] ? $message['error'] : $message['info'];
}
?>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="userfile" />
<input type="submit" value="Закачать" name="upload_submit" />
</form>
|
| |
|
|
|
|
|
|
|
для: Ванек2010
(07.05.2012 в 12:46)
| | По хорошему все загружаемые изображения нужно перерисовывать. Правда к GIF анимации это не применимо (по крайней мере средствами библиотеки GD). Иначе вам вместо графического файла могут подсунуть все что угодно, подменив часть параметров и расширение. При этом даже не суть важно может вирус работать или нет, но если поисковый робот найдет код вируса у вас на сайте, проблемы с поисковиком вам гарантированны.
Перерисовывая изображения вы гарантированно получаете картинку, а не кота в мешке... Загруженный темп файл после этого удаляется и в худшем случае вы получите безопасную пустую белую картинку (если вам попытались загрузить что либо, под видом картинки).
P.S. Да вопрос к экспертам (пишу тут дабы не плодить одинаковых тем), возможно ли как-то проверить, что картинка это картинка белого цвета, без дополнительных оттенков? | |
|
|
|
|
|
|
|
для: Tamplier
(07.05.2012 в 14:54)
| | Gif анимация должна быть, поэтому перерисовка не подходит. Как быть в этом случае? | |
|
|
|
|
|
|
|
для: Ванек2010
(07.05.2012 в 15:05)
| | Есть классы работающие с gif анимацией. Что касается остального, то:
<?
$im = file_get_contents($_FILES['img']['tmp_name'];
If($im = imagecreatefromstring($im)) {
//imagejpeg($im) или imagepng($im) для сохранения
}
|
| |
|
|
|
|
|
|
|
для: confirm
(07.05.2012 в 15:24)
| | Какие классы можешь посоветовать кроме ImageMagick (не понял как установить ее на юникс) и http://forssto.com/gifexample/ он не правильно ресайзит почему-то. | |
|
|
|
|
|
|
|
для: Ванек2010
(07.05.2012 в 17:59)
| | ImageMagick - это не класс, а библиотека. Если еще нечто подобное не знаю, не интересовался, как впрочем самим ImageMagick. | |
|
|
|
|
|
|
|
для: Tamplier
(07.05.2012 в 14:54)
| | А что такое картинка белого цвета? | |
|
|
|
|
|
|
|
для: confirm
(07.05.2012 в 15:19)
| | Просто изображение только белого цвета, чистый белый лист.
Иногда получается если вместо картинки подсунуть что-то другое )))
Тупо картинка где присутствует только один цвет - белый | |
|
|
|
|
|
|
|
для: Tamplier
(07.05.2012 в 15:22)
| | Понятно. Проверить не так сложно, если это изображение на палитре. Если нет, то преобразовать в такое. А дальше прочесть палитру. | |
|
|
|
|
|
|
|
для: confirm
(07.05.2012 в 15:27)
| | Прочесть палитру...?
пример сбросьте | |
|
|
|
|
|
|
|
для: Tamplier
(07.05.2012 в 15:47)
| | http://www.sql.ru/forum/actualthread.aspx?tid=675954 | |
|
|
|