2012-10-08 5 views
7

私はフロントエンドでバックエンドとjavascript /バックボーンでRailsを使うアプリケーションを書いています。私はbootstrap some rails models into my javascriptにしようとしています。具体的には、window.coursesというjs変数に@coursesの内容をロードしたいと思います。私はhtml.erbファイルに次のものを持っています。Rails to_jsonの出力でHTMLエンティティを処理するには?

<%= javascript_tag do %> 
    window.courses = JSON.parse('<%= @courses.to_json %>'); 
<% end %> 

私はそう

<script type="text/javascript"> 
//<![CDATA[ 
    window.courses = JSON.parse('[{"code":"myCourseCode", ... 
//]]> 
</script> 

のように、有効なJavaScriptにこれをレンダリングするerbプリプロセッサを期待しています...しかし、その代わり、私はHTML entitiesを含むコードを取得しています。

<script type="text/javascript"> 
//<![CDATA[ 
    window.courses = JSON.parse('[{&quot;code&quot;:&quot;myCourseCode&quot;, ... 
//]]> 
</script> 

明らかに、これを解析しようとするとjavascriptエラーが発生します。

有効なjavascriptを生成するために、どのようにこれらのHTMLエンティティに対処できるか知っていますか?私は1つのオプションがunescape the entities on the client sideになることを理解していますが、これはラウンドアバウトソリューションのようです。エスケープ処理を必要としないJSONをRailsに生成させる方法はありますか?

+2

「<%= raw(@ courses.to_json)%>」を使用してください。 –

+0

素晴らしい、ありがとう!私はこれを行う簡単な方法がなければならないと考えました。 –

+0

@dB 'あなたは受け入れられた回答を更新することを検討しますか?これは非常に安全ではなく、多くのクロスサイトスクリプティングの脆弱性の原因となっています。 – oreoshake

答えて

9

あなたは以下が設定されていることを確認しなければならない生(obj.to_json)を使用する場合。

ActiveSupport.escape_html_entities_in_json = true 
5

質問は、単にレコードについて、私のコメントによって解決される:

Railsは<%= 'string' %>を使用して印刷された文字列をエスケープします。これにより、ユーザデータを出力することがなくなります。 したがって、Railsが出力をエスケープしないようにするには、raw('string')を使用してRailsに明示的に伝える必要があります。あなたのコードで

は、それは次のようになります。 <%= raw(@courses.to_json) %>

+1

これは基本的にxssを求めています。自明です。私はこの何百回も見たことがあります。 – oreoshake

+0

ご連絡ありがとうございます@oreoshake。あなたは私に代替手段への指針を教えてもらえますか? –

+0

上記の答えでは、 'ActiveSupport.escape_html_entities_in_json = true'について言及します。この設定とデフォルトのjsonバックエンドを使用すると、<= @ courses.to_json.html_safe%>を使用することはxssから安全です。 – oreoshake

関連する問題