PHP файл загрузки повышает безопасность
Эй, мой вопрос в том, как запретить кому-то загружать вирус или какой-либо вредоносный код с расширением, которое вы притворяетесь, например, у меня есть загружаемый файл в формате pdf, каждый может загрузить двоичный файл с помощью камуфляжа в формате pdf, есть много программ для этого.
Ответы
Ответ 1
Существует ряд проблем, связанных с загрузкой файлов. Первая проблема заключается в том, что файл может быть не файлом, который вы хотите, в данном случае 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.
Ответ 2
мы используем комбинацию проверки 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 скриптs 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
Ответ 3
Взгляните на php FileInfo расширение.
Признание фактического типа контента аналогично команде unix file
.
Но это полезно только для злоумышленников, которые просто переименовывают, например. virus.exe - virus.pdf. Это не мешает загрузке вредоносного pdf (с использованием некоторой ошибки в одном или нескольких более распространенных чтениях в формате PDF).
Ответ 4
Вы не можете запретить кому-либо загружать вирус. Лучший способ - запустить проверку на вирусы, такую как clamscan, для всех файлов, загружаемых на ваш сайт.
Использование проверки расширений/проверки MIME будет только сообщать вам, что файл назван правильно, ИЛИ имеет правильную подпись MIME. У вас не будет возможности узнать, есть ли вирус или нет, пока вы его не сканируете.
Ответ 5
Самый простой двухэтапный ответ позволяет пользователям безопасно загружать файлы в PHP:
- Всегда сохранять файлы вне корневого документа.
- Напишите PHP script для работы с файлами, не разрешая их выполнять
Это остановит большинство попыток загрузки на основе файлов, но не все. Более полное и полное решение состоит из каждого из следующих элементов:
- Никогда не сохраняя файлы вне корня документа, используйте его через прокси script (как указано выше).
- Используя
finfo_file()
, чтобы проверить тип MIME фактического содержимого файла.
- При загрузке сохраните в произвольном имени файла вместо указанного, и используйте строку базы данных для сохранения метаданных (и поэтому ваш прокси script может найти правильный файл для обслуживания).
- Кодировать/шифровать фактическое содержимое файла на диске и сделать ваш script декодированием/расшифровкой. Это позволяет злоумышленникам загружать вредоносную полезную нагрузку, а затем использовать другую уязвимость (например, LFI) для ее запуска. В этом случае
base64_encode()
должен обеспечить достаточную защиту. (Но если у вас есть еще одна уязвимость в вашем приложении, вы должны это исправить.)
Если вы все вышесказанное, ваша форма загрузки, скорее всего, не станет источником уязвимости.