PHP-файл загрузки повышает безопасность

Эй, мой вопрос: как предотвратить, чтобы кто-то загрузил вирус или какой-то вредоносный код с расширением, которое вы притворяетесь, например, у меня есть файл для загрузки файлов в формате 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 :

  1. Всегда сохранять файлы вне корневого документа.
  2. Напишите PHP-скрипт для работы с файлами, не позволяя им выполнять

Это остановит большинство попыток загрузки на основе файлов, но не все. Более полное и полное решение состоит из каждого из следующих:

  1. Никогда не сохраняя файлы вне корня документа, используйте его через прокси-скрипт (как указано выше).
  2. Использование finfo_file() для проверки MIME-типа фактического содержимого файла.
  3. При загрузке сохраняйте произвольное имя файла вместо указанного, и используйте строку базы данных для сохранения метаданных (и поэтому ваш прокси-скрипт может найти правильный файл для обслуживания).
  4. Кодирование / шифрование фактического содержимого файла на диске и создание сценария для его декодирования / расшифровки. Это позволяет злоумышленникам загружать вредоносную полезную нагрузку, а затем использовать другую уязвимость (например, LFI) для ее запуска. В этом случае base64_encode() должен обеспечить достаточную защиту. (Но если у вас есть еще одна уязвимость в вашем приложении, вы должны это исправить.)

Если вы все вышесказанное, ваша форма загрузки вряд ли станет источником уязвимости.