【问题标题】:Being html_safe in Rails while retaining html entities?在保留 html 实体的同时在 Rails 中保持 html_safe?
【发布时间】:2012-11-05 18:38:12
【问题描述】:

假设我正在输出一个帖子标题,在我们的数据库中,它是 Hello Y’all - 我可以不使用 .html_safe 输出它,但是它不会在 html 中输出为 @987654323 @?

也就是说,如果用户从使用印刷正确撇号的文字处理器复制帖子标题,我会得到乱码输出,因为它将数据库中的& 转义为&。当然,我希望将数据库中的标题 Bonnie & Clyde 输出为 Bonnie & Clyde,因为这是正确的 HTML...

有安全的方法吗?

【问题讨论】:

  • 我不想将其标记为.html_safe 或使用raw(),因为这会打开我们的xss。我只是不希望我的数据库中已经是 html 实体的东西被双重转义。

标签: ruby-on-rails html-entities actionview


【解决方案1】:

使用ActionView::Helpers::SanitizeHelper

<%= "Hello Y&#8217;all" %>
<%= sanitize "Hello Y&#8217;all" %>

将产生:

Hello Y&#8217;all
Hello Y’all

【讨论】:

  • 这似乎是最好的答案,但请注意,默认情况下,sanitize 允许 HTML 标记和属性的子集。如果您不想允许这些,请这样称呼它:&lt;%= sanitize("Hello Y&amp;#8217;all", tags: [], attributes: []) %&gt;。这是WhitelistSanitizer 的文档,默认使用:github.com/rails/rails-html-sanitizer#whitelistsanitizer
  • 感谢 Maciej 和 Stephen,这正是我所需要的!
【解决方案2】:

SafeBuffer calls ERB::Util.h for strings that aren't html_safe,因此您可以在首次将字符串保存在数据库中时,在 ERB::Util.h(your_string) 上使用 gsub 并将 &amp;amp;[code] 的实例替换为 &amp;[code];。这样你的字符串首先被清理

您需要的电话是ERB::Util.h(your_string).gsub(/&amp;amp;(#x?[\da-fA-F]+;)/, '&amp;\1')

然后,当您需要显示该特定字符串时,请在其上调用 html_safe

【讨论】:

    【解决方案3】:

    有 3 种方法可以做到这一点:

    1: "string".htmlsafe
    2: <%= raw "string" %>
    3. <%== "string" %>
    

    我认为您应该使用 作为参数,将 .to_s 应用到它,然后简单地将 html_safe 应用到它。因此使用第二个选项是安全的。

    【讨论】:

    • 我在上面添加了一条评论-我不想使用html_safe,因为用户提交的帖子标题可能包含像&lt;script&gt;alert('foo;')&lt;/script&gt;这样的恶意代码
    • 所以我认为你应该使用 因为它需要参数,将 .to_s 应用于它,然后它只是将 html_safe 应用于它。因此使用 raw 是安全的
    • 即我在说什么, raw 适用于 to_s 它得到的参数。你可以写任何东西,你会从 raw 中得到 html_safe,因为它首先将参数转换为字符串。所以任何恶意代码都是 html_safe
    【解决方案4】:

    &lt;%= raw "Y&amp;amp;#8217;all" %&gt;&lt;%== "Y&amp;amp;#8217;all" %&gt; 是两种可能。

    【讨论】:

    • 对不起,如上所述,我不想将整个字符串标记为 html_safe 或使用 raw,因为用户提交的帖子标题可能包含恶意内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    相关资源
    最近更新 更多