Rails3和安全nl2br!

时间:2010-05-16 15:50:21

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

我有一个系统供用户发表评论。

这些评论被写入文本区域。

我的问题是用br标签格式化注释以替换\ n

事实上,我可以做那样的事情

s.gsub(/\n/, '<br />')

但是包含在rails中的xss保护会转义br标签。

所以我可以这样做

s.gsub(/\n/, '<br />').html_safe

但是,所有标签都被接受,甚至是脚本....导致一个很大的安全问题

所以我的问题是:如何安全地使用br格式化文本?

由于

编辑: 现在,我添加了这个

  def sanitaze
    self.gsub(/(<.*?>)/, '')
  end

  def nl2br
    self.sanitaze.gsub(/\n/, '<br />').html_safe
  end

3 个答案:

答案 0 :(得分:54)

正如Ryan Bigg所说,simple_format是这项工作的最佳工具:它比其他解决方案更安全,更整洁。

所以@var:

<%= simple_format(@var) %>

如果您需要清理文本以删除HTML标记,则应在传递给simple_format

之前执行此操作

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

答案 1 :(得分:2)

我能想到的最好方法是使用清理方法除去我们想要的所有BR标签。

假设我们@var的内容为"some\ntext"

尝试<%= @var.gsub(/\n/, '<br />') %>不起作用。

尝试<%= h @var.gsub(/\n/, '<br />').html_safe %>不起作用且不安全。

尝试<%= sanitize(@var.gsub(/\n/, '<br />'), :tags => %w(br) %>工作。

我没有对此进行过很好的测试,但是它允许BR标记工作,并且替换了我添加了空格的虚拟脚本警报,所以它似乎正在完成它的工作。如果其他人有想法或者可以说这是一个安全的解决方案,请做。

更新

Jose Valim建议的另一个想法:

<%= h(@var).gsub(/\n/, '<br />') %>投放

答案 2 :(得分:1)

此处what I did

module ApplicationHelper
  def nl2br s
    sanitize(s, tags: []).gsub(/\n/, '<br>').html_safe
  end
end