2012-10-08 46 views
7

我正在編寫一個應用程序,在後端使用Rails,在前端使用javascript/backbone。我正在嘗試bootstrap some rails models into my javascript。具體來說,我想將@courses的內容加載到名爲window.courses的js變量中。我在html.erb文件中獲得了以下內容。如何處理Rails to_json輸出中的HTML實體?

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

我期待的erb預處理器來渲染成有效的JavaScript這一點,像這樣

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

...但是,相反,我得到的代碼,其中包括HTML entities

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

很顯然,我得到的JavaScript錯誤,當我嘗試解析此。

有誰知道我可以如何處理這些HTML實體爲了生成有效的JavaScript?我意識到一種選擇是unescape the entities on the client side,但這看起來像是一個迂迴的解決方案。有沒有一種方法可以讓Rails生成不需要忽略的JSON?

+2

嘗試使用'<%= raw(@ courses.to_json)%>' –

+0

輝煌,謝謝!我覺得必須有一個簡單的方法來做到這一點。 –

+0

@dB'你會考慮更新接受的答案嗎?這是非常不安全的,並且一直是許多跨站腳本漏洞的來源。 – oreoshake

回答

9

如果您打算使用原始(obj.to_json),你必須確保以下設置。

ActiveSupport.escape_html_entities_in_json = true 
5

的問題是我的意見解決,僅僅是爲了記錄:

Rails的逃逸正在使用<%= 'string' %>打印字符串。由此,保存輸出用戶數據。 所以,如果你不想讓Rails逃避輸出,你必須明確告訴Rails使用raw('string')

在你的代碼,這將是: <%= 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