【问题标题】:Any clever workaround to avoid having to type the h method everywhere?有什么聪明的解决方法可以避免在任何地方都输入 h 方法吗?
【发布时间】:2009-08-18 14:45:05
【问题描述】:

必须在视图代码中到处输入h 方法以确保安全,这似乎很荒谬(并且违反了 DRY)。

有没有人想出一个聪明的解决方法?

【问题讨论】:

  • 我没有解决方案,但这将是 Rails 3 中的默认行为

标签: ruby-on-rails security xss


【解决方案1】:

DHH(Rails 的创建者)同意您的观点。 Rails 3 默认会转义输出。

【讨论】:

  • 是的,但在那之前我可能需要输入一千个 h 调用:) 我正在尝试找到一个可以减轻这种痛苦的 gem 或插件。
  • 我认为这可能比 DHH 更 Yehuda。 ;)
【解决方案2】:

您可以使用 Erubis 作为您的 ERB 引擎 - 它确实提供自动转义。他们的基准测试表明它是 ERB 的 3 倍。

http://www.kuwata-lab.com/erubis/

唯一的问题是它仅适用于 ERB,所以如果您的 Haml 或其他一些模板语言(如我们),那么您就是 SOL。我过去使用过 Erubis 并且没有任何问题 - 在我们切换到(较慢的)Haml 之前。

【讨论】:

  • 酷。这可能正是我所需要的。那么,唯一的问题是语法是否与 erb 兼容,所以如果您需要将项目从 erubis 切换回 erb,那会有多痛苦?
  • 看起来我之前的问题没有实际意义,因为它们都实现了 eRuby 标记语言。至少从理论上讲,这意味着我应该能够在不更改代码的情况下来回切换。
【解决方案3】:

您可以使用 XSS_terminate 过滤进入您的应用程序的数据(保存时),而不是尝试在最后一秒使用 h() 捕获它。

理论上,这应该足够了,您不需要做任何其他事情。

如果你想变得偏执(这在安全的背景下并不是一件坏事),你应该两者兼而有之。

【讨论】:

  • 我已经使用 xss_terminate(披露:我写的)和 Erubis 的自动转义来获得双重保护,但是随着 Rails 的更新,很难继续使用它。 xss_terminate 并不完美——您仍然需要注意从用户输入发出 HTML 的情况,但与 Rails 默认设置相比,它大大减少了您的攻击配置文件。
【解决方案4】:

Rails 3 方法在视图方面绝对是最好的,因为它明确地跟踪每个字符串的安全性,这最终是您需要的(污点模式),以获得强大的解决方案。

但是,ActsAsTextiled 还有另一种方法。那就是重新定义属性访问器以清理和缓存结果,以便您始终获得默认的清理输出。与 xss_terminate 方法相比,我喜欢它的地方在于它根本不会触及用户输入,因此您收到的用户投诉更少,并且数据不会被意外破坏,您可以稍后再更改规则,如果你忽略了一些东西。

我非常喜欢这种方法,我使用 Sanitize gem ActsAsSanitiled 编写了一个插件。它不像 xss_terminate 那样为您提供开箱即用的全面保护,但它也避免了不必要的副作用。在我的例子中,相对较少的文本字段实际上是由用户直接编辑的,所以我更喜欢审核它们并明确声明它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 2017-04-16
    • 2020-04-27
    • 2013-02-25
    • 2014-04-01
    • 1970-01-01
    • 2012-07-25
    • 2012-04-16
    相关资源
    最近更新 更多