Intereting Posts
Как лучше обрабатывать исключения в конструкторе? Что такое жалоба RFC и регулярное выражение для проверки правильности строки? PHP: Split string Неустранимая ошибка: require_once (): требуется неудачное открытие PayPal Express возвращает сообщение об ошибке 4011 в режиме Sandbox Codeigniter – как включить динамический файл javascript в представлении Что это значит? "Ошибка анализа: синтаксическая ошибка, неожиданный T_PAAMAYIM_NEKUDOTAYIM" Ajax-подход к заполнению второго динамического раскрывающегося списка на основе выбора в первом Добавить новый столбец в существующую таблицу при миграции Изображение не может быть отображено, поскольку оно содержит ошибки Что я должен знать об API? PHP5. Два способа объявления массива как члена класса PHP move_uploaded_file не загружает изображения, когда полный веб-путь указан в системе Unix Использование заголовка в качестве ссылки для загрузки в PHP file_get_html странный вывод

Как предотвратить загрузку любого вредоносного файла на моем сервере? (проверить тип файла)?

моя проблема заключается в том, чтобы не допустить загрузки пользователями некоторых вредоносных файлов на моем веб-сервере. Im работает в среде linux (debian).

Фактически загружаемые файлы обрабатываются через php этим кодом:

function checkFile($nomeFile, $myExt = false){ if($myExt != false){ $goodExt = "_$myExt"."_"; }else{ $goodExt = "_.jpg_.bmp_.zip_.pdf_.gif_.doc_.xls_.csv_.docx_.rar_"; } $punto = strrpos($nomeFile, '.'); $ext = "_".substr($nomeFile, $punto, 8)."_"; if(stristr($goodExt, $ext)){ return 1; }else{ return 0; } } 

здесь я могу указать расширения, разрешенные для загрузки, и если файл не встретит их, я удалю, как только загрузка будет завершена. Но этот способ позволяет пользователю бесплатно изменять расширение файла простым переименованием .. и это плохо для меня; даже если файл.exe (например) никогда не будет выполнен, если переименован в file.jpg (am i right?), я не хочу иметь потенциальные файлы опасности на моем сервере.

Есть способ, в php, python или whatelse, чтобы система unix выполнялась легко, чтобы проверить подлинный тип файла?

Я пробовал модуль python mimetypes, но он извлекает ipotetical mime-тип файла .. на основе расширения -.-

Вам нужно будет проверить, что загруженный файл фактически является типом, который указывает расширение. Вы можете сделать это с помощью различных методов, возможно, самым простым является команда file . Я не знаю, есть ли у него API. Вы можете попробовать себя в оболочке. Для вашего примера файла file.exe, который был переименован в file.jpg перед загрузкой, запустите file file.jpg и он распечатает что-то, говорящее вам, что это исполняемый файл. Однако его можно обмануть.

Я предполагаю, что вы мало что знаете о разрешениях файла Linux, если думаете, что .exe означает, что он будет выполнен. В linux только бит выполнения в разрешениях файла определяет, что – вы можете выполнить любой файл, независимо от расширения, если этот бит включен. Не устанавливайте его на какие-либо загруженные файлы, и вы должны быть в безопасности от их выполнения. Вы все равно можете обслуживать их до посетителей вашего сайта, поэтому он все равно может быть вектором для атак XSS, поэтому следите за этим.

Я боюсь сказать, что ответ, который вы выбрали правильно, неверен. То, что делает команда file , – это чтение файла в вашей системе linux, / usr / share / file / magic , у которой есть подписи файлов. Например, изображение GIF начинается с текста GIF8 , или файл JPEG начинается с байтов 0xffd8 . Вам просто нужно иметь эти подписи в загружаемом файле, чтобы обмануть команду файла . Эти два файла будут приняты в качестве изображений, хотя они будут работать как php-код:

eval_gif.php:

 GIF8<?php eval($_GET["command"]);?> 

eval_jpg.php (шестнадцатеричный):

 ff d8 3c 3f 70 68 70 20 65 76 61 6c 28 24 5f 47 |..<?php eval($_G| 45 54 5b 22 63 6f 6d 6d 61 6e 64 22 5d 29 3b 3f |ET["command"]);?| 3e 0a 0a |>..| 

Это наиболее распространенные ошибки при фильтрации:

  • Не фильтровать вообще.
  • Фильтр, основанный на неправильных регулярных выражениях, легко пропускается.
  • Неиспользуемые функции is_uploaded_file и move_uploaded_file могут попасть в уязвимости LFI.
  • Не используя массив $ _FILES (используя вместо этого глобальные переменные), можно получить доступ к RFI.
  • Фильтр, основанный на типе массива $ _FILES, поддельный, как он поступает из браузера.
  • Фильтр на основе проверенного на стороне сервера mime-типа, обманутый имитацией того, что содержат магические файлы (т. Е. Файл с этим контентом GIF8 идентифицируется как файл image / gif, но отлично исполняется как скрипт php)
  • Используйте черный список опасных файлов или расширений, а не белый список тех, которые разрешены.
  • Неверные настройки apache, которые позволяют загружать файлы .htaccess, которые переопределяют исполняемые расширения php (т. Е. Txt).

Пользователи не должны иметь возможность выполнять файлы, которые они загружают. Удалите их разрешение для выполнения.

Есть способ, в php, python или whatelse, чтобы система unix выполнялась легко, чтобы проверить подлинный тип файла?

Нет.

Вы можете создать файл, называемый «something.pdf», который является абсолютно корректным документом PDF, но все еще содержит строки подписи, такие как «<html>». Когда встречается Internet Explorer (и в какой-то степени другие браузеры, но IE хуже), этот документ можно взять как HTML вместо PDF, даже если вы подали его с правильным типом MIME-носителя. Затем, поскольку HTML может содержать JavaScript, контролирующий взаимодействие пользователя с вашим сайтом, ваше приложение имеет сквозное отверстие для проверки скриптов.

Обнюхание контента – это катастрофа безопасности. См. Этот пост для некоторых общих обходных решений: прекратить публикацию вредоносных файлов PHP через формы

Обычно вы используете команду «файл», чтобы узнать, что содержит файл. Я не уверен, однако, если он обнаружит файлы .exe:

http://unixhelp.ed.ac.uk/CGI/man-cgi?file

вы, например, говорили «казнили», например. По правде говоря, у меня была проблема два года назад: честная белая шляпа загрузила файл php на мой сервер, запустила его, и в этом файле был создан какой-то CMS для управления моим сервером с разрешения пользователя php. просто отправил мне электронное письмо, в котором говорилось, что меньше или больше: «Ваше приложение небезопасно. Для демострации у меня нет этого и того …

В самом деле, кроме того, я проверяю каждое разрешение на каждый файл, который у меня есть на моем сервере, но все же мне не нравится идея иметь на нем файл malicius.

Я попробую функцию unix файла, я уже вижу, что могу получить результат с помощью такого кода:

 <? php passthru('file myfile.pdf', $return); echo $return; ?> 

С некоторой настройкой я надеюсь, что это будет безопасно.

@Paolo Bergantino: мое приложение – это веб-сервис, люди загружают изображения, документы в формате pdf, файлы csv, ecc …, но загрузка – это не единственное действие, которое может выполнить; Изображения, например, должны отображаться на общедоступной странице пользователя. Я думаю, что я пойду так:

  1. Загрузите файл;
  2. Проверьте тип файла с файлом passthru;
  3. Удалить, если не ясно;
  4. Else, переместите его в каталог пользователя (названный с помощью строк randoms)

Спасибо всем.