Django安全。处理用户输入。是html.strip_tags还是应该使用漂白剂?

时间:2014-07-23 00:14:23

标签: python django security input django-templates

我在一个小论坛上接受用户输入。这就是我对用户输入的处理方式:

  • 首先,在用户的cleaning_data [输入]上从django.utils.html调用“html.strip_tags”。

  • 将其保存到数据库中。 Postgre。

  • 查询文本并使用正则表达式将\ n替换为用户输入的br和显示空格。

  • 然后,我{{text | safe}}显示文本(如果我没有将其标记为安全,则不会在段落之间显示空格而是显示br标签)。

  • 最后,我在文本Autolinker.js上使用了一些jquery插件来检测和“urlize”超链接,并使用trunk8来控制其长度。

所以,因为我做{{t​​ext | safe}}我担心恶意输入,html.strip_tags足够吗?

有关strip_tags的文档写道:

“尝试从字符串中删除看起来像HTML标记的任何内容,即<>中包含的任何内容。绝对不保证提供的结果字符串完全是HTML安全的。所以绝对不能保证结果是strip_tag调用而不首先转义它,例如使用escape()。“

关于Python的Bleach的文档:

“Bleach的主要目标是清理允许包含某些HTML作为标记的用户输入,并将其包含在更大页面的内容中。”

因为不允许用户输入包含任何html,我的猜测是不需要Bleach ..但我是一个菜鸟,所以你的建议将不胜感激。

2 个答案:

答案 0 :(得分:2)

striptags

上引用docs
  

无安全保障

     

请注意,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>)。