在Django的TextField中禁用HTML转义

33

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

3个回答

91

只需使用Django的safe过滤器即可。在模板中,您可以这样做:

{{ instance.my_text_field|safe }}

2
作为警告,这可能导致XSS攻击。JavaScript标签可用于输入恶意代码。 - Filipe
1
没错,你应该小心处理这个问题,并且只对你可以信任的内容应用“safe”过滤器。这就是过滤器名称的含义;) - bjunix

19

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

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

6
如果使用 Django 的 safe 过滤器,您无需修改模型。 - bjunix

-1

我认为更好的方法是像@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的解决方案。


如果攻击者使用<script data-name='anything'>代替<script>,您的代码片段将无法提供任何安全保障,因为它仍将在所有现代浏览器中运行。 - Lis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接