代码之家  ›  专栏  ›  技术社区  ›  PreciousBodilyFluids

是否有危险调用Flash消息html_safe?

  •  3
  • PreciousBodilyFluids  · 技术社区  · 14 年前

    我想要一个闪信,看起来像:

    “确认链接无效或已过期。单击此处生成新的。“

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

    第二:为了让链接在页面上正确显示,我必须在视图中保护flash显示功能,所以现在看起来像(使用haml):

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

    这让我停顿了一下。其他所有我HTML安全的东西都是我用helpers和其他东西写的HTML,但是flash散列的内容存储在cookie客户端,并且可以想象地被更改。我已经仔细考虑过了,我不知道这会如何导致XSS攻击,但我对XSS并不是很了解。

    所以,有两个问题: 1。总是使用HTML安全保存像这样的所有Flash内容有什么危险吗? 2。这个解决方案如此混乱(通过在控制器中使用HTML来打破MVC,总是安全地保存所有Flash内容),这一事实让我觉得我做错了。有没有一种更优雅,更像铁轨的方式来做到这一点?

    我使用的是Rails 3.0.0.beta3。

    2 回复  |  直到 14 年前
        1
  •  1
  •   PreciousBodilyFluids    14 年前

    我不想让所有的Flash消息都被HTML保护起来,所以我决定将失败的确认链接尝试直接重定向到我无论如何都会链接到的URL。我认为这是一个更简单、更优雅的解决方案。

        2
  •  0
  •   jigfox    14 年前

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

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

    我会给你留言的 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] 消息打印为 保险箱 flash[:unsecure] 将被转义,因此不会执行用户邪恶的javascript代码。

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