【问题标题】:Disable HTML escaping in Django's TextField在 Django 的 TextField 中禁用 HTML 转义
【发布时间】:2011-01-06 00:54:19
【问题描述】:

当我写入模型的 TextField 时,如何关闭 Django 的自动 HTML 转义?

【问题讨论】:

    标签: html django django-models textfield


    【解决方案1】:

    只需使用 django 的 safe 过滤器。在您的模板中,您将执行以下操作:

    {{ instance.my_text_field|safe }}
    

    【讨论】:

    • 作为警报,这允许 XSS 攻击。 Javascript标签可用于输入恶意代码。
    • 对,你应该小心这一点,只将safe过滤器应用于你可以信任的内容。这就是过滤器名称的含义; )
    【解决方案2】:

    一种方法是在模型中放置一个函数,该函数返回标记为安全的数据:

    from django.utils.safestring import mark_safe 
    
    class MyModel(models.Model): 
        my_textfield = models.TextField()
    
        def display_my_safefield(self): 
            return mark_safe(self.my_textfield)
    

    然后在模板中你必须使用:

    {{ instance.display_my_safefield }}
    

    【讨论】:

    • 这正是我所需要的 :) 非常感谢。
    • 如果你使用 django 的安全过滤器,你根本不需要修改模型。
    【解决方案3】:

    我认为做到这一点的更好方法就像@Daniel Vassallo 所描述的那样。

    为什么?

    因此,您可以对要显示的 HTML 代码进行一些安全操作,而无需转义,尤其是防止跨站脚本攻击 (XSS)。

    例如,您可以检查my_textfield 是否包含script 标签。
    如果是这样,将实例标记为恶意并返回my_textfield转义 版本(正常的Django 行为)。
    否则,请使用mark_safe 返回标记为安全的 HTML 代码。

    这里:

    from django.utils.safestring import mark_safe 
    
    class MyModel(models.Model): 
        my_textfield = models.TextField()
        is_malisious = models.BooleanField(default=False)
    
        def display_my_safefield(self):
            if '<script>' in self.my_textfield:
                self.is_malicious = True
                self.save()
                return self.my_textfield
            return mark_safe(self.my_textfield)
    

    所有这些都不需要迁移到数据库。

    替代方法

    我认为您可以通过覆盖模型的save() 方法来执行此安全操作,并包括针对其中的恶意内容的检查和任何其他必要操作。然后,如果您确保任何保存的内容都是安全的,您可以使用@bjunix 解决方案。

    【讨论】:

    • 如果攻击者使用例如 &lt;script&gt; 而不是你的 sn-p 不提供任何安全性。 &lt;script data-name='anything'&gt; 相反,它仍然可以在所有现代浏览器中运行。
    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    相关资源
    最近更新 更多