Эй, мой вопрос: как предотвратить, чтобы кто-то загрузил вирус или какой-то вредоносный код с расширением, которое вы притворяетесь, например, у меня есть файл для загрузки файлов в формате pdf, каждый может загрузить двоичный файл с помощью камуфляжа в формате pdf, для этого есть много программ.
Существует ряд проблем, связанных с загрузкой файлов. Первая проблема заключается в том, что файл может быть не файлом, который вы хотите, в данном случае pdf. Переменная $_FILES['file_name']['type']
контролируется злоумышленником, которому никогда нельзя доверять. Это значение обычно изменяется с использованием кода эксплойта или с использованием tamperdata.
1) Первый шаг в вашей системе secuirty – убедиться, что файл имеет расширение .pdf:
if("pdf"!=substr($fileName, strrpos($fileName, '.') + 1)){ die("Invalid File Type"); }
2) Затем вы должны проверить, какой тип файла использует функция php filetype () .
3) Серьезная проблема заключается в том, что эти файлы PDF могут использовать уязвимости, такие как переполнение буфера, обычно встречающееся в программном обеспечении Adobe. Эти PDF-файлы используются для распространения вирусов при атаке Drive By Download .
Лучшим решением является установка брандмауэра веб-приложений Mod_Security . Это остановит атаки, такие как SQL-инъекция и xss, от попадания вашего веб-приложения. Mod_Secuirty можно настроить для сканирования всех загружаемых файлов на вирусы с помощью modsec-clamscan .
мы используем комбинацию проверки файла file + +. В то время как браузеры обычно отправляют тип mime, вы никогда не должны доверять ему, так как это может быть захвачено .
В нашем случае мы не запускаем никаких файлов на нашем сервере. Итак, что мы делаем, это extension while list
вроде (например): pdf jpg png
т. Д. И список blacklisted mime extensions
в blacklisted mime extensions
. Таким образом мы избегаем риска наличия файла с расширением, которое не соответствует типу mime.
как только файл сохраняется на сервере, мы всегда заставляем тип mime application/octet-stream
поэтому файлы всегда загружаются.
что-то вроде этого:
<?php $allowed_types = array( /* images extensions */ 'jpeg', 'bmp', 'png', 'gif', 'tiff', 'jpg', /* audio extensions */ 'mp3', 'wav', 'midi', 'aac', 'ogg', 'wma', 'm4a', 'mid', 'orb', 'aif', /* movie extensions */ 'mov', 'flv', 'mpeg', 'mpg', 'mp4', 'avi', 'wmv', 'qt', /* document extensions */ 'txt', 'pdf', 'ppt', 'pps', 'xls', 'doc', 'xlsx', 'pptx', 'ppsx', 'docx' ); $mime_type_black_list= array( # HTML may contain cookie-stealing JavaScript and web bugs 'text/html', 'text/javascript', 'text/x-javascript', 'application/x-shellscript', # PHP scripts may execute arbitrary code on the server 'application/x-php', 'text/x-php', 'text/x-php', # Other types that may be interpreted by some servers 'text/x-python', 'text/x-perl', 'text/x-bash', 'text/x-sh', 'text/x-csh', 'text/x-c++', 'text/x-c', # Windows metafile, client-side vulnerability on some systems # 'application/x-msmetafile', # A ZIP file may be a valid Java archive containing an applet which exploits the # same-origin policy to steal cookies # 'application/zip', ); $tmp_file_extension = strtolower(pathinfo($file_name, PATHINFO_EXTENSION)); if(!strlen($tmp_file_extension) || (!$allow_all_types && !in_array($tmp_file_extension,$allowed_types))) { return false; } $finfo = new finfo(FILEINFO_MIME, MIME_MAGIC_PATH); if ($finfo) { $mime = $finfo->file($file_name_tmp); } else { $mime = $file_type; } $mime = explode(" ", $mime); $mime = $mime[0]; if (substr($mime, -1, 1) == ";") { $mime = trim(substr($mime, 0, -1)); } return (in_array($mime, $mime_type_black_list) == false);
в дополнение к этому вы можете добавить virus scan
используя clamav
+ расширение php
Взгляните на расширение FileInfo php.
Признание фактического типа контента аналогично команде file
unix .
Но это полезно только для злоумышленников, которые просто переименовывают, например virus.exe, в virus.pdf. Это не мешает загрузке вредоносного PDF (с использованием некоторой ошибки в одном или нескольких более распространенных читателях в формате PDF).
Вы не можете запретить кому-либо загружать вирус. Лучший способ – запустить проверку на вирусы, такую как clamscan, для всех файлов, загружаемых на ваш сайт.
Использование проверки расширения / проверки MIME будет только указывать, что файл назван правильно, ИЛИ имеет правильную MIME-подпись. У вас не будет возможности узнать, есть ли вирус или нет, пока вы его не сканируете.
Самый простой двухэтапный ответ, позволяющий пользователям безопасно загружать файлы в PHP :
Это остановит большинство попыток загрузки на основе файлов, но не все. Более полное и полное решение состоит из каждого из следующих:
finfo_file()
для проверки MIME-типа фактического содержимого файла. base64_encode()
должен обеспечить достаточную защиту. (Но если у вас есть еще одна уязвимость в вашем приложении, вы должны это исправить.) Если вы все вышесказанное, ваша форма загрузки вряд ли станет источником уязвимости.