Django XSS 安全中的 Markdown

发布于 2024-11-29 08:33:29 字数 645 浏览 1 评论 0原文

我在应用程序中使用 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 来转义这些恶意脚本?

I am using Markdown in an app to display a user biography. I want the user to be able to slightly format the biography, so I'm letting them use the TinyMCE editor.

Then, displaying it in the Django Template like this

{% load markup %}

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

The problem is, if there is a tag in the biography, it is not being escaped as django does everywhere else. This is the source output from a biography test:

<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> 

How do I set Markdown to escape these malicious scripts?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

兮子 2024-12-06 08:33:29

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

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

这应该有效:

{{ biography|markdown:"safe" }}

According to django.contrib.markup.templatetags.markup.markdown's docstrings:

To enable safe mode, which strips raw HTML and only returns HTML
generated by actual Markdown syntax, pass "safe" as the first
extension in the list.

This should work:

{{ biography|markdown:"safe" }}
雨后咖啡店 2024-12-06 08:33:29

安全模式下的 Markdown 会删除所有 html 标签,这意味着您的用户无法在传记中输入 HTML 片段。在某些情况下,这不是优选的。我建议您在降价之前使用force_escape,这样任何输入降价的内容都是安全的。

例如,如果您的简介是 我真的是 HTML 粉丝!,则使用

{{ biography|markdown:"safe"}}

将产生 HTML REMOVED.. 相反,如果您使用

{{ biography|force_escape|markdown }}

输出会是这样的

<p><html>I'm really a HTML fan!</html></p>

Markdown in safe mode would remove all html tags, which means your users cannot input HTML segments in the biography. In some cases, this is not preferable. I would recommend you use force_escape before markdown, so anything fed into markdown is safe.

For example, if your biography is <html>I'm really a HTML fan!</html>, using

{{ biography|markdown:"safe"}}

would produce HTML REMOVED.. Instead, if you use

{{ biography|force_escape|markdown }}

The output would be something like

<p><html>I'm really a HTML fan!</html></p>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文