Уценка в сейфе Django XSS - PullRequest
       27

Уценка в сейфе Django XSS

2 голосов
/ 12 августа 2011

Я использую Markdown в приложении для отображения биографии пользователя. Я хочу, чтобы пользователь мог немного отформатировать биографию, поэтому я позволяю ему использовать редактор TinyMCE.

Затем, отобразив его в шаблоне Django, вот так

{% load markup %}

<div id="biography">
    {{ biography|markdown }}
</div>

Проблема в том, что если в биографии есть тег, его нельзя избежать, как это делает django везде. Это исходный результат биографического теста:

<p><strong>asdfsdafsadf</strong></p> 
<p><strong>sd<em>fdfdsfsd</em></strong><em>sdfsdfsdfdsf</em>sdfsdfsdf</p> 
<p><strong>sdafasdfasdf</strong></p> 

<script>document.location='http://test.com'</script> 

Как настроить Markdown для удаления этих вредоносных скриптов?

Ответы [ 2 ]

3 голосов
/ 12 августа 2011

Согласно строковым документам django.contrib.markup.templatetags.markup.markdown:

Чтобы включить безопасный режим, который удаляет необработанный HTML и возвращает только HTML, сгенерированный фактическим синтаксисом Markdown, передайте «safe» как первое расширениеlist.

Это должно работать:

{{ biography|markdown:"safe" }}
0 голосов
/ 12 апреля 2012

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

Например, если ваша биография <html>I'm really a HTML fan!</html>, использование

{{ biography|markdown:"safe"}}

даст HTML REMOVED. Вместо этого, если вы используете

{{ biography|force_escape|markdown }}

Выходбудет что-то вроде

<p>&lt;html&gt;I'm really a HTML fan!&lt;/html&gt</p>
...