回答:
Rails 3:
html_safe実際には、HTMLセーフとして「文字列を設定」します(それよりも少し複雑ですが、基本的にはそれです)。このようにして、ヘルパーやモデルからHTML Safe文字列を自由に返すことができます。
hヘルパーからのものであるため、コントローラーまたはビュー内からのみ使用できます。出力を強制的にエスケープします。これは実際には非推奨ではありませんが、おそらくもう使用しないでしょう。唯一の使用法は、html_safe宣言を「元に戻す」ことです。
式を前に付加することrawは、実際にはその上でto_sチェーンされた呼び出しと同等html_safeですが、と同様hにヘルパーで宣言されるため、コントローラーとビューでのみ使用できます。
「SafeBuffers and Rails 3.0」は、SafeBuffers(html_safeマジックを実行するクラス)がどのように機能するかを説明しています。
h廃止されるとは言いません。使用"Hi<br/>#{h@ user.name}".html_safeは非常に一般的で、認められた使用法です。
rawとhtml_safe実際には微妙な違いがあることに注意してください。例外raw(nil)をnil.html_safeスローする一方で、空の文字列を返します。
hhtml_safe宣言を「元に戻す」ことはありません。文字列がある場合はhtml_safe、h何もしません。
繰り返しhtml_safeが必要だと思います:文字列をHTMLエスケープしません。実際、文字列がエスケープされるのを防ぎます。
<%= "<script>alert('Hello!')</script>" %>
置くでしょう:
<script>alert('Hello!')</script>
あなたのHTMLソースに(そう、とても安全です!)、同時に:
<%= "<script>alert('Hello!')</script>".html_safe %>
警告ダイアログがポップアップ表示されます(それでよろしいですか?)。したがって、おそらくhtml_safeユーザーが入力した文字列を呼び出したくないでしょう。
html_safeんではないエスケープもアンエスケープ。HTMLセーフではないものとしてマークし、ERB <%=タグの暗黙的なエスケープを使用した最終結果は、データをアンエスケープしてから出力で再エスケープすることと同じかもしれませんが、機能的にはどちらも行いません。(6 * -1 * -1)と6の違いのようなもの
違いはRails html_safe()とraw()です。これに関するイェフダ・カッツの優れた投稿があり、それは本当にこれに要約されます:
def raw(stringish)
stringish.to_s.html_safe
end
はい、文字列への入力を強制し、それを呼び出すraw()ラッパーです。また、モジュールのヘルパーであるのに対して、新しいActiveSupport :: SafeBufferインスタンスを作成するStringクラスのメソッド— フラグが含まれています。html_safe()html_safe()raw()html_safe()@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を文字列に変換します
hisはhtml_safe、HTMLがそのままレンダリングされることを意味します。
<%== @x %>、<%= raw(@x) %>edgeguides.rubyonrails.org