【问题标题】:Rails 3 - Problems with raw and html_safeRails 3 - raw 和 html_safe 的问题
【发布时间】:2012-03-23 05:16:42
【问题描述】:

在 Rails 3.0.10 中使用 raw 和 html_safe 方法,我仍然无法取消转义 html 并将其显示为 Content 而不是 <strong>Content</strong>

@object.property.html_safe 给我<strong>Some content</strong>

<%= raw(@object.property) %> 也给我<strong>Some content</strong>

我看过这些帖子并尝试实施他们的修复:

我还观看了关于 xss 保护的 Ryan Bates Railscasts 剧集:http://railscasts.com/episodes/204-xss-protection-in-rails-3?view=comments

我根据他的示例创建了一个名为 safe 的辅助方法,我确保字符串内容应用了 html_safe 方法:

def safe(content)
    "#{content}".html_safe
end

然后我在我的模型上调用它:safe(@object.property)

内容仍然没有按预期显示。

我也尝试过使用 sanitize 方法,但无济于事。

这可能是什么原因造成的?

【问题讨论】:

  • 你期待什么输出,究竟是什么?您的前两个代码示例完全符合他们的预期。你真的是说你想让它逃脱吗? (例如<strong>Some content...
  • 只是试图让实际的 html 显示 - 而不是标签。更新了具体问题。

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


【解决方案1】:

这是另一种选择,也许是更好的选择。使用下面的 sn-p。

plain_text = strip_tags(html_input)

这里是文档的链接。enter link description here

【讨论】:

    【解决方案2】:

    好的,看来我现在可以使用它了。

    查看 Ruby 文档,发现 CGI 类和 unescapeHTML 方法。

    我在表单中使用富文本编辑器将文本保存到数据库。显然,由于 html 是作为转义发送到数据库的,所以我需要撤消转义,然后对其调用 html_safe。

    这是它在数据库中的显示方式:<strong>howdy</strong>

    我将它应用到我的辅助方法中,现在 html 显示为 html 而不是标签。

    def safe(content)
      "#{ CGI::unescapeHTML(content) }".html_safe
    end
    

    这可行,但如果有更好的方法来处理这种情况,我愿意接受建议。

    更新


    我正在尝试使用 Rails 辅助方法来尝试防止文本以转义形式保存到数据库中(这将解决我的问题,从那时起我就不必取消转义它了)。

    事实证明,我使用的富文本编辑器正在对 html 进行编码 - 您必须在 javascripts 对象文字符号中将 encoded: false 的属性传递给它。

    因此,如果您像我一样,费尽心思试图找出 Rails 将文本作为编码保存到数据库的原因 - 您实际上可能需要调整富文本编辑器本身的配置。

    现在我可以删除 CGI 类并将其用作助手:

    def safe(content)
      "#{ content }".html_safe
    end
    

    希望其他人也会觉得这很有帮助。

    【讨论】:

    • 如果您打算将其呈现为非转义:),则处理它的更好方法是不在数据库中存储转义的HTML。
    • 我已经尝试在表单的 text_area 上使用 raw 和 html_safe 方法,但它仍然将其存储为转义。如何防止表单将其保存为转义?
    • 也许就该问题提出另一个问题?
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多