【发布时间】:2009-08-18 14:45:05
【问题描述】:
必须在视图代码中到处输入h 方法以确保安全,这似乎很荒谬(并且违反了 DRY)。
有没有人想出一个聪明的解决方法?
【问题讨论】:
-
我没有解决方案,但这将是 Rails 3 中的默认行为
标签: ruby-on-rails security xss
必须在视图代码中到处输入h 方法以确保安全,这似乎很荒谬(并且违反了 DRY)。
有没有人想出一个聪明的解决方法?
【问题讨论】:
标签: ruby-on-rails security xss
DHH(Rails 的创建者)同意您的观点。 Rails 3 默认会转义输出。
【讨论】:
您可以使用 Erubis 作为您的 ERB 引擎 - 它确实提供自动转义。他们的基准测试表明它是 ERB 的 3 倍。
http://www.kuwata-lab.com/erubis/
唯一的问题是它仅适用于 ERB,所以如果您的 Haml 或其他一些模板语言(如我们),那么您就是 SOL。我过去使用过 Erubis 并且没有任何问题 - 在我们切换到(较慢的)Haml 之前。
【讨论】:
您可以使用 XSS_terminate 过滤进入您的应用程序的数据(保存时),而不是尝试在最后一秒使用 h() 捕获它。
理论上,这应该足够了,您不需要做任何其他事情。
如果你想变得偏执(这在安全的背景下并不是一件坏事),你应该两者兼而有之。
【讨论】:
Rails 3 方法在视图方面绝对是最好的,因为它明确地跟踪每个字符串的安全性,这最终是您需要的(污点模式),以获得强大的解决方案。
但是,ActsAsTextiled 还有另一种方法。那就是重新定义属性访问器以清理和缓存结果,以便您始终获得默认的清理输出。与 xss_terminate 方法相比,我喜欢它的地方在于它根本不会触及用户输入,因此您收到的用户投诉更少,并且数据不会被意外破坏,您可以稍后再更改规则,如果你忽略了一些东西。
我非常喜欢这种方法,我使用 Sanitize gem ActsAsSanitiled 编写了一个插件。它不像 xss_terminate 那样为您提供开箱即用的全面保护,但它也避免了不必要的副作用。在我的例子中,相对较少的文本字段实际上是由用户直接编辑的,所以我更喜欢审核它们并明确声明它们。
【讨论】: