在Rails中对输入进行消毒,防止XSS和HTML注入。

9

我知道在视图中可以使用ActionView助手strip_tags方法来清洗输出,但是在将用户输入存储到数据库之前,最好的方法是什么?我应该找到一种方式将视图助手包含在我的控制器中并重用strip_tags方法吗?我认为Rails应该有全局可用的东西来做类似这样的事情。

4个回答

4

3
两年后,两个踩但没有评论 - 评论至少会帮助其他用户更清楚地了解事情。注意:在回答时,我们正在使用Rails 2,当时情况并不像现在这样好! - Reuben Mallaby

0

-1

为什么需要对用户输入进行清理?

通常情况下,只需要在打印或嵌入到较大的输出块中时,对用户输入进行严格的上下文感知编码/转义即可。


没有必要让恶意代码留在你的数据库中。对于 Web 应用程序的多个攻击向量已经很普遍了,这似乎是一个容易解决的问题,在我看来。深度防御,你知道的。 - phreakre
Rails 3采取了正确的方法。它自动将任何(包括用户输入的数据)输出到HTML中进行HTML转义,除了程序员指定为已经是HTML安全的特定项目。Rails 3进行深度防御,并且以正确而严谨的方式进行,数据在正确的位置和正确的时间进行转义。 - yfeldblum

-1
为什么要对用户输入进行消毒?这根本没有任何意义!你总是想要消毒(转义)输出,而不是输入,因为消毒的含义取决于你在使用内容的上下文。不存在一种字符串在任何情况下都是安全的。你不希望在数据库中有一堆被“消毒”过的字符串,它们只适用于应用程序当前使用的场景,因为明天你可能会用它们做其他事情。如果你的表示层正在做正确的事情(根据上下文转义内容),那么无论其中有多少引号、反斜杠或DROP TABLE语句,你都没问题。

在某些情况下,在将用户输入存储到数据库之前,对其进行“净化”处理是有意义的。例如,如果用户将他的姓氏输入为“<h1>Smith</h1>”,那么在数据库中存储该html标签就没有任何意义。在这种情况下,最好在将姓氏保存到数据库之前去除html标签。 - Zack Xu
原始问题涉及注入(XSS和HTML),在这种情况下,我认为清理总是错误的。但即使字符串中有垃圾数据,您认为清理会发现垃圾数据的机会有多大?对于算法来说,很难弄清楚哪部分是名称,哪部分不是名称。例如,当那个“&”符号是HTML实体的一部分时,它是“Smith&Wesson”这样的名称的一部分,还是什么时候呢?很快,您就会得到这个:http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/ - Enno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接