在 Django 的 TextField 中禁用 HTML 转义

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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; 相反,它仍然可以在所有现代浏览器中运行。

以上是关于在 Django 的 TextField 中禁用 HTML 转义的主要内容,如果未能解决你的问题,请参考以下文章

在 InputBarAccessoryView TextField 中处理(或禁用)拟我表情

快速禁用 UIwebView textField 中的键盘

如何在两个textField中至少包含一个字符之前禁用按钮? [重复]

TextField为空时如何禁用Button?

如何将 LongPressGestureRecognizer 添加到禁用的 TextField

SwiftUI - TextField 在 macOS 上的 List 中被禁用(不可编辑)