调用flash消息html_safe有危险吗?

时间:2010-05-23 20:01:58

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

我想要一条类似于:

的Flash消息

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

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

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

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

这让我停下来。我html_safe的其他所有东西都是HTML我自己写的帮助器和诸如此类的东西,但是flash哈希的内容存储在cookie客户端,并且可以想象地被改变。我已经考虑过了,我不知道这会如何导致XSS攻击,但是XSS并不是我对此有很好理解的东西。

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

我正在使用Rails 3.0.0.beta3。

2 个答案:

答案 0 :(得分:1)

我不想通过html_safe全部闪存消息来诱惑命运,所以我决定将失败的确认链接尝试直接重定向到我将链接它们的url。我认为这是一种更简单,更优雅的解决方案。

答案 1 :(得分:0)

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

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

当我将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代码将不会被执行。 < / p>

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