我想要一条类似于:
的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。
答案 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消息,它将在视图中被误删。
在这种情况下, < / p>
flash[:info]
消息打印为html_safe
,flash[:unsecure]
将被转义,因此用户恶意javascript代码将不会被执行。
如果你知道消息中不存在任何未经过滤的用户输入,那么在flash消息上使用html_safe应该是安全的。