为了使其安全,必须在视图代码中的所有位置键入h
方法,这似乎是荒谬的(并且违反了DRY)。
有没有人为此提出一个聪明的解决方法?
答案 0 :(得分:4)
答案 1 :(得分:4)
你可以使用Erubis作为你的ERB引擎 - 它确实提供了自动转义功能。他们的基准测试标志着它比ERB快3倍。
http://www.kuwata-lab.com/erubis/
唯一的问题是它只适用于ERB,所以如果你的Haml或其他一些模板语言(比如我们)那么你就是SOL。我过去曾经使用过Erubis并没有遇到任何问题 - 在我们切换到(较慢的)Haml之前。
答案 2 :(得分:3)
您可以使用XSS_terminate过滤进入您应用的数据(保存时),而不是尝试使用h()在最后一秒捕获它。
理论上,这应该是足够的,你不应该做任何其他事情。
如果你想成为偏执狂(在安全方面并不是坏事),你应该同时做到这两点。
答案 3 :(得分:0)
Rails 3方法在视图方面绝对是最好的,因为它明确地跟踪每个字符串的安全性,这最终是您需要的(污点模式),以提供强大的解决方案。
然而,另一种方法是ActsAsTextiled所做的。这是重新定义属性访问器以清理和缓存结果,以便您始终默认获得清理输出。我喜欢这个而不是xss_terminate方法,它根本不会触及用户输入,因此您可以减少用户的投诉,并且数据不会被意外破坏,您可以稍后更改规则你忽略了什么。
我非常喜欢这种方法,我使用Sanitize gem ActsAsSanitiled编写了一个插件。它不像xss_terminate那样为您提供开箱即用的保护,但它也避免了不必要的副作用。在我的情况下,相对较少的文本字段实际上是由用户直接编辑的,所以我更喜欢审核它们并明确声明它们。