【发布时间】:2011-01-06 00:54:19
【问题描述】:
当我写入模型的 TextField 时,如何关闭 Django 的自动 HTML 转义?
【问题讨论】:
标签: html django django-models textfield
当我写入模型的 TextField 时,如何关闭 Django 的自动 HTML 转义?
【问题讨论】:
标签: html django django-models textfield
只需使用 django 的 safe 过滤器。在您的模板中,您将执行以下操作:
{{ instance.my_text_field|safe }}
【讨论】:
safe过滤器应用于你可以信任的内容。这就是过滤器名称的含义; )
一种方法是在模型中放置一个函数,该函数返回标记为安全的数据:
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 }}
【讨论】:
我认为做到这一点的更好方法就像@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> 而不是你的 sn-p 不提供任何安全性。 <script data-name='anything'> 相反,它仍然可以在所有现代浏览器中运行。