【问题标题】:What is the meaning of "h" in "<%=h [ ...] %>"?“<%=h [ ...] %>”中的“h”是什么意思?
【发布时间】:2010-09-22 17:50:18
【问题描述】:

当我生成默认脚手架时,show.html.erb 上的显示标签有

<%=h @broker.name %>

我知道&lt;%&lt;%= 之间的区别。 “h”是做什么的?

【问题讨论】:

    标签: ruby-on-rails ruby templates


    【解决方案1】:

    html 转义。这是一种将 之类的内容转换为数字字符引用的方法,这样渲染就不会破坏您的 html。

    【讨论】:

    • 在 Rails 3 中这是自动完成的,因此不需要。
    • @lulalala 你能提供一个链接来支持你声称这是在 Rails 3(和 4)中自动完成的吗?
    • @bfcoder,这在所有当前的 Rails 指南和文档中。任何不在 SafeBuffer 实例中的字符串都将在视图中进行 html 转义,但如果需要,您仍然可以调用其他转义方法(如 json 等)。我认为这个解释相当完整:makandracards.com/makandra/…
    • @JasonTrue 感谢那篇文章!支持该主张的最出色的解释。
    【解决方案2】:

    &lt;%=h 实际上发生了两件事。您正在打开一个 erb 标签 (&lt;%=) 并调用 Rails 方法 h 来转义所有符号。

    这两个调用是等价的:

    <%=h person.first_name %>
    <%= h(person.first_name) %>
    

    h 方法通常用于从用户输入表单中转义 HTML 和 Javascript。

    【讨论】:

    • 我得到了 吗?如果不是,为什么不...即, h() 解决了什么具体问题?也就是说,如果你不调用 h() 方法,你会得到什么。
    【解决方案3】:

    h 是来自ERB::Util 类的html_escape 的方法别名。

    【讨论】:

      【解决方案4】:

      Rack 中还有一种方法可以转义 HTML Rack::Utils.escape_html,以防您在 Metal 中并想转义一些 HTML。

      【讨论】:

        【解决方案5】:

        派对迟到了,但我要进一步解释 html_escape 正在做什么,希望能帮助像我这样的其他菜鸟了解正在发生的事情。 Rails 3 和更高版本现在自动转义所有输出,因此需要html_escape aka h() 的情况要少得多。其中最值得注意的是当您打算在演示者类等中使用 html 构建链接时使用 html_safe 方法时。例如:

        #some_view.html.erb
        <span><%= @user.name %></span>  #This is 100% fine and will be automatically escaped by Rails 3+
        #Output =>  <span>Brian Kunzig</span>
        
        #Now say we want a link with html that we need preserved!  OMG WHAT ARE DO??
        <%=link_to "<span><i class='fa fa-user'></i>#{@user.name}</span>".html_safe  #DANGER!!!
        

        上面的链接可能会导致严重的问题,并使您面临各种 xss(跨站点脚本)攻击。最简单的例子,如果用户将他们的名字保存为"&lt;script&gt;alert('omg');&lt;/script&gt;",而您在上面使用了html_safe,这将导致任何呈现其假定名称的页面都会收到警告说'omg'!这是一个重大问题。为避免这种情况:

        <%=link_to "<span><i class='fa fa-user'></i>#{h(@user.name)}</span>".html_safe #Winning!
        

        通过转义用户提供的可能受污染的数据,我们就可以无家可归了!

        【讨论】:

          【解决方案6】:

          h 只是 html_escape 的别名。它是一种常用的实用方法,用于从用户输入表单中转义 html 和 javascript。它将特殊字符转换为数字字符引用,这样渲染就不会破坏您的 html。

          例如有

          <%= h "<p>Hello World</p>" %>  
          

          会输出

          <p>Hello World</p>
          

          作为要查看的文本,不会应用段落。它将被编码为

          &lt;p&gt;Hello World&lt;/p&gt;.
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-14
            • 1970-01-01
            • 1970-01-01
            • 2021-02-21
            • 1970-01-01
            相关资源
            最近更新 更多