当我往模型的TextField中写入内容时,如何关闭Django的自动HTML转义?
当我往模型的TextField中写入内容时,如何关闭Django的自动HTML转义?
只需使用Django的safe过滤器即可。在模板中,您可以这样做:
{{ instance.my_text_field|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 data-name='anything'>
代替<script>
,您的代码片段将无法提供任何安全保障,因为它仍将在所有现代浏览器中运行。 - Lis