【问题标题】:Any danger in calling flash messages html_safe?调用 Flash 消息 html_safe 有什么危险吗?
【发布时间】:2010-05-23 20:01:58
【问题描述】:

我想要一条类似于以下内容的 Flash 消息:

“该确认链接无效或已过期。单击此处生成一个新链接。”

“单击此处”当然是指向应用程序中另一个操作的链接,在该操作中可以生成新的确认链接。两个缺点:一,由于在设置 flash 消息的控制器中没有定义 link_to,我必须将链接 html 放入自己。没什么大不了的,但有点乱。

第二个:为了让链接在页面上正确显示,我必须对视图中的 flash 显示功能进行 html_safe,所以现在它看起来像(使用 Haml):

- flash.each do |name, message|
  = content_tag :div, message.html_safe

这让我停下来。我 html_safe 的所有其他内容都是我自己在 helpers 中编写的 HTML,但闪存哈希的内容存储在 cookie 客户端中,并且可以想象得到更改。我已经考虑过了,我不明白这会如何导致 XSS 攻击,但无论如何我对 XSS 并不是很了解。

所以,有两个问题: 1. 像这样总是 html_safe-ing 所有 flash 内容有什么危险吗? 2. 这个解决方案是如此混乱(通过在控制器中使用 HTML 来破坏 MVC,总是 html_safe-ing 所有 flash 内容)的事实让我觉得我做错了。有没有更优雅的 Rails 方式来做到这一点?

我正在使用 Rails 3.0.0.beta3。

【问题讨论】:

    标签: ruby-on-rails xss ruby-on-rails-3


    【解决方案1】:

    这取决于您对消息内容来自何处的确定程度。如果任何用户都可能操纵该消息,那么您不应该这样做!

    我不会这样做。因为您现在可能知道每个字符串都是安全的,但是如果您更改一个控制器并添加一条可能包含用户输入的消息,那么您就有可能存在漏洞。

    当任何消息html_safe 添加到flash 时,我会设置它,并且您肯定知道它是安全的。

    例如

    class SomeController < ApplicationController def some_action flash[:info] = 'Some safe text!'.html_safe flash[:unsecure] = User.find(1).signature #//evil code end end

    在你看来,你可以这样做:

    - flash.each do |name, message| = content_tag :div, message

    这样可以确保如果添加不安全的新 Flash 消息,它会在视图中被错误地设置为安全。

    在这种情况下,flash[:info] 消息打印为html_safeflash[:unsecure] 将被转义,因此不会执行用户邪恶的 javascript 代码。

    如果您知道消息中不可能有任何未经过滤的用户输入,那么在 flash 消息上使用 html_safe 应该是安全的。

    【讨论】:

    • 这不起作用,因为字符串的 html_safe 属性不会在请求之间持续存在。在第二个请求中(重定向之后),flash 消息将从 cookie 中反序列化并再次变为普通的非 html_safe 字符串。我认为如果我使用 flash.now 会起作用,但我不是......不过还是谢谢。
    • 好吧,我不知道这个,比你必须确保没有用户输入的消息,或者用户输入必须在它被放入闪存消息之前被转义,我'我更新了我的答案!
    【解决方案2】:

    我不想通过普遍使用 html_safe 对所有 Flash 消息进行测试来引诱命运,因此我决定将失败的确认链接尝试直接重定向到无论如何我都会将它们链接到的 url。我认为这是一个更简单、更优雅的解决方案。

    【讨论】:

      猜你喜欢
      • 2015-03-08
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 2011-06-28
      • 2012-08-30
      • 1970-01-01
      相关资源
      最近更新 更多