Проверка загруженных файлов в Django - PullRequest
22 голосов
/ 17 ноября 2009

Приложение Django, в котором я работаю, имеет модель Event. Event может иметь связанные фотографии, статические html-файлы и pdf-файлы.

Я хотел бы разрешить доверенным пользователям загружать эти файлы, но я настороженно отношусь к безопасности, особенно прочитав следующее в документации Django (ссылка).

Обратите внимание, что всякий раз, когда вы имеете дело с загруженные файлы, вы должны заплатить близко внимание, куда вы загружаете их и какие типы файлов, чтобы избежать дыр в безопасности. Подтвердить все загруженные файлы, так что вы уверены, что файлы - это то, что вы думаете. За Например, если вы слепо позволяете кому-то загружать файлы без проверки в каталог, который находится в вашей сети корень документа сервера, потом кто-нибудь может загрузить скрипт CGI или PHP и выполнить этот скрипт, посетив его URL на вашем сайте. Не позволяй этого.

Как я могу проверить различные типы файлов? Мне было бы интересно услышать чей-либо опыт работы с такого рода вещами или ссылки для дальнейшего чтения. У меня есть ощущение, что HTML-файлы могут быть слишком рискованными, и в этом случае я ограничу разрешения на загрузку для администратора.

Ответы [ 6 ]

17 голосов
/ 25 ноября 2009

Все ответы сосредоточены на проверке файлов. Это практически невозможно.

Разработчики Django не просят вас проверить, могут ли файлы выполняться как cgi файлы. Они просто говорят вам не помещать их в место, где они будут казнены.

Вы должны поместить все вещи Django в специальный каталог Django. Этот каталог кода Django не должен содержать статического содержимого. Не помещайте пользовательские файлы в исходный репозиторий Django.

Если вы используете Apache2, ознакомьтесь с базовым руководством по cgi: http://httpd.apache.org/docs/2.0/howto/cgi.html

Apache2 может быть настроен для запуска любых файлов в папке ScriptAlias. Не помещайте пользовательские файлы в папки /cgi-bin/ или /usr/local/apache2/cgi-bin/.

Apache2 может быть настроен на файлы cgi сервера, в зависимости от настроек AddHandler cgi-script. Не позволяйте пользователям отправлять файлы с расширениями, такими как .cgi или .pl.

Однако вам необходимо очистить файлы, отправленные пользователями, чтобы их можно было безопасно запускать на компьютерах других клиентов . Отправленный HTML небезопасен для других пользователей. Это не повредит вашему серверу. Ваш сервер просто плюет на того, кто его запрашивает. Получить HTML-дезинфицирующее средство.

Также SVG может быть небезопасным . У него были ошибки в прошлом. SVG - это XML-документ с javascript, поэтому он может быть вредоносным.

PDF ... сложно. Вы можете преобразовать его в изображение (если вам действительно нужно) или предоставить предварительный просмотр изображения (и позволить пользователям загружать его на свой страх и риск), но для людей, пытающихся использовать его, будет больно.

Рассмотрим белый список файлов, с которыми все в порядке. Вирус, встроенный в файл gif, jpeg или png, будет просто выглядеть как поврежденное изображение (или не отображаться). Если вы хотите быть параноиком, конвертируйте их в стандартный формат, используя PIL (эй, вы также можете проверить размеры). Санированный HTML должен быть в порядке (удаление скриптовых тегов - не ракетостроение). Если санитарная обработка занимает много времени (или вы просто осторожны), вы можете поместить ее на отдельный сервер, я думаю.

14 голосов
/ 17 ноября 2009

Для изображений вы можете просто использовать Python Imaging Library (PIL).

Image.open(filepath)

Если файл не является изображением, будет сгенерировано исключение. Я довольно новичок в Python / Django, так что у кого-то еще может быть лучший способ проверки изображений.

6 голосов
/ 17 ноября 2009

Первое, что вы хотите сделать с загруженным контентом, - это сохранить его в каталоге, который напрямую недоступен для скачивания. Если ваше приложение существует в ~/www/, рассмотрите возможность помещения ваших данных в '~ / data / `.

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

Вы не можете доверять файлу на основе расширения, поэтому используйте что-то вроде Fileinfo . Затем для каждого типа MIME создайте валидатор. ImageMagick может проверять файлы изображений. Для большей безопасности вам, возможно, придется запустить антивирусный сканер над файлами, такими как pdf и flash-файлы. Для html вы можете рассмотреть ограничение поднабора тегов.

Я не могу найти Python-эквивалент модуля Fileinfo, хотя всегда можно выполнить /usr/bin/file -i. Большинство систем, которые разрешают загрузку, затем создают имя контента или идентификатор. Затем они используют mod_rewrite для анализа URL-адреса и поиска содержимого на диске. Как только контент найден, он возвращается пользователю с помощью sendfile или чего-то подобного. Например, до тех пор, пока контент не будет утвержден, его может просматривать только пользователь, который его загрузил.

5 голосов
/ 24 ноября 2009

Это немного специфично для вашей среды хостинга, но вот что я делаю:

Обслуживайте весь загруженный пользователем контент с помощью Nginx вместо apache и служите им как статический контент (он не будет запускать ни один из php или cgi, даже если пользователи загрузят его)

2 голосов
/ 24 ноября 2009

«доверенные пользователи» - это субъективный термин. Это люди, которых вы знаете лично, или только тот, кто создал учетную запись в вашем приложении? Не предоставляйте доступ к вашей файловой системе людям, которых вы не знаете лично.

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

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

Итак, я бы рекомендовал пересмотреть проект на основе базы данных.

0 голосов
/ 24 ноября 2009

вы можете проверить html файлы с помощью BeautifulSoup

...