次のような文字列があるとします。
@x = "<a href='#'>Turn me into a link</a>"
私の見解では、私はリンクが表示されることを望みます。つまり、@ xのすべてをエスケープ解除して文字列として表示したくはありません。使用の違いは何ですか
<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>
?
レール3を考える:
html_safe
は、実際には「文字列を設定する」ことをHTML Safeとして設定しています(それより少し複雑ですが、基本的にはそれです)。これにより、ヘルパーやモデルからHTML Safeの文字列を自由に返すことができます。
h
は、ヘルパーからのものなので、コントローラーまたはビュー内からのみ使用できます。出力を強制的にエスケープします。これは実際には推奨されていませんが、おそらくもう使うことはないでしょう。唯一の使い方は、html_safe
宣言を「元に戻す」ことですが、これは非常に珍しいことです。
式の先頭にraw
を付けることは、実際にはto_s
を使ってチェーンされたhtml_safe
を呼び出すことと同じですが、h
と同じようにヘルパーで宣言されるため、コントローラーとビューでのみ使用できます。
「 SafeBuffers and Rails 3.0 」はSafeBuffer
s(html_safe
マジックを実行するクラス)の機能についての素晴らしい説明です。
繰り返しますが、html_safe
はnotあなたの文字列をHTMLエスケープすると思います。実際、文字列がエスケープされるのを防ぐことができます。
<%= "<script>alert('Hello!')</script>" %>
置く:
<script>alert('Hello!')</script>
あなたのHTMLソースに(はい、とても安全です!)
<%= "<script>alert('Hello!')</script>".html_safe %>
警告ダイアログがポップアップ表示されます(それがあなたが望むものであると確信していますか?)。そのため、ユーザーが入力した文字列に対してhtml_safe
を呼び出さないでください。
違いはRailsのhtml_safe()
とraw()
の違いです。 Yehuda Katzによる素晴らしい投稿がこれにあります、そしてそれは本当にこれに帰結します:
def raw(stringish)
stringish.to_s.html_safe
end
はい、raw()
はhtml_safe()
のラッパーで、入力をStringに強制してからhtml_safe()
を呼び出します。 raw()
がモジュールのヘルパーであるのに対して、html_safe()
はStringクラスのメソッドで、新しいActiveSupport :: SafeBufferインスタンスを作成します - それは@dirty
フラグを持ちます。
「 Railsのhtml_safe vs. raw 」を参照してください。
html_safe
:
文字列を信頼できる金庫としてマークします。追加のエスケープは行われずにHTMLに挿入されます。
"<a>Hello</a>".html_safe
#=> "<a>Hello</a>"
nil.html_safe
#=> NoMethodError: undefined method `html_safe' for nil:NilClass
raw
:
raw
はhtml_safe
のラッパーです。文字列がraw
になる可能性がある場合は、nil
を使用してください。
raw("<a>Hello</a>")
#=> "<a>Hello</a>"
raw(nil)
#=> ""
h
html_escape
のエイリアス:
HTMLタグ文字をエスケープするためのユーティリティメソッド。危険なコンテンツをエスケープするには、このメソッドを使用してください。
Rails 3以降ではデフォルトで使われるので、このメソッドを明示的に使う必要はありません。
最も安全な方法は次のとおりです。<%= sanitize @x %>
それはXSSを避けます!
Simple Railsの用語では:
h
は、HTMLタグを数字に削除して、レンダリングによってHTMLが破損しないようにします。
html_safe
は、文字列がHTML保存と見なされるように、文字列にブール値を設定します。
raw
文字列へのhtml_safeへの変換