[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Скрипт загрузки аватарок на сервер, оцените, плиз!
vinnie
<?php
//Если форма отправлена
if(isset($_FILES['file']))
{
//Массив ошибок
$error = array();
//Директория для загрузки картинок
$dir = 'upload';
//Имя файла
$file = $_FILES['file']['name'];
//Временная папка
$tmp = $_FILES['file']['tmp_name'];
//Допустимые расширения
$ext = array('jpg','jpeg','gif', 'png', 'bmp');
//Расширение загружаемого файла
$ext2 = strtolower(end(explode('.', $file)));
//Новое имя файла
$new_name = time().'_'.rand(0, 1000).'.'.$ext2;
//Смотрим, есть ли ошибки во время загрузки
if($_FILES['file']['error'] == 0)
{
//Проверяем допустимость расширения загружаемого файла
if(in_array($ext2, $ext))
{
//Проверяем, картинку ли загрузил пользователь
if($imginfo = getimagesize($tmp))
{
//Проверяем ширину и высоту загружаемого файла
if($imginfo[0] < 100 and $imginfo[1] < 100)
{
//Если нету директории для загрузки картинок, создаем на лету
if(!is_dir($dir)) mkdir($dir, 0777);
//Перемещаем картинку в нужную папку
if(move_uploaded_file($tmp, $dir.'/'.$new_name))
$error[] = 'ФАЙЛ УСПЕШНО ЗАГРУЖЕН';
else
$error[] = 'Ошибка: Не удалось загрузить файл';
}
else
$error[] = 'Ошибка: ширина и высота файла не могут быть больше 100 пикселей';
}
else
$error[] = 'Ошибка: вы загружаете не картинку';
}
else
$error[] = 'Ошибка: неверный формат файла';
}
else
{
//Формируем ошибка
switch($_FILES['file']['error'])
{
case 3:
$error[] = 'Ошибка: Файл загружен частично';
break;
case 4:
$error[] = 'Ошибка: Вы не выбрали файл';
break;
}
}


//Выводим ошибки
if(count($error) > 0)
{
foreach($error as $err)
echo '<p>'.$err.'</p>';
}

}

?>



<form action="" method="post" enctype="multipart/form-data">
<input
type="file" name="file" />
<input
type="submit" name="ok" value="Загрузить" />
</form>





Спустя 5 минут, 46 секунд (14.03.2012 - 09:49) Игорь_Vasinsky написал(а):
Цитата
if(isset($_FILES['file']))

если пусто?



Цитата
if($imginfo[0] < 100 and $imginfo[1] < 100)

не достаточно, добавь mime type

Спустя 2 минуты (14.03.2012 - 09:51) vinnie написал(а):
Если пусто

//Формируем ошибка
switch($_FILES['file']['error'])
{
case 3:
$error[] = 'Ошибка: Файл загружен частично';
break;
case 4:
$error[] = 'Ошибка: Вы не выбрали файл';
break;
}

будет ошибка

Спустя 22 минуты, 36 секунд (14.03.2012 - 10:14) m4a1fox написал(а):
vinnie
Проверяйте расширение файлов функцией getimagesize()

Спустя 1 минута, 49 секунд (14.03.2012 - 10:16) vinnie написал(а):
Разве другой формат файла там пройдет?

Спустя 1 минута, 20 секунд (14.03.2012 - 10:17) Игорь_Vasinsky написал(а):
но до этого будет происходить

//Массив ошибок
$error = array();
//Директория для загрузки картинок
$dir = 'upload';
//Имя файла
$file = $_FILES['file']['name'];
//Временная папка
$tmp = $_FILES['file']['tmp_name'];
//Допустимые расширения
$ext = array('jpg','jpeg','gif', 'png', 'bmp');
//Расширение загружаемого файла
$ext2 = strtolower(end(explode('.', $file)));
//Новое имя файла
$new_name = time().'_'.rand(0, 1000).'.'.$ext2;
//Смотрим, есть ли ошибки во время загрузки


для чего - если пусто?


не расширение а mime type, расширение я сам могу написать.

Спустя 22 секунды (14.03.2012 - 10:17) m4a1fox написал(а):
Снимается. Увидел. Красивое решение. Тогда я вообще не понимаю смысл проверять на то, что расширение файла входит в диапазон из массива $ext

Спустя 57 секунд (14.03.2012 - 10:18) m4a1fox написал(а):
Игорь_Vasinsky
Игорь, там есть проверка... smile.gif Я ее в начале тоже не увидел
Цитата

if($imginfo = getimagesize($tmp))

Спустя 2 минуты, 3 секунды (14.03.2012 - 10:20) ADiel написал(а):
Мне не нравится куча вложенных условий. Так же проверять расширение файла из его названия совсем не true.

Спустя 41 секунда (14.03.2012 - 10:21) Игорь_Vasinsky написал(а):
а от туда только
Цитата
if($imginfo[0] < 100 and $imginfo[1] < 100)

используется

Спустя 45 секунд (14.03.2012 - 10:22) m4a1fox написал(а):
ADiel
Цитата
Мне не нравится куча вложенных условий.

Аналогично..... но какой выход тогда?

Спустя 6 секунд (14.03.2012 - 10:22) vinnie написал(а):
ADiel
а откуда надо?)

Спустя 34 секунды (14.03.2012 - 10:22) Игорь_Vasinsky написал(а):
switch )))

Спустя 4 секунды (14.03.2012 - 10:22) vinnie написал(а):
проверки никогда не бывают лишними

Спустя 44 секунды (14.03.2012 - 10:23) vinnie написал(а):
да блин, какая разница, switch, mitch, главное - чтобы код был безопасен и рабочим, а реализация у каждого своя

Спустя 38 секунд (14.03.2012 - 10:24) Игорь_Vasinsky написал(а):
он говорит не про отсутствие, а про вложенность

Спустя 33 секунды (14.03.2012 - 10:24) vinnie написал(а):
mime type или не mime, не картинку загрузить туда не получится... точнее вредоностый код

Спустя 18 секунд (14.03.2012 - 10:25) ADiel написал(а):
m4a1fox, Последовательные проверки с прерыванием в случае ошибки. Можно добавить множество проверок без ущерба коду

Спустя 17 секунд (14.03.2012 - 10:25) vinnie написал(а):
ну вложенность? и че??????

Спустя 51 секунда (14.03.2012 - 10:26) Игорь_Vasinsky написал(а):
m4a1fox
Цитата
Тогда я вообще не понимаю смысл проверять на то, что расширение файла входит в диапазон из массива $ext


форматов картинок оч много - он проверяет чтоб было то что он хочет только.


ТС - да лан, он высказал своё мнение.


Спустя 37 секунд (14.03.2012 - 10:26) ADiel написал(а):
vinnie, Сделаешь красивый код, можешь спокойно менять koder на coder в аватарке

Цитата
ну вложенность? и че??????

Добавь 100 проверок, а потом 3 из разных мест убери. Удобно?

Спустя 35 секунд (14.03.2012 - 10:27) Игорь_Vasinsky написал(а):
Цитата
m4a1fox, Последовательные проверки с прерыванием в случае ошибки. Можно добавить множество проверок без ущерба коду

тем самым - делая код читабельней ИМХО

Цитата
vinnie, Сделаешь красивый код, можешь спокойно менять koder на coder в аватарке

biggrin.gif

Спустя 14 секунд (14.03.2012 - 10:27) vinnie написал(а):
как до coder уровень дойдет, тада и напишу, а пока koder )

Спустя 25 секунд (14.03.2012 - 10:28) m4a1fox написал(а):
vinnie
Цитата

да блин, какая разница, switch, mitch, главное - чтобы код был безопасен и рабочим, а реализация у каждого своя

Цитата

ну вложенность? и че??????

Товарищ, да вы не злитесь... сами код показали, мы его обсуждаем, а вы нервничаете.... зачем. А ведь ребята правы. Много условностей вредят...

ADiel
Цитата

Последовательные проверки с прерыванием в случае ошибки

Так ведь по сути тоже самое, только без else будет, если я правильно понимаю.

Спустя 53 секунды (14.03.2012 - 10:29) m4a1fox написал(а):
Цитата
можешь спокойно менять koder на coder в аватарке

Я даже как-то и не заметил вначале... smile.gif

Спустя 1 минута, 8 секунд (14.03.2012 - 10:30) ADiel написал(а):
function verify($img){
if (!условие) return array(false, "error message");
if (!условие) return array(false, "error message");
.......



return array(true, null);
}


list($error, $message) = verify($_FILES['file']);
if (!$error){
echo $message;

} else {

загружаем файл

}

Спустя 2 минуты, 47 секунд (14.03.2012 - 10:32) m4a1fox написал(а):
ADiel
Цитата

function verify($img){
  if (!условие) return array(false, "error message");
  if (!условие) return array(false, "error message");
.......


  return array(true);
}



Это то понятно..... Это случай, когда мы говорим о функциях, или классах и их методах.... но код ТС, я как бы слово function пропустил или не заметил....

Спустя 28 секунд (14.03.2012 - 10:33) vinnie написал(а):
ТС что такое?)))

Спустя 2 минуты, 47 секунд (14.03.2012 - 10:36) ADiel написал(а):
Цитата
я как бы слово function пропустил или не заметил


Я же не показываю оригинальный код. Я пишу как бы я сделал

Спустя 28 секунд (14.03.2012 - 10:36) Игорь_Vasinsky написал(а):
это ты) ТопикСтартер

Спустя 54 секунды (14.03.2012 - 10:37) vinnie написал(а):
))) ааа

Спустя 1 минута, 12 секунд (14.03.2012 - 10:38) ADiel написал(а):
Товарищ Coder

Спустя 54 секунды (14.03.2012 - 10:39) m4a1fox написал(а):
ADiel
Цитата
Я же не показываю оригинальный код. Я пишу как бы я сделал

А, ну с этим я не спорю.

Спустя 1 минута, 22 секунды (14.03.2012 - 10:41) vinnie написал(а):
А если так?))

<?php
//Если форма отправлена
if(isset($_FILES['file']))
{
//Смотрим, есть ли ошибки во время загрузки
if($_FILES['file']['error'] == 0)
{
//Массив ошибок
$error = array();
//Директория для загрузки картинок
$dir = 'upload';
//Имя файла
$file = $_FILES['file']['name'];
//Временная папка
$tmp = $_FILES['file']['tmp_name'];
//Допустимые расширения
$ext = array('jpg','jpeg','gif', 'png', 'bmp');
//Расширение загружаемого файла
$ext2 = strtolower(end(explode('.', $file)));
//Новое имя файла
$new_name = time().'_'.rand(0, 1000).'.'.$ext2;

//Проверяем допустимость расширения загружаемого файла
if(!in_array($ext2, $ext))
$error[] = 'Ошибка: неверный формат файла';

//Проверяем, картинку ли загрузил пользователь
if(!$imginfo = getimagesize($tmp))
$error[] = 'Ошибка: вы загружаете не картинку';

//Проверяем ширину и высоту загружаемого файла
if($imginfo[0] > 100 and $imginfo[1] > 100)
$error[] = 'Ошибка: Не удалось загрузить файл';

//Если нету директории для загрузки картинок, создаем на лету
if(!is_dir($dir)) mkdir($dir, 0777);
}
else
{
//Формируем ошибка
switch($_FILES['file']['error'])
{
case 3:
$error[] = 'Ошибка: Файл загружен частично';
break;
case 4:
$error[] = 'Ошибка: Вы не выбрали файл';
break;
}
}


//Выводим ошибки
if(count($error) > 0)
{
foreach($error as $err)
echo '<p>'.$err.'</p>';
}
else
{
//Перемещаем картинку в нужную папку
if(move_uploaded_file($tmp, $dir.'/'.$new_name))
echo 'ФАЙЛ УСПЕШНО ЗАГРУЖЕН';
else
echo 'Ошибка: Не удалось загрузить файл';
}

}

?>



Спустя 2 минуты, 31 секунда (14.03.2012 - 10:43) killer8080 написал(а):
Вместо
$ext2 = strtolower(end(explode('.', $file)));

можно просто
$ext2 = strtolower(pathinfo($file, PATHINFO_EXTENSION));

Переменную $error логичней назвать $message, т.к. в ней у тебя не только сообщения об ошибках, но и о успешной отработке.
Второе, нет смысла её делать массивом, по логике твоего кода, там может быть только одно сообщение.
Вместо
		foreach($error as $err)
echo '<p>'.$err.'</p>';

можно так
echo '<p>'.implode('</p><p>', $error).'</p>';

А так в целом нормально.

Спустя 1 минута, 3 секунды (14.03.2012 - 10:44) vinnie написал(а):
killer8080
Спасибо! Хоть кто-то подбодрил!

Спустя 1 минута, 19 секунд (14.03.2012 - 10:45) ADiel написал(а):
vinnie, Плохо. Ты проверяешь размер фото даже, если это не фото.

Спустя 1 минута, 41 секунда (14.03.2012 - 10:47) killer8080 написал(а):
Цитата (vinnie @ 14.03.2012 - 09:41)
А если так?))

а так хуже, лишние проверки, и куча лишних сообщений ошибок.
Если это конечный вариант, и не нужно выводить шаблон страницы, можно было просто ошибку выводить через die()

Спустя 18 секунд (14.03.2012 - 10:47) vinnie написал(а):
А ТАК?

//Проверяем, картинку ли загрузил пользователь
if(!$imginfo = getimagesize($tmp))
$error[] = 'Ошибка: вы загружаете не картинку';
else
{
//Проверяем ширину и высоту загружаемого файла
if($imginfo[0] > 100 and $imginfo[1] > 100)
$error[] = 'Ошибка: Не удалось загрузить файл';
}

Спустя 36 секунд (14.03.2012 - 10:48) vinnie написал(а):
killer8080
ПЕРВЫЙ ВАРИАНТ ЛУЧШЕ?

Спустя 9 минут, 7 секунд (14.03.2012 - 10:57) vinnie написал(а):
ВЗЛОМАТЬ ЭТОТ КОД ПОЛУЧИТСЯ????? БЕЗ САРКАЗМА ТОКА

Спустя 4 минуты, 30 секунд (14.03.2012 - 11:02) ADiel написал(а):
Да ты жжешь.

Спустя 2 минуты, 41 секунда (14.03.2012 - 11:04) killer8080 написал(а):
Цитата (vinnie @ 14.03.2012 - 09:48)
killer8080
ПЕРВЫЙ ВАРИАНТ ЛУЧШЕ?

лучше тем что выводил главную ошибку, а так у тебя будет куча ошибок, где каждая последующая будет следствием предыдущей. Например при загрузке левого файла будет сразу куча сообщений:

Ошибка: неверный формат файла
Ошибка: вы загружаете не картинку
Ошибка: Не удалось загрузить файл


Цитата (vinnie @ 14.03.2012 - 09:57)
ВЗЛОМАТЬ ЭТОТ КОД ПОЛУЧИТСЯ????? БЕЗ САРКАЗМА ТОКА

если нет уязвимостей с инклюдом, то нет.
(Не считая древней дырки ie6 с png файлами, но уже не актульно)

Спустя 1 минута, 56 секунд (14.03.2012 - 11:06) killer8080 написал(а):
Еще не мешало бы делать ресайз, если картинка большая, для юзабельности

Спустя 1 час, 31 минута, 38 секунд (14.03.2012 - 12:38) vinnie написал(а):
killer8080
че за уязвимости с инклюдом? вроде ниче не инклюдю

Спустя 44 минуты, 43 секунды (14.03.2012 - 13:23) killer8080 написал(а):
Цитата (vinnie @ 14.03.2012 - 11:38)
killer8080
че за уязвимости с инклюдом? вроде ниче не инклюдю

Я о том, что если у тебя где то в скриптах есть такая уязвимость, то в комбинации с этим скриптом загрузки, будет уже реальная уязвимость. Можно будет залить шел.
Ты же не проверяешь загруженный файл на наличие внедренных скриптов.

Спустя 7 минут, 9 секунд (14.03.2012 - 13:30) vinnie написал(а):
include 'db.php';
ты ж не про этот инклюд?

Спустя 50 секунд (14.03.2012 - 13:31) vinnie написал(а):
а на наличие чего нужно проверить файл? там много всего, наверное.
или существует минимальная проверка какая-то

Спустя 6 минут, 5 секунд (14.03.2012 - 13:37) killer8080 написал(а):
Цитата (vinnie @ 14.03.2012 - 12:30)
include 'db.php';
ты ж не про этот инклюд?

Нет, я про уязвимости вида
include 'path/'.$_GET['page'];


В граф. файле можно подсунуть php код, а через уязвимость инклюдов, его запустить.
Я не говорю что у тебя есть такая уязвимость, но если есть, то в комбинации получится дыра.



Спустя 4 минуты, 1 секунда killer8080 написал(а):
getimagesize совершенно бесполезна для безопасности, проверить валидность картинки можно GD функциями imagecreatefrom...()
Если делаешь ресайз, то в любом случае их используешь.

Спустя 27 минут, 55 секунд (14.03.2012 - 14:05) m4a1fox написал(а):
killer8080
Цитата
getimagesize совершенно бесполезна для безопасности

Почему?

Спустя 33 минуты, 7 секунд (14.03.2012 - 14:38) alex12060 написал(а):

Спустя 19 минут, 4 секунды (14.03.2012 - 14:57) vinnie написал(а):
Товарищи, где тогда код загрузки файлов, который безопасен на все 100???????? существует ли он??????

Спустя 17 минут, 1 секунда (14.03.2012 - 15:14) Игорь_Vasinsky написал(а):
по ссылке на хабре чёт муть.

это не поможет
то не поможет

getimagesize() mime - пропустить скрипт в картинке

Самое нужное - проверит регуляркой расширение - и всё будет ок blink.gif бред какой то.


Ни кто не говорил что расширение проверять не надо, я сказал что этого не достаточно + mime type, ну по пути $_FILES type

Спустя 3 минуты, 18 секунд (14.03.2012 - 15:17) vinnie написал(а):
в натуре там вообще ничего не помогает, если у них спросить)

Спустя 1 минута, 24 секунды (14.03.2012 - 15:18) vinnie написал(а):
давайте тогда раз и навсегда определим.... какие функции нужны для безопасности при загрузке файлов... то есть что и как проверять... убрав все лишнее

Спустя 22 минуты, 30 секунд (14.03.2012 - 15:41) Игорь_Vasinsky написал(а):
НЕ ДАВАТЬ ГРУЗИТЬ ВООБЩЕ НИ ЧЕГО. Пусть на мыло отсылают, сам проверяешь, потом грузишь.

Спустя 2 минуты, 33 секунды (14.03.2012 - 15:43) vinnie написал(а):
верно говоришь! а если по теме?

Спустя 1 минута, 35 секунд (14.03.2012 - 15:45) Игорь_Vasinsky написал(а):
Цитата
Ни кто не говорил что расширение проверять не надо, я сказал что этого не достаточно + mime type, ну по пути $_FILES type

Спустя 1 минута, 15 секунд (14.03.2012 - 15:46) vinnie написал(а):
getimagesize

потом $_FILES['file']['type'] != image/jpg и так далее?

Спустя 1 минута, 46 секунд (14.03.2012 - 15:48) Игорь_Vasinsky написал(а):
расширение + наличие одной точки в имени файла

Спустя 32 секунды (14.03.2012 - 15:49) vinnie написал(а):
регулярка?

Спустя 1 минута, 52 секунды (14.03.2012 - 15:50) vinnie написал(а):
просто я бы хотел поставить ЖИРНУЮ ТОЧКУ в этой теме... пока что сыровато

Спустя 7 минут, 30 секунд (14.03.2012 - 15:58) Игорь_Vasinsky написал(а):
  $image = 'http://hack.net/hack.php.png';

$image = str_replace('/', '', $image);

if(substr_count("hack.php.png1", ".")>1)
echo 'ALARMA #1 !!!<br />';

if(!preg_match("#.*\.(png|jpg|bmp|jpeg)$#iu", $image))
echo 'ALARMA #2 !!!<br />';

echo $image;


+ getimagesize() mime

Спустя 1 минута, 29 секунд (14.03.2012 - 15:59) vinnie написал(а):
Спасибо, братка!

Спустя 1 минута, 23 секунды (14.03.2012 - 16:01) Игорь_Vasinsky написал(а):
99% нуйдётся чел - скаже фуфло всё это laugh.gif

по мне так - достаточно.

Спустя 23 секунды (14.03.2012 - 16:01) vinnie написал(а):
как же без этого))))))

Спустя 57 секунд (14.03.2012 - 16:02) vinnie написал(а):
а in_array и так далее.. это все лишнее?

Спустя 1 час, 46 минут, 37 секунд (14.03.2012 - 17:49) killer8080 написал(а):
Цитата (Игорь_Vasinsky @ 14.03.2012 - 15:01)
99% нуйдётся чел - скаже фуфло всё это  :lol:

по мне так - достаточно.

И этим челом буду я user posted image

1. Расширение достаточно проверять с помощью pathinfo() и не нужно так извращаться. Имя файла script.php.png никакой угрозы не представляет.

2. getimagesize() можно, и нужно использовать для определения майм типа, но не более того. Так как эта функция просто читает заголовки файла, и её легко обмануть, тупо дописав в конец файла картинки свой скрипт. Это проверено user posted image
Применительно к загрузке изображений, надежный способ валидации картинки функции GD, об этом я уже говорил, imagecreatefromjpeg(), imagecreatefromgif(), imagecreatefrompng(). Если им подсунуть левый файл, или просто поврежденную картинку, они возвращают false. Никакие скрипты не пройдут. Например так
if(!$mime = getimagesize($_FILES['file']['tmp_name']))
die('file is not an image');
list(, $mime) = explode('/', $mime['mime']);
$func = 'imagecreatefrom'.$mime;
if(!function_exists($func))
die('unsupported file format');
if($im = $func($_FILES['file']['tmp_name']))
imagedestroy($im);
else
die('image file is damaged');


3. если оригинальное название файла сохраняется, нужно пропускать его через basename(), чтоб хакер не смог манипулировать путями.

Ну так навскидку user posted image

Спустя 12 минут, 24 секунды (14.03.2012 - 18:01) Игорь_Vasinsky написал(а):
Цитата
imagecreatefromjpeg(), imagecreatefromgif(), imagecreatefrompng()

Блин.. я помню что как то речь шла о функция для работы с картинками.. забыл совсем
Цитата
Расширение достаточно проверять с помощью pathinfo()

согласен полностью.
Цитата
. если оригинальное название файла сохраняется, нужно пропускать его через basename()


Цитата
$image = str_replace('/', '', $image);


всё так. просто твои "рычажки" по продвинутей)

Спустя 14 часов, 24 минуты, 37 секунд (15.03.2012 - 08:26) Guest написал(а):
А что будет, если пропустить через basename?Почему хакер не сможет манипулировать путями?

Спустя 1 минута, 59 секунд (15.03.2012 - 08:28) Игорь_Vasinsky написал(а):
Цитата
basename — Возвращает последний компонент имени из указанного пути

Спустя 12 минут, 52 секунды (15.03.2012 - 08:41) Guest написал(а):
Опять не то, да?

//Если форма отправлена
if(isset($_FILES['file']))
{
//Имя загружаемого файла
$file = $_FILES['file']['name'];
//Временное хранение
$tmp = $_FILES['file']['tmp_name'];
//Ошибки
$error = $_FILES['file']['error'];
//Получаем расширение загружаемого файла
$ext = pathinfo($file, PATHINFO_EXTENSION);
//Допустимые расширения
$ext2 = array('jpg', 'jpeg', 'gif');
//Вывод эрроров
if($error != 0)
{
switch($error)
{
case 1: echo 'Файл большой'; break;
case 2: echo 'Файл большой'; break;
case 1: echo 'Частичная загрузка'; break;
case 4: echo 'Файла нет'; break;
}
}

else
{
if(!in_array($ext, $ext2))
echo 'Не тот формат файла';
else
{
if(!$mime = getimagesize($tmp))
echo 'Вы загружаете не картинку';
list(, $mime) = explode('/', $mime['mime']);
$func = 'imagecreatefrom'.$mime;
if(!function_exists($func))
echo 'unsupported file format';
}

}
}


Спустя 7 минут, 30 секунд (15.03.2012 - 08:48) Игорь_Vasinsky написал(а):
да кажется порядок.

тока

if(isset($_FILES['file']['tmp_name']) AND !empty(isset($_FILES['file']['tmp_name']))


или

if($_FILES['file']['tmp_name'])

Спустя 14 минут, 24 секунды (15.03.2012 - 09:03) Guest написал(а):
Вместо If/Else лучше использовать в данном случае Try/Catch ?

Спустя 1 минута, 39 секунд (15.03.2012 - 09:04) Игорь_Vasinsky написал(а):
зачем? условие это условие, обработка исключений это другое http://on-line-teaching.com/php/struct.exc.htm

Спустя 1 минута, 48 секунд (15.03.2012 - 09:06) Guest написал(а):
слушай, а ты платными уроками php не занимаешься?) удаленное обучение, например)

Спустя 4 минуты, 40 секунд (15.03.2012 - 09:11) Игорь_Vasinsky написал(а):
неееттт. - это к твину или инпосту.

Спустя 53 минуты, 17 секунд (15.03.2012 - 10:04) twin написал(а):
Цитата (Игорь_Vasinsky @ 15.03.2012 - 05:48)
да кажется порядок.

тока

if(isset($_FILES['file']['tmp_name']) AND !empty(isset($_FILES['file']['tmp_name']))


или

if($_FILES['file']['tmp_name'])

!empty(isset($_FILES['file']['tmp_name']))
?????????????? Проверять нужно хотя бы, если не уверен на все 100.

Нормальный скрипт. Из мелочей мог бы посоветовать дефолтное сообщение, плана "случилась какая-то неопознанная шняга". А так вполне годно.

Спустя 2 минуты, 22 секунды (15.03.2012 - 10:06) vinnie написал(а):
Именно последний вариант годен? или начальный?)))

Спустя 4 минуты, 47 секунд (15.03.2012 - 10:11) twin написал(а):
Последний.

UPD
Вот эта проверка весьма оригинальна:
			list(, $mime) = explode('/', $mime['mime']);
$func = 'imagecreatefrom'.$mime;
if(!function_exists($func))
echo 'unsupported file format';

Я не вдавался в подробности, может потом используется эта функция... Но как то странно...

Спустя 5 минут, 43 секунды (15.03.2012 - 10:17) vinnie написал(а):
Мне тут посоветовали её...

Спустя 16 минут, 35 секунд (15.03.2012 - 10:33) twin написал(а):
Я же говорю - не вдавался в подробности. Есть способ защиты, когда загруженная в карантин картинка переносится к месту дислокации графической библиотекой (например GD). Это самый надежный на сегодня способ. Но как понял у тебя только начало, ты просто таким извратным способом проверяешь mime

Спустя 1 минута, 14 секунд (15.03.2012 - 10:35) vinnie написал(а):
а можете посоветовать не извратный способ?

Спустя 3 минуты, 46 секунд (15.03.2012 - 10:38) twin написал(а):
А проверять mime вообще нет никакого смысла. Достаточно расширения. Если файл загружен с нормальным расширением, он не может представлять опасности. Ну если только не обращаться к нему напрямую. Другое дело могут накидать мусора под видом картинок. Но и mime тогда подделать - пара пустяков. от мусора спасает только способ, что я описал выше.

Спустя 2 минуты, 51 секунда (15.03.2012 - 10:41) vinnie написал(а):
Вот так?

//Получаем расширение загружаемого файла
$ext = pathinfo($file, PATHINFO_EXTENSION);
/
Допустимые расширения
$ext2 = array('jpg', 'jpeg', 'gif');

if(!in_array($ext, $ext2))
echo 'Не тот формат файла';


а потом уже проверять с помощью imagecreafromjpeg и т.д. верно?

Спустя 3 минуты, 49 секунд (15.03.2012 - 10:45) twin написал(а):
Да, только png забыл. И не проверять, а именно переносить. Это разные вещи.
UPD
Хотя... Можно и проверить. Наверное даже лучше, качество меньше пострадает. Только тогда придется удалять загруженный файл, если он не прошел проверку.

Спустя 1 минута, 25 секунд (15.03.2012 - 10:47) vinnie написал(а):
если imagecreafromjpeg вернет true, то переносить, иначе бить тревогу, что это не картинка?

Спустя 14 минут, 40 секунд (15.03.2012 - 11:01) vinnie написал(а):
Я на верном пути?)


if(!in_array($ext, $ext2))
echo 'Не тот формат файла';
else
{
switch($ext)
{
case 'jpg': $im = imagecreatefromjpeg($tmp);break;
case 'gif': $im = imagecreatefromgif($tmp);break;
case 'png': $im = imagecreatefrompng($tmp);break;
}

if(!$im)
echo 'Вы загружаете не фото';
}

Спустя 2 часа, 23 минуты, 1 секунда (15.03.2012 - 13:24) vinnie написал(а):
Дополнил код... сделал ресайз...
Бред или как?
if(!in_array($ext, $ext2))
echo 'Не тот формат файла';
else
{
switch($ext)
{
case 'jpg': $im = imagecreatefromjpeg($tmp);break;
case 'gif': $im = imagecreatefromgif($tmp);break;
case 'png': $im = imagecreatefrompng($tmp);break;
}
//Проверяем, картинки ли загружена
if(!$im)
echo 'Вы загружаете не фото';
else
{
//Ширина и высота загруженного файла
$w = imagesx($im);
$h = imagesy($im);
//Если размеры картинки меньше 100x100, ругаемся
if($w > 99 and $h > 99)
{
if(move_uploaded_file($tmp, 'upload/'.time().'.'.$ext))
{
//////////////РЕСАЙЗ////////////////
$new = imagecreatetruecolor(100, 100);
imagecopyresampled($new, $im, 0,0,0,0, 100, 100, $w, $h);
switch($ext)
{
case 'jpg': imagejpeg($new, 'upload/mini/'.time().'.'.$ext, 100);break;
case 'gif': imagegif($new, 'upload/mini/'.time().'.'.$ext, 100);break;
case 'png': imagepng($new, 'upload/mini/'.time().'.'.$ext, 9);break;
}
imagedestroy($new);
echo 'Файл успешно загружен!';
}
else
echo 'Не удалось загрузить файл';
}
else
echo 'Ваша картинка слишком мелкая';
}
}


Спустя 10 часов, 45 минут, 26 секунд (16.03.2012 - 00:10) killer8080 написал(а):
Цитата (twin @ 15.03.2012 - 09:11)
Последний.

UPD
Вот эта проверка весьма оригинальна:
  	list(, $mime) = explode('/', $mime['mime']);
  $func = 'imagecreatefrom'.$mime;
  if(!function_exists($func))
    echo 'unsupported file format';

Я не вдавался в подробности, может потом используется эта функция... Но как то странно...

Там был смысл как раз в валидации содержимого картинки, а не проверка майм типа. Но эту, главную часть он выкинул. :)

Спустя 3 минуты, 13 секунд (16.03.2012 - 00:13) killer8080 написал(а):
Цитата (vinnie @ 15.03.2012 - 12:24)
Дополнил код... сделал ресайз...
Бред или как?
if(!in_array($ext, $ext2))
echo 'Не тот формат файла';
else
{
switch($ext)
{
  case 'jpg': $im = imagecreatefromjpeg($tmp);break;
  case 'gif': $im = imagecreatefromgif($tmp);break;
  case 'png': $im = imagecreatefrompng($tmp);break;
}
//Проверяем, картинки ли загружена
if(!$im)
  echo 'Вы загружаете не фото';
else
{
  //Ширина и высота загруженного файла
  $w = imagesx($im);
  $h = imagesy($im);
  //Если размеры картинки меньше 100x100, ругаемся
  if($w > 99 and $h > 99)
  {
  if(move_uploaded_file($tmp, 'upload/'.time().'.'.$ext))
  {
    //////////////РЕСАЙЗ////////////////   
    $new = imagecreatetruecolor(100, 100);
    imagecopyresampled($new, $im, 0,0,0,0, 100, 100, $w, $h);
    switch($ext)
    {
        case 'jpg': imagejpeg($new, 'upload/mini/'.time().'.'.$ext, 100);break;
        case 'gif': imagegif($new, 'upload/mini/'.time().'.'.$ext, 100);break;
        case 'png': imagepng($new, 'upload/mini/'.time().'.'.$ext, 9);break;
    }
    imagedestroy($new);
    echo 'Файл успешно загружен!';
  }
  else
      echo 'Не удалось загрузить файл';
  }
  else
      echo 'Ваша картинка слишком мелкая';   
}
}


Еще нужно приводить расширения к нижнему регистру, и пропустил расширение .jpeg
Да, и пропорции у тебя не соблюдаются, при ресайзе. Не есть гуд.

Спустя 14 минут, 36 секунд (16.03.2012 - 00:27) vinnie написал(а):
Доработать пропорции вроде не проблема.
Мне важно знать, годен ли мой код, если я его доработаю... по мелочам... безопасен ли он

Спустя 25 минут, 42 секунды (16.03.2012 - 00:53) killer8080 написал(а):
Цитата (vinnie @ 15.03.2012 - 23:27)
Доработать пропорции вроде не проблема.
Мне важно знать, годен ли мой код, если я его доработаю... по мелочам... безопасен ли он

Да, вполне smile.gif


_____________
Меньше теории, больше практики...
Быстрый ответ:

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