不要在轨道上的ruby中转义html

时间:2010-10-14 10:38:53

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

rails 3似乎逃脱了一切,包括html。我尝试过使用raw()但它仍然逃脱了html。有解决方法吗?这是我正在使用的帮手(/helpers/application_helper.rb):

module ApplicationHelper
  def good_time(status = true)
    res = ""
    if status == true
      res << "Status is true, with a long message attached..."
    else
      res << "Status is false, with another long message"
    end
  end
end

我使用此代码在视图中调用帮助程序:

<%= raw(good_time(true)) %>

2 个答案:

答案 0 :(得分:86)

您可以像这样使用.html_safe

def good_time(status = true)
  if status
    "Status is true, with a long message attached...".html_safe
  else
    "Status is false, with another long message".html_safe
  end
end

<%= good_time(true) %>

答案 1 :(得分:3)

我遇到了同样的事情并且发现了比使用html_safe更安全的解决方案,特别是一旦你引入了动态的字符串。

首先,更新的代码:

def good_time(long_message1, long_message2, status = true)
  html = "".html_safe
  html << "Status is #{status}, "
  if status
    html << long_message1
  else
    html << long_message2
  end
  html
end

<%= good_time(true) %>

如果内容不安全,则会转义long_message内容,但如果安全,则将其转义为

这样可以"long message for success & such."正确显示,但也可以转义"malicious message <script>alert('foo')</script>"

解释归结为这一点 - 'foo'.html_safe返回一个ActiveSupport :: SafeBuffer,除了一个以外,它在每个方面都像String一样:当你将一个String附加到一个SafeBuffer时(通过调用+或&lt;&lt; ),其他字符串在被附加到SafeBuffer之前进行HTML转义。当您将另一个SafeBuffer附加到SafeBuffer时,不会发生转义。 Rails使用SafeBuffers渲染您的所有视图,因此上面更新的方法最终为Rails提供了一个我们已经控制的SafeBuffer,可以根据需要执行long_message&#34;&#34;&#34; 34;而不是&#34;总是&#34;。

现在,这个答案的功劳完全归功于Henning Koch,并且在Everything you know about html_safe is wrong更详细地解释了 - 我的上述回顾只是试图提供解释的本质,因为这个链接曾经模具