Django XSS中的Markdown安全


问题内容

我在应用程序中使用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以逃避这些恶意脚本?


问题答案:

根据django.contrib.markup.templatetags.markup.markdown的文档字符串:

要启用安全模式,该模式将剥离原始HTML并仅返回由实际Markdown语法生成的HTML,请将“安全”作为列表中的第一个扩展名传递。

这应该工作:

{{ biography|markdown:"safe" }}