デフォルトのスキャフォールドを生成すると、show.html.erbのディスプレイタグに
<%=h @broker.name %>
<%
と<%=
の違いを知っています。 「h」は何をしますか?
hTMLエスケープ。これは、レンダリングがHTMLを壊さないように、<や>などを数値の文字参照に変換するメソッドです。
<%=h
は実際には2つのことが起こっています。あなたはerbタグ(<%=
)およびRails method h
を呼び出してすべてのシンボルをエスケープします。
これら2つの呼び出しは同等です。
<%=h person.first_name %>
<%= h(person.first_name) %>
h
メソッドは、HTMLとJavascriptをユーザー入力フォームからエスケープするために一般的に使用されます。
h
は ERB :: Util クラスのhtml_escape
のメソッドエイリアスです。
RackにはHTMLをエスケープするメソッドもありますRack::Utils.escape_html
MetalでHTMLをエスケープしたい場合。
パーティーにはかなり遅れましたが、_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!
_
ユーザーから提供された汚染されている可能性のあるデータをエスケープすることで、ホームフリーになります。
hは、html_escapeの単なるエイリアスです。これは、ユーザー入力フォームからhtmlおよびjavascriptをエスケープするために一般的に使用されるユーティリティメソッドです。レンダリングがHTMLを壊さないように、特殊な文字を数値参照に変換します。
たとえば
<%= h "<p>Hello World</p>" %>
出力されます
<p>Hello World</p>
表示するテキストとして、段落は適用されません。次のようにエンコードされます
<p>Hello World</p>.