web-dev-qa-db-ja.com

「<%= h [...]%>」の「h」の意味は何ですか?

デフォルトのスキャフォールドを生成すると、show.html.erbのディスプレイタグに

<%=h @broker.name %>

<%<%=の違いを知っています。 「h」は何をしますか?

62
neezer

hTMLエスケープ。これは、レンダリングがHTMLを壊さないように、<や>などを数値の文字参照に変換するメソッドです。

94
JasonTrue

<%=hは実際には2つのことが起こっています。あなたはerbタグ(<%=)およびRails method hを呼び出してすべてのシンボルをエスケープします。

これら2つの呼び出しは同等です。

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

hメソッドは、HTMLとJavascriptをユーザー入力フォームからエスケープするために一般的に使用されます。

15
Xac

hERB :: Util クラスのhtml_escapeのメソッドエイリアスです。

13
Tim Harding

RackにはHTMLをエスケープするメソッドもありますRack::Utils.escape_html MetalでHTMLをエスケープしたい場合。

6
heycarsten

パーティーにはかなり遅れましたが、_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(クロスサイトスクリプティング)攻撃に遭遇する可能性があります。最も単純な例では、ユーザーが自分の名前を"<script>alert('omg');</script>"として保存し、その上で_html_safe_を使用した場合、想定された名前をレンダリングするすべてのページで「omg」という警告が表示されます。これは大きな問題です。これを回避するには、次のようにします。

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

ユーザーから提供された汚染されている可能性のあるデータをエスケープすることで、ホームフリーになります。

1
bkunzi01

hは、html_escapeの単なるエイリアスです。これは、ユーザー入力フォームからhtmlおよびjavascriptをエスケープするために一般的に使用されるユーティリティメソッドです。レンダリングがHTMLを壊さないように、特殊な文字を数値参照に変換します。

たとえば

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

出力されます

<p>Hello World</p>

表示するテキストとして、段落は適用されません。次のようにエンコードされます

&lt;p&gt;Hello World&lt;/p&gt;.
0
Nesha Zoric