【问题标题】:Rails3 and safe nl2br !Rails3 和安全的 nl2br !
【发布时间】:2010-05-16 15:50:20
【问题描述】:

我有一个系统让用户能够发布 cmets。

cmets 被抓取到一个 textarea 中。

我的问题是用 br 标签格式化 cmets 来替换 \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

【问题讨论】:

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


    【解决方案1】:

    正如 Ryan Bigg 所建议的那样,simple_format 是完成这项工作的最佳工具:它“安全”并且比其他解决方案更整洁。

    所以对于@var:

    <%= simple_format(@var) %>
    

    如果您需要清理文本以去除 HTML 标记,您应该这样做将其传递给simple_format

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

    【讨论】:

    • 工作就像一个魅力,非常感谢你和 Ryan 的建议!
    • simple_format 可能通常是最好的解决方案,但它会将

      标签放在您的文本周围和(有时)内部,所以我最终使用了&lt;%= raw(h(comment.text).gsub(/\n/,"&lt;br /&gt;\n")) %&gt;

    • @amoebe 您可以将:wrapper_tag 设置为nil:wrapper_tag - String representing the wrapper tag, defaults to "p".
    • @Chloe 似乎对我不起作用,然后只输出空标签:simple_format("a\n b\n\n c", {}, wrapper_tag: nil) =&gt; "&lt;&gt;a\n&lt;br /&gt; b&lt;/&gt;\n\n&lt;&gt; c&lt;/&gt;"
    【解决方案2】:

    我能想到的最好方法是使用 sanitize 方法去除除我们想要的 BR 标记之外的所有标记。

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

    尝试&lt;%= @var.gsub(/\n/, '&lt;br /&gt;') %&gt; 不起作用。

    尝试&lt;%= h @var.gsub(/\n/, '&lt;br /&gt;').html_safe %&gt; 无效且不安全。

    尝试&lt;%= sanitize(@var.gsub(/\n/, '&lt;br /&gt;'), :tags =&gt; %w(br) %&gt; WORKS。

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

    更新:

    Jose Valim 提出的另一个想法:

    &lt;%= h(@var).gsub(/\n/, '&lt;br /&gt;') %&gt; 工作

    【讨论】:

    • 感谢您的贡献 :) 我要试试这个 :)
    • “另一个想法”满足了我的需求。 simple_format 将所有内容都包装在 &lt;p&gt;&lt;/p&gt; 中注意:我需要添加 .html_safe (rails 3.2)
    【解决方案3】:

    这里是what I did

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

    【讨论】:

      猜你喜欢
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 2011-11-19
      • 2011-09-15
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      相关资源
      最近更新 更多