在 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 解决方案。
【讨论】:
如果攻击者使用例如<script>
而不是你的 sn-p 不提供任何安全性。 <script data-name='anything'>
相反,它仍然可以在所有现代浏览器中运行。以上是关于在 Django 的 TextField 中禁用 HTML 转义的主要内容,如果未能解决你的问题,请参考以下文章
在 InputBarAccessoryView TextField 中处理(或禁用)拟我表情
如何在两个textField中至少包含一个字符之前禁用按钮? [重复]