我在一个小论坛上接受用户输入。这就是我对用户输入的处理方式:
首先,在用户的cleaning_data [输入]上从django.utils.html调用“html.strip_tags”。
将其保存到数据库中。 Postgre。
查询文本并使用正则表达式将\ n替换为用户输入的br和显示空格。
然后,我{{text | safe}}显示文本(如果我没有将其标记为安全,则不会在段落之间显示空格而是显示br标签)。
最后,我在文本Autolinker.js上使用了一些jquery插件来检测和“urlize”超链接,并使用trunk8来控制其长度。
所以,因为我做{{text | safe}}我担心恶意输入,html.strip_tags足够吗?
有关strip_tags的文档写道:
“尝试从字符串中删除看起来像HTML标记的任何内容,即<>中包含的任何内容。绝对不保证提供的结果字符串完全是HTML安全的。所以绝对不能保证结果是strip_tag调用而不首先转义它,例如使用escape()。“
关于Python的Bleach的文档:
“Bleach的主要目标是清理允许包含某些HTML作为标记的用户输入,并将其包含在更大页面的内容中。”
因为不允许用户输入包含任何html,我的猜测是不需要Bleach ..但我是一个菜鸟,所以你的建议将不胜感激。
答案 0 :(得分:2)
在striptags
无安全保障
请注意,striptags不保证其输出完全是HTML安全的,特别是在无效的情况下 HTML输入。因此,永远不要将安全过滤器应用于striptags输出。如果 你正在寻找更强大的东西,你可以使用漂白剂 Python库,特别是它的干净方法。
我认为这里的答案是使用bleach
来剥离标记,就像bleach.clean(text,tags=[])
一样简单。另外,使用漂白剂linkefy
,您也可以照顾网址。
关于您的常规流程,如果字符串生成一次并多次查询...为什么您在保存时添加换行符和网址?
答案 1 :(得分:0)
如果您需要将输入标记为“安全”的唯一原因是它会显示您在用户键入换行符时插入的<br>
标记,那么您最好的方法是使用{{1过滤器。来自Django documentation:
换行符
使用适当的HTML替换纯文本中的换行符;单个换行符将成为HTML换行符(
linebreaks
),后面跟空行的新行将成为分段符(<br />
)。例如:
</p>
如果值为
{{ value|linebreaks }}
,则输出为Joel\nis a slug,
不要使用正则表达式在数据库中用<p>Joel<br />is a slug</p>.
替换换行符,而是在用户输入数据时将数据保留在那里。然后,您可以使用
<br>
这将首先从用户的输入中删除(大多数)HTML标记,然后为新行添加{{ text|striptags|linebreaks }}
和<br>
标记。但是,它不会将字符串标记为安全,因此用户输入中留下的任何标记都将被转义;只有<p>
创建的标签才会生效。
(请注意,如果您不想使用linebreaks
标记,则可以使用变体过滤器<p>
)。