【问题标题】:Django / Python: Convert Markdown to Secure HTMLDjango / Python:将 Markdown 转换为安全 HTML
【发布时间】:2012-11-22 22:08:59
【问题描述】:

我接受 Markdown 并需要将其转换为 HTML 以在 Django 中安全地呈现。现在我正在接受 form.cleaned_data 并将其转换为 HTML:

import markdown
html_body = markdown.markdown(body_markdown, safe_mode=True)
html_body = html_body.replace('[HTML_REMOVED]', '')
return html_body

在模板中,我将其渲染为:

{{ object.content|safe|capfirst }}

但是,如果您发布:

0;url=javascript:alert('hi');" http-equiv="refresh

JS 会渲染,所以 XSS 是可能的。

【问题讨论】:

    标签: python django django-templates markdown


    【解决方案1】:

    django 内置 safe template tag 意味着您将该变量标记为可以输出,即您知道它的内容是安全的:

    安全:将字符串标记为在输出之前不需要进一步的 HTML 转义。

    default escapes your template variables:Django

    默认情况下,在 Django 中,每个模板都会自动转义每个变量标签的输出。具体来说,这五个字符被转义了...

    但它不会为您剥离 javascript(它只会使其无法使用),您需要使用模板标签手动执行此操作:

    Strip javascript code before rendering in django templates

    另一方面,markdown 上的 safe_mode 会使用 [HTML REMOVED] 去除文本中的任何 HTML,如您所见。

    所以删除safe 应该足以使其安全,

    【讨论】:

    • 感谢您的回答。我从模板中删除了“安全”,但它仍在渲染。在 JS 中,我没有直接包含脚本标签 "0;url=javascript:alert('hi');" http-equiv="refresh" 通过 JS 过滤器。
    • 它在哪里渲染?如果 HTML 被删除,并且没有 <script> 标签,它只是正常的字符串输出,所以它会一直呈现。
    • 但是 javascript 包含在哪里?当然 if 应该被删除(如果它是标签中的 onclick 一段 javascript)或者很容易删除(如果它在 script 标签之间)。如果它只是随机的 javascript 代码,将很难检测到
    猜你喜欢
    • 2018-08-02
    • 1970-01-01
    • 2017-05-11
    • 2018-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2010-10-02
    相关资源
    最近更新 更多