Django中Markdown的XSS安全性

2 投票
2 回答
1967 浏览
提问于 2025-04-16 23:26

我在一个应用程序中使用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>&lt;html&gt;I'm really a HTML fan!&lt;/html&gt</p>
3

根据 django.contrib.markup.templatetags.markup.markdown 的文档说明:

要启用安全模式,这个模式会去掉原始的HTML,只返回由真正的Markdown语法生成的HTML,您需要把“safe”作为列表中的第一个扩展传入。

这样做应该可以:

{{ biography|markdown:"safe" }}

撰写回答