2010-05-23 50 views
3

我想要一个类似如下的Flash消息:调用flash消息html_safe会有危险吗?

“该确认链接无效或过期,点击此处生成一个新消息。

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

号之二:为了让链接,其实我有html_safe在查看Flash显示功能在网页上正常显示,所以现在它看起来像(使用Haml的):

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

这使我暂停。一切我html_safe已经HTML我已经写了自己的助手和whatnot,但闪存哈希的内容存储在客户端的cookie,可以想像会改变。我已经考虑过了,我不明白这是如何导致XSS攻击的,但是XSS对我来说并不是很了解。

所以,有两个问题: 1.总是html_safe-flash这样的所有内容都有危险吗? 2.这个解决方案非常混乱(通过在控制器中使用HTML来打破MVC,总是html_safe - 所有flash内容)这一事实让我觉得我正在讨论这个错误。有没有更优雅的Rails-ish方式来做到这一点?

我正在使用Rails 3.0.0.beta3。

回答

1

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

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消息t帽子不安全,错误地将视线安全放置。

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

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

+0

这不起作用,因为字符串的html_safe属性不会在请求之间持续存在。在第二个请求(重定向之后),flash消息将从cookie反序列化并再次成为正常的非html_safe字符串。我认为这将工作,如果我使用flash.now,但我不是......谢谢无论如何。 – PreciousBodilyFluids 2010-05-23 20:55:27

+0

好吧,我不知道这一点,比你必须确保没有用户输入消息,或者用户输入必须在它被放入闪光消息之前被转义,我已经更新了我的答案! – jigfox 2010-05-23 21:18:19