我使用Google App Engine,我遇到了下一个问题。我需要在“数据存储”文本中存储“< p> My text< / p>”。当我使用Django 0,96的模板时,一切都井然有序。文本显示有预期的标记。但我将模板更改为Django 1.2的模板,我的标记已更改为HTML实体。如何解决这个问题?
P.S。我不使用Django助手或任何其他第三方库。
如果过滤模式是模板的默认模式,那么使用“safe”或“autoescape on”看起来就像是黑客。我试图理解Django的作者是如何想象自己使用模板的。我不认为除了材料出版物之外的记者也为每篇文章创建模板。即必须有一些允许格式文本,tinyMCE或Markdown的方法。但是当标记存储在DB中时,模板会将其显示为html实体。
当然,可以使用过滤器“safe”或“autoescape on”。但是我不明白在大多数情况下它会禁用模板中的清理。
可能我不对吗?哪里我错了?答案 0 :(得分:2)
使用safe
filter或autoescape off
模板标记。确保您了解XSS的优先级;用户输入的内容不应被视为安全。
评论:
{{ body|safe }}
等同于autoescape块。我不知道为什么这样做不起作用,除非T. Abilo是对的并且数据存储已经引用了它。
TinyMCE很难防范XSS,因为它会向你发送表现性的html。 Markdown编辑器(如MarkItUp)更容易,因为您可以在服务器端安全地渲染降价。因为它是你需要一个过滤器除了表示html白名单之外的所有内容:{{ body|presentationalonly }}
。 This one可以胜任这项工作。 Bleach适用于更严格的白名单。
答案 1 :(得分:0)
我遇到了类似的问题,所以也许您可以查看以下内容:
"<p><"
等的标记吗?.replace("<", "<").replace(">", ">")
,同时仍使用autoescape或类似内容