Django中Markdown的XSS安全性
我在一个应用程序中使用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 个回答
-1
在安全模式下使用Markdown会把所有的HTML标签都去掉,这样用户就不能在个人简介中输入HTML内容了。在某些情况下,这样做可能不太好。我建议你在使用Markdown之前先用force_escape处理一下,这样输入到Markdown中的内容就会是安全的。
举个例子,如果你的个人简介是 <html>我真的是个HTML爱好者!</html>
,使用
{{ biography|markdown:"safe"}}
会得到 HTML已被移除
。相反,如果你使用
{{ biography|force_escape|markdown }}
输出的结果会像这样
<p><html>I'm really a HTML fan!</html></p>
3
根据 django.contrib.markup.templatetags.markup.markdown
的文档说明:
要启用安全模式,这个模式会去掉原始的HTML,只返回由真正的Markdown语法生成的HTML,您需要把“safe”作为列表中的第一个扩展传入。
这样做应该可以:
{{ biography|markdown:"safe" }}