PHP Upload файл повышает безопасность - PullRequest
15 голосов
/ 02 мая 2010

Эй, мой вопрос: как запретить кому-либо загружать вирус или какой-либо вредоносный код с расширением, которое вы притворяетесь, например, у меня есть загрузчик pdf-файлов, любой может загрузить бинарный файл с pdf-камуфляжем, для этого есть множество программ .

Ответы [ 5 ]

13 голосов
/ 02 мая 2010

При загрузке файлов возникает ряд серьезных проблем. Первая проблема заключается в том, что файл может быть не тем файлом, который вам нужен, в данном случае PDF. Переменная $_FILES['file_name']['type'] контролируется злоумышленником, которому никогда нельзя доверять. Это значение обычно модифицируется с помощью кода эксплойта или с использованием тамперданных.

1) Первый шаг в вашей защищенной системе - убедиться, что файл имеет расширение .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 .

7 голосов
/ 26 декабря 2011

мы используем комбинацию fileinfo + проверка расширения файла. Хотя браузеры обычно отправляют MIME-тип, вы никогда не должны доверять ему, так как это может быть угнано .

В нашем случае мы не запускаем никаких файлов на нашем сервере. Итак, что мы делаем, это extension while list вроде (например): pdf jpg png и т.д .. и список 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

1 голос
/ 28 октября 2015

Самый простой двухэтапный ответ на позволяет пользователям безопасно загружать файлы в PHP :

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

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

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

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

1 голос
/ 02 мая 2010

Вы не можете запретить кому-либо загружать вирус. Лучший способ - запустить проверку на вирусы, например, clamscan, на все файлы, загруженные на ваш сайт.

Использование проверки расширения / проверки MIME только скажет вам, что файл назван правильно, ИЛИ имеет правильную подпись MIME. У вас не будет возможности узнать, есть ли вирус, или нет, пока вы его не сканируете.

1 голос
/ 02 мая 2010

Взгляните на расширение FileInfo php.
Распознавание фактического типа контента аналогично команде unix file .
Но это полезно только против злоумышленников, которые просто переименовывают, например, virus.exe в virus.pdf. Это не предотвращает загрузку вредоносного файла PDF (с использованием некоторой ошибки в одном или нескольких наиболее распространенных программах чтения PDF).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...