Ruby on rails 呼叫flash消息有危险吗?

Ruby on rails 呼叫flash消息有危险吗?,ruby-on-rails,xss,ruby-on-rails-3,Ruby On Rails,Xss,Ruby On Rails 3,我想要一条类似以下内容的即时消息: “该确认链接无效或已过期。单击此处生成新链接。” 其中“单击此处”当然是指向应用程序中另一个操作的链接,可以在其中生成新的确认链接。两个缺点:第一,由于设置flash消息的控制器中没有定义link_to,因此我必须将link html放在自己的控制器中。没什么大不了的,但有点乱 第二:为了使链接能够在页面上正确显示,我必须在视图中使用flash display函数,所以现在看起来(使用Haml): 这让我停顿了一下。我在helpers和诸如此类的工具中编写的所

我想要一条类似以下内容的即时消息:

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

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

第二:为了使链接能够在页面上正确显示,我必须在视图中使用flash display函数,所以现在看起来(使用Haml):

这让我停顿了一下。我在helpers和诸如此类的工具中编写的所有其他html都是html,但是flash散列的内容存储在cookie客户端中,可以想象会被更改。我已经仔细考虑过了,我不认为这会导致XSS攻击,但无论如何我对XSS不是很了解

因此,有两个问题: 1.像这样永远保护所有flash内容有什么危险吗? 2.这个解决方案非常混乱(在控制器中使用HTML破坏了MVC,总是使用HTML保护所有flash内容),这让我觉得我做得不对。有没有一种更优雅、更像Rails的方法


我使用的是Rails 3.0.0.beta3。

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

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

我会将任何消息添加到
flash
时设置为安全的,您肯定知道它是安全的

比如说


类SomeController

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


-flash.每个do |名称、消息|
=内容标签:div,message

通过这种方式,您可以确保,如果您添加了一条不安全的新flash消息,它将在视图中被错误地设置为安全的

在这种情况下,
flash[:info]
消息被打印为
html\u safe
,并且
flash[:unsecure]
将被转义,因此不会执行用户恶意javascript代码


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

我不想通过html\u-safe——将所有flash消息都普遍使用来试探命运,因此,我决定将失败的确认链接尝试直接重定向到我无论如何都会链接到的url。我认为这是一个更简单、更优雅的解决方案。

这行不通,因为字符串的html\u安全属性不会在请求之间持久存在。在第二个请求中(重定向后),flash消息将从cookie中反序列化,并再次成为一个普通的、不安全的字符串。我想如果我用flash会有用的。现在,但我不是。。。无论如何,谢谢。好吧,我不知道这一点,但是你必须确保没有用户输入的消息,或者用户输入必须先转义,然后才能放入flash消息,我已经更新了我的答案!
- flash.each do |name, message|
  = content_tag :div, message.html_safe