Важно ли проверить, что загруженный файл является фактическим файлом изображения? - PullRequest
5 голосов
/ 18 июня 2011

Допустим, вы можете загрузить любой файл на сервер, но его расширение ДОЛЖНО быть ".jpg".Сможете ли вы загрузить что-нибудь, что может повредить серверу?

Суть моего вопроса в том, что проверка типа файла выполняется медленно, и я бы предпочел проверять расширение файла только в том случае, если это достаточно безопасно.У меня возникают проблемы при представлении сценария, в котором можно использовать вредоносное ПО, замаскированное под изображение.

Я видел рекомендации по использованию getimagesize () для проверки изображения, но эта функция довольно медленная, и я не могу понять,это необходимо или даже эффективно для предотвращения загрузки вредоносных программ ...

Любая информация по этому вопросу очень ценится.

Ответы [ 4 ]

4 голосов
/ 18 июня 2011

Кажется, что только проверка расширения небезопасна.Вреден ли сервер?Трудно сказать, не зная серверную ОС, разрешения для загружаемых файлов и т. Д. Вы определенно не хотите, чтобы они выполнялись.Это, безусловно, легко злоупотребляет тем, что позволяет пользователям загружать не изображения, а просто переименовывать их в то, что есть на самом деле, когда их скачивают их друзья.Вот так вы попадаете в невольно размещенные пиратские фильмы, варез и т. Д.

4 голосов
/ 18 июня 2011

Для проверки безопасности изображений я действительно использую только один метод: просто заново создайте изображение с помощью GD или любой другой библиотеки обработки изображений, которую вы используете, и используйте новое изображение.

Это должно сделать файл совершенно безопасным, если у вас есть обновленные версии вашей библиотеки.

Это может сделать ваши вещи немного медленнее, но чем безопаснее, тем лучше.

Просто проверка, есть ли «.jpg» в конце имени файла, ничего не изменит. Файл может быть файлом любого типа.

Надеюсь, это помогло!

3 голосов
/ 18 июня 2011

Если вы думаете, getimagesize() слишком медленный (потому что все загрузки выполняются в сверхскоростном режиме, как мы знаем;)), вы можете попробовать fileinfo библиотеку .Он проверяет по крайней мере несколько байтов в файле.Это довольно быстро, я использую его каждый день для сотен файлов в приложении, которое должно работать быстро, и оно работает.

Однако то, что вы не проверяете, вы не знаете.Поэтому, возможно, сначала проверьте расширение, убедитесь, что имя файла и хранилище надежно сохранены, и что они должным образом отправлены клиенту.

Прежде чем позволить какой-либо библиотеке изображений коснуться его (и это должно включать те, которые находятся на компьютерах вашего сайта).пользователи), в целях безопасности файл должен быть проверен антивирусным сканером.Это намного медленнее по сравнению с getimagesize(), другие предлагают взглянуть в файл на любое вхождение <?php, чтобы предотвратить загрузку в качестве полезной нагрузки.Естественно, это включает в себя проверку файлов phar, если включение не предотвращается с помощью настроек безопасности установок PHP (например, с помощью suhosin)

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

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

0 голосов
/ 18 июня 2011

Еще одним побочным эффектом не проверки того, является ли это изображение или нет, является то, когда, и если вам нужно отобразить его где-нибудь на веб-сайте (в профиле пользователя, на главной странице и т. Д.), То если это не действительно изображение,он будет выглядеть поврежденным, и, таким образом, ваш сайт будет выглядеть поврежденным.

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

...