raw対html_safe対h対htmlのエスケープ解除


323

次の文字列があるとします

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

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

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


誰もそれについて言及しなかったので<%== @x %><%= raw(@x) %> edgeguides.rubyonrails.org

回答:


386

Rails 3:

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

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

式を前に付加することrawは、実際にはその上でto_sチェーンされた呼び出しと同等html_safeですが、と同様hにヘルパーで宣言されるため、コントローラーとビューでのみ使用できます。

SafeBuffers and Rails 3.0」は、SafeBuffers(html_safeマジックを実行するクラス)がどのように機能するかを説明しています。


42
それがh廃止されるとは言いません。使用"Hi<br/>#{h@ user.name}".html_safeは非常に一般的で、認められた使用法です。
不正行為者、

1
@Maletorは興味深い使い方ですが、それでも「異常な」カテゴリに分類されると思います。
ファビオバティスタ

5
String#html_safeは実際には、元の文字列をラップし、#html_safe?であるActiveSupport :: SafeBufferのインスタンスを返します。。元の文字列が#html_safeにならない?#html_safeを呼び出した後。
jmaxyz

9
rawhtml_safe実際には微妙な違いがあることに注意してください。例外raw(nil)nil.html_safeスローする一方で、空の文字列を返します。
Van der Hoorn 2013

2
hhtml_safe宣言を「元に戻す」ことはありません。文字列がある場合はhtml_safeh何もしません。
GuiGS 2014年

113

繰り返しhtml_safeが必要だと思います:文字列をHTMLエスケープしませ。実際、文字列がエスケープされるのを防ぎます。

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

置くでしょう:

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

あなたのHTMLソースに(そう、とても安全です!)、同時に:

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

警告ダイアログがポップアップ表示されます(それでよろしいですか?)。したがって、おそらくhtml_safeユーザーが入力した文字列を呼び出したくないでしょう。


81
言い換えると、html_safeは「このhtmlを安全にしてください」ではなく、その逆です。プログラマーが「この文字列はhtmlに安全であると約束します!」
PaulMurrayCbr 2014年

実際にここに来て、実際にエスケープを解除するのか、それともto_escapeは不要であるという印を付けるだけなのかを理解しました。かなり違います。ああ、それではソースコードを読んでください。
Simon B.

「html_safe」の概念は、文字列のメタフラグにすぎません。何かをマークするhtml_safeではないエスケープアンエスケープ。HTMLセーフではないものとしてマークし、ERB <%=タグの暗黙的なエスケープを使用した最終結果は、データをアンエスケープしてから出力で再エスケープすることと同じかもしれませんが、機能的にはどちらも行いません。(6 * -1 * -1)と6の違いのようなもの
Ben Zittlau

46

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


30
  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

    rawは単なるラッパーhtml_safeです。raw文字列がなる可能性がある場合に使用しますnil

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

    HTMLタグ文字をエスケープするためのユーティリティメソッド。このメソッドを使用して、安全でないコンテンツをエスケープします。

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



2

Simple Railsの用語では:

h htmlタグを数字の文字に削除して、レンダリングによってHTMLが壊れないようにする

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

raw html_safeを文字列に変換します


hisはhtml_safe、HTMLがそのままレンダリングされることを意味します。
Dave Newton

正解は次のとおりです。hはhtml_escape ... Railsコードベースから
notapatch
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.