Rails3 和安全的 nl2br!

问题描述 投票:0回答:4

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

评论被抓取到文本区域中。

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

事实上,我可以做类似的事情

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
ruby-on-rails ruby-on-rails-3
4个回答
56
投票

正如 Ryan Bigg 所建议的那样,

simple_format
是完成这项工作的最佳工具:它“安全”并且比其他解决方案简洁得多。

所以对于@var:

<%= simple_format(@var) %>

如果您需要清理文本以去除 HTML 标签,您应该在 before 将其传递给

simple_format

之前执行此操作

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


2
投票

我能想到的最好方法是使用 sanitize 方法来删除除我们想要的 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 />') %>
有效


1
投票

这是我所做的

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

0
投票

另一种选择,而不是和/或与其他建议结合使用,就是简单地使用 CSS 以及规则

white-space: pre-wrap;
来渲染文本的元素。

它会导致像换行符和多个空格这样的空白被渲染而不是被忽略。

它非常类似于 html

<pre>
标签的默认渲染,但没有默认的等宽字体并且缺少换行。

© www.soinside.com 2019 - 2024. All rights reserved.