[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Неправильная загрузка аватарки
Xsoo
Здравствуйте! Есть скрипт загрузки аватарки на сайт:

<?php
error_reporting();
session_start();
header("Content-Type: text/html; charset=utf-8");

$max_image_width = 380;
$max_image_height = 600;
$max_image_size = 64 * 1024;
$valid_types = array("gif", "jpg", "png", "jpeg");

if (isset($_FILES["userfile"]))
{
if (is_uploaded_file($_FILES['userfile']['tmp_name']))
{
$filename = $_FILES['userfile']['tmp_name'];
$ext = substr($_FILES['userfile']['name'], 1 + strrpos($_FILES['userfile']['name'], "."));
if (filesize($filename) > $max_image_size)
{
echo 'Error: Размер файла > 64K.';
}
elseif (!in_array($ext, $valid_types))
{
echo 'Error: Неверный тип файла.';
}
else
{
$size = GetImageSize($filename);
if (($size) && ($size[0] < $max_image_width) && ($size[1] < $max_image_height))
{
if (@move_uploaded_file($filename, "./images/users/avatars/"))
{
echo 'Файл успешно загружен.';
}
else
{
echo 'Error: передача файла вызвала ошибку.';
}
}

else
{
echo 'Error: Неверные настройки картинки.';
}
}
}

else
{
echo "Error: пустой файл.";
}
}

else
{
echo '
<form enctype="multipart/form-data" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="64000" />
Отправьте аватарку: <input name="userfile" type="file" />
<input type="submit" />
</form>'
;
}


В большей части случаев скрипт выдает ошибку - пустой файл(иногда выдает Error: Неверные настройки картинки.) Но еще ни разу он не загрузил файл на сайт.
Помогите, пожалуйста, скрипт очень нужен!
Заранее спасибо.



Спустя 3 часа, 21 минута, 47 секунд (15.08.2011 - 19:08) sebastjan написал(а):
А на стороне сервера установлен разрешонный размер получения файла?
По идеи есть уязвимость, нет проверки на формат по MIME
под картинкой можно загнать пхп скрипт и он будет выполнен.
Надо формат по MIME проверять.
Я ресайз делаю этой функцией.

/***********************************************************************************
Функция img_resize(): генерация thumbnails
Параметры:
$src - имя исходного файла
$dest - имя генерируемого файла
$width, $height - ширина и высота генерируемого изображения, в пикселях
Необязательные параметры:
$rgb - цвет фона, по умолчанию - белый
$quality - качество генерируемого JPEG, по умолчанию - максимальное (100)
***********************************************************************************/

function img_resize($src, $dest, $width, $height, $rgb=0xFFFFFF, $quality=100)
{
if (!file_exists($src)) return false;
$size = getimagesize($src);
if ($size === false) return false;
// Определяем исходный формат по MIME-информации, предоставленной
// функцией getimagesize, и выбираем соответствующую формату
// imagecreatefrom-функцию.

$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
$icfunc = "imagecreatefrom" . $format;
if (!function_exists($icfunc)) return false;
$x_ratio = $width / $size[0];
$y_ratio = $height / $size[1];
$ratio = min($x_ratio, $y_ratio);
$use_x_ratio = ($x_ratio == $ratio);
$new_width = $use_x_ratio ? $width : floor($size[0] * $ratio);
$new_height = !$use_x_ratio ? $height : floor($size[1] * $ratio);
$new_left = $use_x_ratio ? 0 : floor(($width - $new_width) / 2);
$new_top = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);
$isrc = $icfunc($src);
$idest = imagecreatetruecolor($width, $height);
imagefill($idest, 0, 0, $rgb);
imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0,
$new_width, $new_height, $size[0], $size[1]);
imagejpeg($idest, $dest, $quality);
imagedestroy($isrc);
imagedestroy($idest);
return true;
}


Спустя 19 минут, 32 секунды (15.08.2011 - 19:28) neadekvat написал(а):
Цитата (sebastjan @ 15.08.2011 - 20:08)
Надо формат по MIME проверять.

Нет, изображение лучше просто пересоздавать.

Спустя 3 часа, 14 минут, 5 секунд (15.08.2011 - 22:42) sebastjan написал(а):
Ну так в скрипте выше это и происходит, файл загруженный пересоздаёться.

Спустя 12 минут, 25 секунд (15.08.2011 - 22:54) neadekvat написал(а):
sebastjan, в твоем - да. Я ж автору отвечал smile.gif

Спустя 18 минут, 19 секунд (15.08.2011 - 23:13) sebastjan написал(а):
Спасибо neadekvat , сподвинул меня ещё рах хабр печитать, нашол для себя ещё интересноё, в коментах пишут что на уровне сервера nginx можно защиту организовать.

Спустя 12 часов, 8 минут, 50 секунд (16.08.2011 - 11:21) Xsoo написал(а):
Спасибо, neadekvat! И меня вы сподвигнули к прочтению информации об этом) Просто это был готовый скрипт, который я немного изменил.

Спустя 1 минута, 31 секунда (16.08.2011 - 11:23) alex12060 написал(а):
Цитата
Нет, изображение лучше просто пересоздавать.


А по мне, проще проверить миме и если не подходит, выкидывать, а не делать лишние телодвижения при создании, ресурсы.

Спустя 1 минута, 26 секунд (16.08.2011 - 11:24) neadekvat написал(а):
Цитата (alex12060 @ 16.08.2011 - 12:23)
А по мне, проще проверить миме и если не подходит, выкидывать, а не делать лишние телодвижения при создании, ресурсы.

MIME таки можно подделать, а вот если ты пересоздаешь изображение - то переносится только информация о самом изображении, вся остальная информация остается неудел (в том числе фотоаппарат и прочие доп. поля), так что если туда даже кто-то запихал скрипт - им уже нельзя будет воспользоваться, т.к. его тупо не будет в изображении.

Спустя 12 минут, 48 секунд (16.08.2011 - 11:37) alex12060 написал(а):
Ах да, точно, я и забыл про подделку. Ладно, извиняюсь smile.gif
Быстрый ответ:

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