web-dev-qa-db-ja.com

htmlをエスケープ解除するには、rawとhtml_safeとhの組み合わせ

次のような文字列があるとします。

@x = "<a href='#'>Turn me into a link</a>"

私の見解では、私はリンクが表示されることを望みます。つまり、@ xのすべてをエスケープ解除して文字列として表示したくはありません。使用の違いは何ですか

<%= raw @x %>
<%= h @x %>
<%= @x.html_safe %>

314
grautur

レール3を考える:

html_safeは、実際には「文字列を設定する」ことをHTML Safeとして設定しています(それより少し複雑ですが、基本的にはそれです)。これにより、ヘルパーやモデルからHTML Safeの文字列を自由に返すことができます。

hは、ヘルパーからのものなので、コントローラーまたはビュー内からのみ使用できます。出力を強制的にエスケープします。これは実際には推奨されていませんが、おそらくもう使うことはないでしょう。唯一の使い方は、html_safe宣言を「元に戻す」ことですが、これは非常に珍しいことです。

式の先頭にrawを付けることは、実際にはto_sを使ってチェーンされたhtml_safeを呼び出すことと同じですが、hと同じようにヘルパーで宣言されるため、コントローラーとビューでのみ使用できます。

SafeBuffers and Rails 3.0 」はSafeBuffers(html_safeマジックを実行するクラス)の機能についての素晴らしい説明です。

381
Fábio Batista

繰り返しますが、html_safenotあなたの文字列をHTMLエスケープすると思います。実際、文字列がエスケープされるのを防ぐことができます。

<%= "<script>alert('Hello!')</script>" %>

置く:

&lt;script&gt;alert(&#x27;Hello!&#x27;)&lt;/script&gt;

あなたのHTMLソースに(はい、とても安全です!)

<%= "<script>alert('Hello!')</script>".html_safe %>

警告ダイアログがポップアップ表示されます(それがあなたが望むものであると確信していますか?)。そのため、ユーザーが入力した文字列に対してhtml_safeを呼び出さないでください。

109
roasm

違いは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 」を参照してください。

45
Pankhuri
  1. html_safe

    文字列を信頼できる金庫としてマークします。追加のエスケープは行われずにHTMLに挿入されます。

    "<a>Hello</a>".html_safe
    #=> "<a>Hello</a>"
    
    nil.html_safe
    #=> NoMethodError: undefined method `html_safe' for nil:NilClass
    
  2. raw

    rawhtml_safeのラッパーです。文字列がrawになる可能性がある場合は、nilを使用してください。

    raw("<a>Hello</a>")
    #=> "<a>Hello</a>"
    
    raw(nil)
    #=> ""
    
  3. hhtml_escapeのエイリアス:

    HTMLタグ文字をエスケープするためのユーティリティメソッド。危険なコンテンツをエスケープするには、このメソッドを使用してください。

    Rails 3以降ではデフォルトで使われるので、このメソッドを明示的に使う必要はありません。

26
Deepak Mahakale

最も安全な方法は次のとおりです。<%= sanitize @x %>

それはXSSを避けます!

9

Simple Railsの用語では:

hは、HTMLタグを数字に削除して、レンダリングによってHTMLが破損しないようにします。

html_safeは、文字列がHTML保存と見なされるように、文字列にブール値を設定します。

raw文字列へのhtml_safeへの変換

1
user3118220