何が起こっているのかを理解する必要がある String クラスに抽象化を追加するように感じhtml_safe
ます。たとえば、
<%= '1 <b>2</b>' %> # gives 1 <b>2</b> in the HTML source code
<%= h '1 <b>2</b>' %> # exactly the same as above
<%= '1 <b>2</b>'.html_safe %> # 1 <b>2</b> in HTML source code
<%= h '1 <b>2</b>'.html_safe %> # exactly the same as above
<%= h (h '1 <b>2</b>') %> # 1 <b>2</b> wont' escape twice
4 行目で、文字列を信頼すると言っている場合、文字列は安全ですが、なぜエスケープできないのでしょうか? でエスケープするにh
は、文字列が安全でない必要があるようです。
したがって、1 行目で、文字列が でエスケープされていない場合、h
自動的にエスケープされます。5 行目でh
は、文字列を 2 回エスケープすることはできません。つまり、<
が に変更された後<
、 にもう一度エスケープすることはできません&lt;
。
それで、何が起こっているのですか?html_safe
最初は、文字列にフラグを付けて、安全だと言っているだけだと思っていました。では、なぜそれをh
回避しないのでしょうか。h
フラグの使用にhtml_escape
実際に協力しているようです:
1) 文字列が html_safe の場合、h
エスケープしません
2) 文字列が html_safe でない場合、文字列が出力バッファに追加されると、 によって自動的にエスケープされh
ます。
3)h
すでに文字列をエスケープしている場合は とマークされhtml_safe
ているため、もう一度エスケープしてh
も効果はありません。(5行目と同じように、その動作はRails 2.3.10でも同じですが、Rails 2.3.5h
では実際に2回エスケープできます...したがって、Rails 2.3.5ではh
単純なエスケープ方法ですが、どこかで2.3.10 への行はそれほどh
単純ではなくなりました.しかし、2.3.10 は文字列を自動エスケープしませんが、何らかの理由で、メソッドhtml_safe
は 2.3.10 用に既に存在します (何の目的で?))
それはまさにそれがどのように機能するのですか?最近では、出力に必要なものが得られず、すぐにhtml_safe
変数に追加することがあると思いますが、これは非常に危険な場合があります。XSS 攻撃がそのように導入される可能性があるため、正確にどのように機能するかを理解することが非常に重要になる可能性があります。上記は、正確にどのように機能するかの推測にすぎません。それは実際には別のメカニズムである可能性があり、それをサポートするドキュメントはありますか?