моя проблема заключается в том, чтобы не допустить загрузки пользователями некоторых вредоносных файлов на моем веб-сервере. 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 |>..|
Это наиболее распространенные ошибки при фильтрации:
Пользователи не должны иметь возможность выполнять файлы, которые они загружают. Удалите их разрешение для выполнения.
Есть способ, в php, python или whatelse, чтобы система unix выполнялась легко, чтобы проверить подлинный тип файла?
Нет.
Вы можете создать файл, называемый «something.pdf», который является абсолютно корректным документом PDF, но все еще содержит строки подписи, такие как «<html>». Когда встречается Internet Explorer (и в какой-то степени другие браузеры, но IE хуже), этот документ можно взять как HTML вместо PDF, даже если вы подали его с правильным типом MIME-носителя. Затем, поскольку HTML может содержать JavaScript, контролирующий взаимодействие пользователя с вашим сайтом, ваше приложение имеет сквозное отверстие для проверки скриптов.
Обнюхание контента – это катастрофа безопасности. См. Этот пост для некоторых общих обходных решений: прекратить публикацию вредоносных файлов PHP через формы
Обычно вы используете команду «файл», чтобы узнать, что содержит файл. Я не уверен, однако, если он обнаружит файлы .exe:
вы, например, говорили «казнили», например. По правде говоря, у меня была проблема два года назад: честная белая шляпа загрузила файл php на мой сервер, запустила его, и в этом файле был создан какой-то CMS для управления моим сервером с разрешения пользователя php. просто отправил мне электронное письмо, в котором говорилось, что меньше или больше: «Ваше приложение небезопасно. Для демострации у меня нет этого и того …
В самом деле, кроме того, я проверяю каждое разрешение на каждый файл, который у меня есть на моем сервере, но все же мне не нравится идея иметь на нем файл malicius.
Я попробую функцию unix файла, я уже вижу, что могу получить результат с помощью такого кода:
<? php passthru('file myfile.pdf', $return); echo $return; ?>
С некоторой настройкой я надеюсь, что это будет безопасно.
@Paolo Bergantino: мое приложение – это веб-сервис, люди загружают изображения, документы в формате pdf, файлы csv, ecc …, но загрузка – это не единственное действие, которое может выполнить; Изображения, например, должны отображаться на общедоступной странице пользователя. Я думаю, что я пойду так:
Спасибо всем.