【问题标题】:escape HTML output but no line-breaks转义 HTML 输出但没有换行符
【发布时间】:2011-05-03 10:16:42
【问题描述】:

我的模型中有一个描述文本字段。 不,我想在显示页面上添加此描述。 但是由于没有换行符,文本变得难看。

如果我用<br/> 替换它们,那么导轨会用它们逃脱。 所以我尝试使用 raw() 方法。 我想转义错误的 HTML,但在我的输出中有换行符。

我最终得到了一些丑陋的代码。

raw(h(@place.description.gsub("\n","#linebreak#")).gsub("#linebreak#","<br/>"))

你有什么建议吗?

【问题讨论】:

    标签: ruby-on-rails-3


    【解决方案1】:

    你应该使用 simple_format 助手:

    <%= simple_format @place.description %>
    

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

    【讨论】:

    【解决方案2】:

    3 年后,但提供一个好的工作解决方案永远不会太晚

    这将转义除换行符以外的所有 HTML 字符(兼容 Linux、Windows 和 Mac)

    html_escape(@place.description).gsub(/(?:\n\r?|\r\n?)/, '<br />').html_safe
    

    【讨论】:

      【解决方案3】:

      就是你要找的东西

      @place.description.html_safe.gsub("\n", '<br/>')
      

      ?但转念一想,html_safe 这样的用法难道不会让网站更容易受到 XSS 攻击吗? (因为它假定description 是安全的)。

      所以不是更好的解决方案

      <%= (h @place.description).gsub("\n", '<br/>') %>
      

      一开始我以为

      <%= (h @place.description).gsub("\n", '<br/>'.html_safe) %>
      

      是必需的,但实际上两个版本都可以使用。然后我通过向description添加一些HTML标签进行测试,它被转义到&amp;lt;等,所以它确实可以防止XSS攻击。

      【讨论】:

      • 我在下面发布了我的解决方案。
      【解决方案4】:

      这是一个可行的解决方案:

      <%= sanitize(@place.description.gsub("\n", "<br />"), :tags => %w(br), :attributes => %w()) %>
      

      更多阅读:

      Parsing newline characters in textareas without allowing all html tags

      文档:

      http://api.rubyonrails.org/classes/ActionView/Helpers/SanitizeHelper.html

      来自消毒:

      此清理助手将对所有标签进行 html 编码并去除所有未明确允许的属性。

      它还会去除带有无效协议的 href/src 标签,尤其是 javascript:。它尽最大努力对抗黑客可能使用的任何技巧,例如输入 unicode/ascii/hex 值以通过 javascript: 过滤器。查看广泛的测试套件。

      您可以使用 :tags 选项指定允许的标签,使用 :attributes 选项指定属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 2015-10-13
        • 2017-06-23
        • 1970-01-01
        相关资源
        最近更新 更多