как картинку распознать?

-=KPOT=-

Новичок
Автор оригинала: jrip
А я обычно проще делаю, проверяю через тип файла т.е.
$HTTP_POST_FILES['file']['type'] Не знаю правильно это или нет, но пока проблем никаких не было.
неправильно, getimagesize() - надежней

сам кстате делаю так:
- getimagesize() проверяю
- потом ресайз (у меня магазин и картинки добавлять могет тока админ, но все же:))
- полученную картинку сохраняем как XXXXXX.jpg (XXXXX-уникальное время)

поэтому проблем с расширением нет оно в конце концов все ровно будет jpg

пробовал пример SIMMa закачал гад:mad:, но при ресайзе ругнулся (размеры то не определены) и вывел он мне ее в браузер КАК КАРТИНКУ (а не как код) но с размером 3360*15370 и все больше ни глюка:)
 

jrip

Новичок
А почему мой вариант-то неправильный? В моём случае, правда это не картинки, а архивы. но переименовав .php в .zip (а ограничение стоит на закачку архивов application/x-zip-compressed) получаю ошибку - "не архив zip".
Да и вообще какая разница, что закачают не картинку? Как скрипт на серваке запустить всё равно нельзя, а то что другой пользователь какую-то чушь, вместо картинки увидит? дык также можно нарисовать какую-нить чушь и загрузить.
А мне не нужно париться не с расширениями, ни с чем вообще, да и подход универсальный.. т.е. и архивы и картинки....
Разве не так?
 

-=KPOT=-

Новичок
ИМХО
MIME прописывается в реестре Windows и отдается браузером, делай выводы
(я так думаю)
 

SiMM

Новичок
jrip, этот способ ничем не лучше [m]getimagesize[/m] в плане безопасности (опять же повторюсь, что это в том случае, если по запросу пользователя файл может быть принят за серверный скрипт).

-~{}~ 17.12.04 09:35:

Автор оригинала: -=KPOT=-
пробовал пример SIMMa закачал гад:mad:, но при ресайзе ругнулся (размеры то не определены) и вывел он мне ее в браузер КАК КАРТИНКУ (а не как код) но с размером 3360*15370 и все больше ни глюка:)
Это простой пример. При желании, наверно, можно добиться и большего эффекта, т.е. файл внешне вообще не будет отличаться от картинки. Думаю, особенно легко это сделать с JPEG'ами, где PHP-шный скрипт можно засунуть в какой-нибудь APP-контейнер (или как это правильно назвать?).
Но ты, имхо, неверно понял проблему - проблема не в том, что чего-то там у пользователя неверно отобразится - а в том, что он, запросив этот файл, фактически запустит свой вредоносный скрипт.
 

jrip

Новичок
Хм... Раньше я думал, что тип ещё и на сервере проверяется.... А выше сказанное для меня откровение...
SiMM
А как тогда лучше сделать? Проверять на расширение?
 

SiMM

Новичок
Варианты:
1. RemoveHandler .php (и другие расширения серверных скриптов) в .htaccess'е.
2. Менять расширение на безопасное.
3. Отдавать файлы скриптом.
PS: а вообще - мне самому интересно, как эту проблему решают остальные, и какое решение наиболее преемлемо во всех случаях. В общем, никогда не надо забывать о том, что главная задача - безопасность сервера, а не то, что там в браузере у клиента получится (хотя благодаря дырам в библиотеках обработки изображений клиента юзверь может подцепить какую-нибудь заразу - но бороться с этим средствами PHP, имхо, нереально).
 

jrip

Новичок
хм... для себя придумал такой вариант.. получаю файл, проверяю расширение. Если оно присутствует в списке разрешённых, то файл сохраняется. Иначе - пинают. Хватит ли такого? Отдавать все файлы скриптом нет возможности.

И нужно ли что-то с правами файла делать? Если да, то какие лучше выставлять?
 

SiMM

Новичок
Автор оригинала: jrip
Хватит ли такого?
Имхо, да.
Отдавать все файлы скриптом нет возможности.
А вариант 1? ;)
И нужно ли что-то с правами файла делать?
Выставлять так, чтобы коллеги по хостингу не могли запустить php с файлом из твоих папок.
 

jrip

Новичок
Вариант 1 учтён изначально. :) Коллег по хостингу нет, сервак полностью на мне. В других местах таких проблем пока не возникало, правда с правами первый раз, когда ещё не знал чем это грозит, я всёж лоханулся.
Просто раньше я всё писал на перле, на пхп перешёл совсем недавно. Дык со скриптами на перле была такая фенька. устанавливаешь права на запуск- скрипт запускается, иначе выводит ошибку. А здесь такого нет?
 
Сверху