Rails3和安全nl2br!

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

评论被抓到一个文本区域。

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

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

s.gsub(/\n/, '
')

但是包含在rails中的xss保护逃脱了br标签。

所以我能做到这一点

s.gsub(/\n/, '
').html_safe

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

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

谢谢

编辑:目前,我已经添加了这个

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

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

所以@var:

 <%= simple_format(@var) %> 

如果您需要清理文本以删除HTML标记,则应将其传递给simple_format 之前执行此simple_format

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

我可以想到的最好的方法是使用sanitize方法去除除我们想要的BR标签以外的所有标签。

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

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

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

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

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

更新:

Jose Valim建议的另一个想法:

<%= h(@var).gsub(/\n/, '
') %>
工作

这是我做的 :

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