2012-10-08 14 views
7

Arka uçta Raylar ve ön uçtaki javascript/omurga kullanan bir uygulama yazıyorum. bootstrap some rails models into my javascript'u deniyorum. Spesifik olarak, @courses'un içeriğini window.courses adında bir js değişkenine yüklemek istiyorum. Bir html.erb dosyasında aşağıdaki var.Rails to_json çıktısında HTML varlıkları nasıl ele alınır?

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

yerine, ben HTML entities içerir kod alıyorum, bu yüzden

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

gibi, geçerli javascript içine bu işlemek için erb önişlemci bekliyor ... ama değilim.

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

Açıkçası, bunu ayrıştırmaya çalıştığımda javascript hataları alıyorum.

Geçerli javascript oluşturmak için bu HTML varlıklarıyla nasıl başa çıkabileceğimi bilen var mı? Bir seçeneğin unescape the entities on the client side olduğunu anlıyorum, ama bu bir döner çözüm gibi görünüyor. Rails'i unconcaping gerektirmeyen JSON üretmek için bir yol var mı?

+2

Kullanarak deneyin <% = raw (@ courses.to_json)%> ' –

+0

Parlak, teşekkürler! Bunu yapmanın basit bir yolu olmalı diye düşündüm. –

+0

@dB 'kabul edilen cevabı güncellemeyi düşünür müsünüz? Bu çok güvensiz ve birçok siteler arası komut dosyası güvenlik açıklarının kaynağı olmuştur. – oreoshake

cevap

9

siz şu ayarlandığından emin olun GEREKİR ham (obj.to_json) kullanmayı düşünüyorsanız.

ActiveSupport.escape_html_entities_in_json = true 
5

soru sadece kayıt için, benim yorum çözülür:

Raylar <%= 'string' %> kullanılarak basılır dizeleri kaçar. Bununla, kullanıcı verilerinin kaydedilmesi kaydedilir. Eğer Rails'in çıkıştan kaçmasını istemiyorsanız, Rails'e raw('string')'u kullanarak açıkça söylemeniz gerekir. Kodunuzda

, olurdu: <%= raw(@courses.to_json) %>

+1

Bu temelde xss soruyor. trivially. Bunu yüzlerce kez gördüm, lütfen hiç kullanma. – oreoshake

+0

Yorumunuz için teşekkür ederiz @oreoshake. Bana bir alternatifin yönünü gösterir misiniz? –

+0

Yukarıdaki yanıtta, "ActiveSupport.escape_html_entities_in_json = true" ifadesini kullanıyorum. Bu ayar ve varsayılan json arka planları ile <= @ courses.to_json.html_safe%> kullanımı xss'den güvenlidir. – oreoshake

İlgili konular