Проверка загруженных файлов в Django

VBScript сосет, если Вы не сравниваете его с другой разновидностью VB. PHP в порядке, пока Вы имеете в виду, что это - переросший язык шаблонной обработки. Современный JavaScript является большим. Действительно. Тонны забавы. Просто держитесь подальше от отмеченного "DHTML" любых сценариев.

я никогда не использовал язык, который не позволил ошибки периода выполнения. По моему скромному мнению, это - в основном отвлекающий маневр: компиляторы не находят все опечатки, и при этом они не проверяют намерение. Явная типизация является большой, когда Вам нужны явные типы, но большую часть времени, Вы не делаете. Ищите вопросы здесь на generics или тот о том, было ли использование неподписанных типов хорошим выбором для индексных переменных - большая часть времени, этот материал просто мешает и дает народные кнопки для вертения, когда они имеют свободное время.

, Но, я действительно не ответил на Ваш вопрос. Почему динамические языки обращаются? Поскольку через некоторое время, пишущий код становится тусклым, и Вы просто хотите реализовать алгоритм. Вы уже сидели и разработали все это в пере, схематически изобразили потенциальные проблемные сценарии и доказали их разрешимый, и единственная вещь, оставленная сделать, кодировать двадцать строк реализации... и двести строк шаблона, чтобы заставить его скомпилировать. Тогда Вы понимаете, что система типов, с которой Вы работаете, не отражает то, что Вы на самом деле делаете, но чужая ультраабстрактная идея того, что Вы могли бы сделать, и Вы давно отказались от программирования для жизни knicknack, настраивающего столь обсессивно-компульсивный, что это позорило бы даже вымышленного детектива Adrian Monk.

Именно тогда Вы <забастовка> идете, оштукатурены начинают смотреть серьезно на динамические языки.

22
задан Alasdair 17 November 2009 в 00:50
поделиться

6 ответов

All the answers are focusing on validating files. This is pretty much impossible.

The Django devs aren't asking you to validate whether files can be executed as cgi files. They are just telling you not to put them in a place where they will be executed.

You should put all Django stuff in a specially Django directory. That Django code directory should not contain static content. Don't put user files in the Django source repository.

If you are using Apache2, check out the basic cgi tutorial: http://httpd.apache.org/docs/2.0/howto/cgi.html

Apache2 might be setup to run any files in the ScriptAlias folder. Don't put user files in the /cgi-bin/ or /usr/local/apache2/cgi-bin/ folders.

Apache2 might be set to server cgi files, depending on the AddHandler cgi-script settings. Don't let the users submit files with extensions like .cgi or .pl.

However, you do need to sanitize user submitted files so they are safe to run on other clients' machines. Submitted HTML is unsafe to other users. It won't hurt your server. Your server will just spit it back at whoever requests it. Get a HTML sanitizer.

Also, SVG may be unsafe. It's had bugs in the past. SVG is an XML document with javascript in it, so it can be malicious.

PDF is ... tricky. You could convert it to an image (if you really had to), or provide an image preview (and let users download at their own risk), but it would be a pain for people trying to use it.

Consider a white-list of files that are OK. A virus embedded in a gif, jpeg or png file will just look like a corrupt picture (or fail to display). If you want to be paranoid, convert them all to a standard format using PIL (hey, you could also check sizes). Sanitized HTML should be OK (stripping out script tags isn't rocket science). If the sanitization is sucking cycles (or you're just cautious), you could put it on a separate server, I guess.

17
ответ дан 29 November 2019 в 04:33
поделиться

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

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

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

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

и найдите содержимое на диске. Как только контент найден, он возвращается пользователю с помощью sendfile или чего-то подобного. Например, до тех пор, пока контент не будет одобрен, его может просматривать только пользователь, который его загрузил.

и найдите содержимое на диске. Как только контент найден, он возвращается пользователю с помощью sendfile или чего-то подобного. Например, до тех пор, пока контент не будет одобрен, его может просматривать только пользователь, который его загрузил.

6
ответ дан 29 November 2019 в 04:33
поделиться

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

Image.open(filepath)

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

14
ответ дан 29 November 2019 в 04:33
поделиться

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

0
ответ дан 29 November 2019 в 04:33
поделиться

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

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

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

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

2
ответ дан 29 November 2019 в 04:33
поделиться

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

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

5
ответ дан 29 November 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: