Загрузка файлов на сервер

Royal Flash

-=MaestrO=-
Здравствуйте.

После загрузки изображения на сервер проверяется, не превышает ли оно определенные высоту и ширину. Если нет, то просто копируется, если да, то изменяются размеры изображения и оно записывается на диск (в этом случае загруженный файл вообще не переносится ни copy, ни move_uploaded_file). Внимание, вопросы :)
Можно ли просто копировать функцией copy временный файл в необходимую директорию? Отличие между move_uploaded_file и copy только в том, что move_uploaded_file удаляет копируемый файл? На сколько я понимаю, временная директория PHP очищается автоматически (есть ли настройки указывающие на то, сколько времени хранится загруженный файл)?
Для проверки изображений (поддерживаемый формат и т.п.) я использую путь к временному файлу, и если проверка пройдена, переношу файл в нужную директорию, если нет - ничего с этим файлом не делаю (надеюсь на то, что временная директория PHP очищается автоматически).
 

DiMA

php.spb.ru
Команда форума
1. пойди сам проверь - удаляется оно или нет (это быстрее, чем пост писать)
2. удаляй руками, хуже не будет
3. move_uploaded_file придумана не для того, чтобы тебе облегчить удаление
4. файлы картинок рекомендую конвертить всегда, в них может быть шеллкод
 

AmdY

Пью пиво
Команда форума
Royal Flash
copy и move_uploaded_file разные функции, первую при аплоде файлов использовать нельзя. Работать с тем, что в tmp_name тоже нельзя, копируй к себе обрабатывай, если нужно удаляй
http://php.net/move_uploaded_file
 

Royal Flash

-=MaestrO=-
Для DiMA

2. удаляй руками, хуже не будет
согласен, на всякий случай лишний unlink() не помешает

4. файлы картинок рекомендую конвертить всегда, в них может быть шеллкод
Вариант с шелом возможен. Чтобы этого не допустить я:

а) всегда присваиваю файлу расширение исходя из белого списка (jpg, gif etc) Тип файла - только из getimagesize()
б) для папки, где лежат изображения, ставлю .htaccess, который разрешает доступ только к фалам с определенным разрешением
<FilesMatch ".(gif|GIF|jpg|JPG|jpeg|JPEG)$">
Order Allow,Deny
Allow from all
</FilesMatch>
Хотя .htaccess это как дополнительная мера безопасности - пункта А вполне достаточно для предотврвщения запуска шела из граф. файла. Также погуглив на тему, что ресайз изображения прибивает шел-код в файле, нашел много информации, что это не всегда так. Поэтому - зачем нагружать сервер не дающей 100% результат работой? Вот, кстати, не плохой и понятный материал по теме безопасной загрузки изображений:
http://habrahabr.ru/blogs/php/44610/
http://habrahabr.ru/blogs/php/44615/

Для AmdY
Вот если бы вы поделились инфой почему нельзя использовать copy() ?! Я запускаю у себя на сервере - и у меня это можно. И я не вижу логической причины почему нельзя. Хотя, конечно, это не значит, что я прав :) В гугле я нашел множество отзывов по этой теме: нельзя, нельзя, нельзя... но вот, к сожалению, ни кто не написал почему? Возможно некоторые хостеры не дают такой возможности (safe mode, etc) или что-то еще?
И не могли бы вы пояснить, почему нельзя работать с временным файлом? Т.е. по вашей логике, мне нужно скопировать любой файл в другую временную папку (а он как-раз может оказаться и скриптом и т.п.), проверить его, и уже оттуда удалить его вручную. Мне кажется, что это лишняя работа. Причем таким образом у меня работает несколько проектов, позволяющих загрузку изображений пользователям - и никаких проблем с безопастностью в течении 3-4 лет не было (каждый день обрабатывается более 100 изображений).
 

Вурдалак

Продвинутый новичок
Я запускаю у себя на сервере - и у меня это можно
— если тебе наплевать на переносимость кода (да, не везде тебе разрешат напрямую с временным файлом работать), то явное отличие move_uploaded_file() от copy() в том, что она не копирует, а перемещает файл. Чувствуешь разницу? Разумнее сравнивать move_uploaded_file() и rename().
 

AmdY

Пью пиво
Команда форума
Royal Flash
ты хоть представлешь как меня задолбало ходить самому по ссылкам, которые даю другим. но вот так каждый раз, хожу, перечытываю и убеждаюсь, что послал правильно, там всё написано.
 

Royal Flash

-=MaestrO=-
Для Вурдалак
Спасибо - перечитав мануал (надо признать, не без помощи AmdY) по move_uploaded_file() нашел таки подтверждение ваших слов. сopy() я использую потому, что в некоторых ситуациях из 1-ой (большой) картинки мне необходимо сделать 2 маленьких с разными размерами. Не делать же 1 jpeg а из него 2-ой - качество то не резиновое... Что касается переносимости, то тут, конечно, только move_uploaded_file(), причем (как советовал AmdY) прийдется создавать другое временное хранилище файлов. Ресурсоемко, но зато работает на большинстве хостингов.

Для AmdY
Ваши ответы хоть и содержат намек на то, что нужно, но логика: "Делай так, потому что это я сказал" не впечатляет. Я вас не знаю, и поэтому у меня нет оснований верить вам на слово.
 

AmdY

Пью пиво
Команда форума
дело скорее в секьюрности, unix админы на шаред хостингах как правило не шибко умные и /tmp у них общая для всех. кстати, проверять расширение тоже не есть гуд, нужно файлы принудительно переименовывать, а лучше даже следовать совету 4 от DiMA.
 

Вурдалак

Продвинутый новичок
принудительно переименовывать
— более точно: генерировать новое имя, невзирая на старое.

а лучше даже следовать совету 4 от DiMA.
— он поможет от избавления от всякой гадости в «хвосте» картинки и поможет определить, что это вообще не битый файл. Полагаться на то, что файл не нанесёт вред при интерпретировании как PHP-файл, нельзя, естественно.
 

Royal Flash

-=MaestrO=-
Для AmdY
Если информация секретная - согласен, чем больше препятствий на пути у хакера тем надежнее. Тогда, если есть возможность, необходимо вообще определить свою личную tmp директорию. Также можно спрятать их в директорию закрытую deny from all и выдавть только скриптом.

Если же это фото, которые пользователь может увидеть после загрузки - то какой смысл их переименовывать? Мне же нужны оригинальные имена файлов - для оптимизации лучше, когда название фотки определяет ее содержание. А по поводу совета 4 от DiMA я написал выше. Да и не расширения нужно проверять, конечно, а mime, который выдает getimagesize(), и уже на основании этого присваивать доступному для пользователей фалу расширение или удалять его, с занесением в личное дело :). Ведь если нет доступа к созданию/редактированию .htaccess скрипт из картинки никогда и не запустится - я еще не встречал хостингов, где файлы с расширением .jpg и др. графических форматов по умолчанию обрабатываются как скрипты.
 

DiMA

php.spb.ru
Команда форума
> 4. файлы картинок рекомендую конвертить всегда, в них может быть шеллкод
> Вариант с шелом возможен. Чтобы этого не допустить я:

Блин.... шеллкод - не шелл. Все твои слова не по делу. Короче, вирусы и JS в картинках бывают, особенно в gif. Необходимо сделать, что я написал.
 

Нубокот

Новичок
Ресайз не нужен. Нужен стрип.
Также нужно принудительное задание расширения, а лучше и самого имени файла.

ЗЫ: move_uploaded_file иногда работает там, где copy не прокатывает.
 
Сверху