在 Rails 中清理输入 XSS 和 HTML 输入
Posted
技术标签:
【中文标题】在 Rails 中清理输入 XSS 和 HTML 输入【英文标题】:Sanitize input XSS and HTML input in rails 【发布时间】:2010-12-07 17:10:49 【问题描述】:我知道我可以在我的视图中使用 ActionView 帮助器 strip_tags
方法来清理输出,但是在将用户输入保存到我的数据库之前清理用户输入的最佳方法是什么?我应该找到一种方法将视图助手包含在我的控制器中并重用 strip_tags 方法吗?我认为 Rails 会在全球范围内提供一些东西来做这样的事情。
【问题讨论】:
【参考方案1】:xss_terminate 插件呢?
【讨论】:
2 年后,两次投票都没有 cmets - cmets 至少可以帮助其他用户更清楚地了解情况。注意:在回答时我们使用的是 Rails 2,但情况不如现在好!【参考方案2】:也许清理 gem:http://wonko.com/post/sanitize
【讨论】:
【参考方案3】:为什么需要清理用户的输入?
通常,只要您打印用户输入或将其嵌入到更大的输出块中,您只需对用户输入进行严格的、上下文感知的编码/转义。
【讨论】:
将恶意代码留在数据库中毫无意义。 Web 应用程序中的多个攻击向量已经很普遍,这似乎是一件容易修复的事情,IMO。纵深防御,你知道吗? Rails 3 采用了正确的方法。它会自动对输出到 html 中的任何内容(包括用户输入的数据)进行 html 转义,但程序员指出的那些特定项目已经是 html 安全的。 Rails 3 进行了深度防御,并且以正确和严格的方式进行,数据在正确的位置和正确的时间被转义。【参考方案4】:为什么要清理用户输入?这甚至没有任何意义!您总是希望清理(转义)输出,而不是输入,因为清理的含义取决于您在其中使用内容的上下文。在任何上下文中都没有像字符串这样安全的东西。无论您的应用程序今天使用什么场景,您都不希望数据库中有一堆“安全”的错位字符串,因为明天,您可能想要对它们做一些不同的事情。如果您的表示层做的是正确的事情(根据上下文转义内容),那么您就可以了,无论其中有多少引号、反斜杠或 DROP TABLE 语句。
【讨论】:
在某些情况下,在将用户输入存储到数据库之前对其进行“清理”是有意义的。例如,如果用户输入他的姓氏为“Smith
”,那么将 html 标记存储在数据库中是没有意义的。在这种情况下,最好在将姓氏保存在数据库中之前去掉 html 标记。 与注入(XSS 和 HTML)相关的原始问题,在这种情况下,我认为消毒是总是磨损的。但是,即使您以某种方式在字符串中找到了垃圾,那么您有多少机会通过消毒来找到垃圾?算法很难确定哪些部分是名称,哪些不是名称。例如,什么时候是 HTML 实体的 & 部分,什么时候是像“Smith & Wesson”这样的名称的一部分?很快,你就会得到这个:kalzumeus.com/2010/06/17/…以上是关于在 Rails 中清理输入 XSS 和 HTML 输入的主要内容,如果未能解决你的问题,请参考以下文章
Rails 4:使用内置 HTML 清理时禁用自动 CSS 清理