Допустим, вы можете загрузить любой файл, который хотите получить на сервер, но расширение файла должно быть «.jpg». Можете ли вы загрузить все, что может нанести вред серверу?
Вопрос моего вопроса в том, что проверка типа файла медленная, и я бы предпочел только проверить расширение файла, если это достаточно безопасно. У меня возникли проблемы с представлением сценария, в котором может использоваться вредоносное ПО, замаскированное под изображение.
Я видел рекомендации по использованию getimagesize () для проверки изображения, но эта функция довольно медленная, и я не могу понять, необходимо ли это или даже эффективно предотвращать загрузку вредоносных программ …
Любая информация по этому поводу очень ценится.
Если вы считаете, что getimagesize()
слишком медленный (потому что все закачки выполняются в сверхвысокой скорости, как мы знаем;)), вы также можете попробовать библиотеку fileinfo
. Он проверяет по крайней мере несколько байтов в файле. Это довольно быстро, я использую его каждый день для сотен файлов в приложении, которое должно работать быстро, и это происходит.
Однако то, что вы не подтверждаете, вы не знаете. Поэтому, вероятно, сначала проверьте расширение, убедитесь, что имя файла и безопасное хранилище, и что они правильно отправляются клиенту.
Прежде чем позволить какой-либо библиотеке изображений коснуться ее (и это должно включать в себя те, что на компьютерах пользователей вашего сайта), по соображениям безопасности файл должен быть проверен антивирусным сканером. Это намного медленнее по сравнению с getimagesize()
, другие предлагают заглянуть в файл для любой ошибки <?php
а также для предотвращения загрузки в качестве полезной нагрузки. Естественно, это включает проверку файлов phar
если включение не предотвращается с помощью настроек безопасности установки PHP (например, suhosin)
Рядом с проверкой на наличие вирусов хранящиеся файлы следует проверять время от времени снова и снова из-за ранее неизвестных эксплойтов.
Таким образом, часть этого всегда является фоновой работой. Но даже проверки по требованию в режиме реального времени часто не занимают столько времени, пока ваше приложение не будет загружать все время. Возможно, вы захотите ввести некоторую очередь загрузки, так что загрузка уже выполнена, но файл get доступен для загрузчика после выполнения необходимых задач.
Для проверки безопасности изображений я использую только один метод: просто заново создайте изображение с помощью GD или любой другой библиотеки обработки изображений, которую вы используете, и используйте новое изображение.
Это должно сделать файл совершенно безопасным, если у вас есть обновленные версии вашей библиотеки.
Это может сделать ваши вещи немного медленнее, но безопаснее, тем лучше.
Просто проверить, есть ли «.jpg» в конце имени файла, ничего не будет сделано. Файл все равно может быть любым типом файла.
Надеюсь, это помогло!
Кажется, что только проверка расширения небезопасна. Вредно для сервера? Трудно сказать, не зная серверную ОС, разрешения на загруженные файлы и т. Д. Вы определенно не хотите, чтобы они выполнялись. Это, безусловно, легко злоупотреблять, позволяя пользователям загружать не-изображения, а затем они просто переименовываются в то, что на самом деле происходит, когда их друзья загружают его. Вот как вы невольно принимаете пиратские фильмы, варез и т. Д.
Еще один побочный эффект: проверить, является ли это образ или нет, и если вам нужно отобразить его где-нибудь на веб-сайте (в профиле пользователя, на первой странице и т. Д.), То если это не изображение, оно появится и, таким образом, ваш сайт окажется сломанным.
Что касается вложенных вредоносных программ, это зависит от конфигурации вашего сервера. Если он не был обновлен для защиты дыр и эксплойтов, то да, вредоносное ПО может проникнуть через (хотя это редко, но возможно).