“<%= h %>”中的“h”是什么意思?

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

<%=h @broker.name %> 

我知道<%<%=的区别。 什么是“H”呢?

html转义。 这是一种将<和>之类的东西转换为数字字符引用的方法,以便渲染不会破坏您的html。

<%=h实际上是发生了两件事情。 你打开一个erb标签( <%= ),并调用Rails方法h来转义所有符号。

这两个电话是等价的:

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

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

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

如果您在Metal中并且想要转义某些HTML,则Rack中还有一种方法可以转义HTML Rack::Utils.escape_html

晚了方,但我添加了什么html_escape进一步的解释,希望能帮助像我这样的其他新手理解发生了什么。 Rails 3及更高版本现在会自动转义所有的输出,所以需要html_escape又名h()会less得多。 其中最值得注意的是当您在演示者类中使用htmlbuild立链接时打算使用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(跨站点脚本)攻击。 最简单的例子是,如果一个用户把他们的名字保存为"<script>alert('omg');</script>"并且你使用了html_safe ,那么它会导致任何页面渲染他们的名字,我的天啊'! 这是一个主要问题。 为了避免这样做:

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

通过转义由用户提供的潜在污染数据,我们是免费的!