<?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()
Проверяйте расширение файлов функцией getimagesize()
Спустя 1 минута, 49 секунд (14.03.2012 - 10:16) vinnie написал(а):
Разве другой формат файла там пройдет?
Спустя 1 минута, 20 секунд (14.03.2012 - 10:17) Игорь_Vasinsky написал(а):
но до этого будет происходить
для чего - если пусто?
не расширение а mime type, расширение я сам могу написать.
//Массив ошибок
$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
Игорь, там есть проверка... Я ее в начале тоже не увидел
Игорь, там есть проверка... Я ее в начале тоже не увидел
Цитата |
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 в аватарке |
Спустя 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 в аватарке |
Я даже как-то и не заметил вначале...
Спустя 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 написал(а):
Вместо
можно просто
Переменную $error логичней назвать $message, т.к. в ней у тебя не только сообщения об ошибках, но и о успешной отработке.
Второе, нет смысла её делать массивом, по логике твоего кода, там может быть только одно сообщение.
Вместо
можно так
А так в целом нормально.
$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 - пропустить скрипт в картинке
Самое нужное - проверит регуляркой расширение - и всё будет ок бред какой то.
Ни кто не говорил что расширение проверять не надо, я сказал что этого не достаточно + mime type, ну по пути $_FILES type
это не поможет
то не поможет
getimagesize() mime - пропустить скрипт в картинке
Самое нужное - проверит регуляркой расширение - и всё будет ок бред какой то.
Ни кто не говорил что расширение проверять не надо, я сказал что этого не достаточно + 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 и так далее?
потом $_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% нуйдётся чел - скаже фуфло всё это
по мне так - достаточно.
по мне так - достаточно.
Спустя 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: по мне так - достаточно. |
И этим челом буду я
1. Расширение достаточно проверять с помощью pathinfo() и не нужно так извращаться. Имя файла script.php.png никакой угрозы не представляет.
2. getimagesize() можно, и нужно использовать для определения майм типа, но не более того. Так как эта функция просто читает заголовки файла, и её легко обмануть, тупо дописав в конец файла картинки свой скрипт. Это проверено
Применительно к загрузке изображений, надежный способ валидации картинки функции 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(), чтоб хакер не смог манипулировать путями.
Ну так навскидку
Спустя 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
Вот эта проверка весьма оригинальна:
Я не вдавался в подробности, может потом используется эта функция... Но как то странно...
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 написал(а):
Вот так?
а потом уже проверять с помощью imagecreafromjpeg и т.д. верно?
//Получаем расширение загружаемого файла
$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
Хотя... Можно и проверить. Наверное даже лучше, качество меньше пострадает. Только тогда придется удалять загруженный файл, если он не прошел проверку.
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']); Я не вдавался в подробности, может потом используется эта функция... Но как то странно... |
Там был смысл как раз в валидации содержимого картинки, а не проверка майм типа. Но эту, главную часть он выкинул. :)
Спустя 3 минуты, 13 секунд (16.03.2012 - 00:13) killer8080 написал(а):
Цитата (vinnie @ 15.03.2012 - 12:24) |
Дополнил код... сделал ресайз... Бред или как? if(!in_array($ext, $ext2)) |
Еще нужно приводить расширения к нижнему регистру, и пропустил расширение .jpeg
Да, и пропорции у тебя не соблюдаются, при ресайзе. Не есть гуд.
Спустя 14 минут, 36 секунд (16.03.2012 - 00:27) vinnie написал(а):
Доработать пропорции вроде не проблема.
Мне важно знать, годен ли мой код, если я его доработаю... по мелочам... безопасен ли он
Мне важно знать, годен ли мой код, если я его доработаю... по мелочам... безопасен ли он
Спустя 25 минут, 42 секунды (16.03.2012 - 00:53) killer8080 написал(а):
Цитата (vinnie @ 15.03.2012 - 23:27) |
Доработать пропорции вроде не проблема. Мне важно знать, годен ли мой код, если я его доработаю... по мелочам... безопасен ли он |
Да, вполне
_____________
Меньше теории, больше практики...