“<%= 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!
通过转义由用户提供的潜在污染数据,我们是免费的!