【问题标题】:Html escaping in a Rails 3 view在 Rails 3 视图中转义 HTML
【发布时间】:2010-08-26 09:39:42
【问题描述】:

我正在使用 Rails 3。我想在 erb 模板中显示生成的 html 片段

<%= "<div>Foo Bar</div>" %>

Rails 对 div 标签进行编码。

如果我在 Rails 2 中是正确的,&lt;%=h 会导致 html 转义。好像在 Rails 3 中改了。如何在 Rails 3 中插入​​不编码的 html 片段?

问候, 阿列克谢。

【问题讨论】:

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


    【解决方案1】:

    我假设编码是指 html 转义:

    要在 Rails 3 中输出原始 html,您可以使用三种不同的方法。

    1. 您可以使用 raw 帮助器输出原始 html

      <% some_string = "<div>Hello World!</div>" %>
      <%= some_string %>
      <!-- outputs: &lt;div&gt;Hello Worlds!&lt;/div&gt; -->
      <%=raw some_string %>
      <!-- outputs: <div>Hello Worlds!</div> -->
      

      更多信息:ActionView::Helpers::OutputSafetyHelper#raw

    2. 您可以将字符串标记为html_safe

      <% some_string = "<div>Hello World!</div>".html_safe %>
      <%= some_string %>
      <!-- outputs: <div>Hello World!</div> -->
      

      更多信息:String#html_safeActiveSupport::SafeBuffer#new

    3. 您可以使用 sanitize 清理您的输出

      <%=sanitize "<div>Hello World!</div>", tags: %w( div ) %>
      

      更多信息:ActionView::Helpers::SanitizeHelper#sanitze

    更多信息:

    【讨论】:

    • 这是正确的,但我认为值得注意的是,通常更安全的方法是使用 &lt;%= content_tag :div, "Hello World!" %&gt; 这不涉及将潜在危险字符串标记为安全。
    • 如果文本像示例中一样简单,您是对的,但我相信 Hello World 是 OP 存储在数据库中的示例文本,因此他不能使用 @987654334 @ 因为它也可以是除包含所有内容的 &lt;div/&gt; 之外的任何内容,并且此 div 中可能有任意数量的 html 标记。如果你举个例子,最简单也是最快的方法是完全传递 erb 并在任何 erb 标签之外写 &lt;div&gt;Hello World&lt;/div&gt;
    • 如果您想要一个带有条件标签选项的简短解决方案,则为“raw”+1:>Ticket number 3
    • 不要忘记“sanitize”,就像 raw 一样使用,但会删除 javascript 和不受信任的内容!
    • @dtt101 我用sanitize的信息更新了我的答案
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签