2012-01-27 77 views
2

我試圖通過模型通過HTML屬性的JavaScript這樣的:如何安全地將rails模型屬性傳遞給javascript?

<script type="text/javascript"> 
    myModel = <%= MyModel.all.map{|m| m.attributes}.to_json.html_safe %>; 
</script> 

但是,這不是安全的,因爲一個屬性值可以是一個惡意字符串:

"</script>Evil Code<script>" 

如何再次安全嗎?

+0

爲什麼不傳球的動作的屬性在控制器 – e3matheus 2012-01-27 13:58:01

+1

@ e3matheus,是的,我想起來了,但我在這裏看到兩個缺點:比較複雜鱈魚性能較差。因爲,如果我只是將它嵌入到html中,則不需要再提出屬性請求。 – welldan97 2012-01-27 14:09:12

回答

0

我決定做一個輔助功能,它逃脫每個屬性與h方法:

def safe_attributes_of model_class 
    attributes = model_class.all.map do |model| 
    model.attributes.each_with_object({}) do |(k,v), attrs| 
     attrs[k] = h(v) 
    end 
    end 

    attributes.to_json.html_safe 
end 
1

在第一二讀你的問題後,我以爲你誤解了html_safe方法的功能,和我說:

html_safe有一個非常誤導的名稱的方法。它不會讓你的字符串安全,不會逃避不安全的字符。它只是告訴它它是安全的,通常與你想要的相反。

本文可能對某些人有用,所以請允許我將其留在此處。 並接受我的道歉 :)

然後我明白了真正的問題是,<script>元素有「奇怪的」逃避規則,真的很難實現。基本上,腳本元素內容不能包含字符串</script>或幾個空格字符

HTML5script內容定義了一些與HTML4稍有不同的規則。需要注意的是在HTML4 任何結束標記顯示爲非法,而HTML5只考慮</script>

的問題是,字符實體不是腳本元素內的認可,所以我們只剩下試圖刪除禁止的子任務根據JavaScript(或任何其他語言)的語法規則。這可能很難自動化。

如果將其中一個禁用字符串放在雙引號中,我們可以用<"+"/script替換它。如果它是單引號文字,我們應該使用<'+'/script。如果它在評論中......等等。

我想,在這個確切的情況下,我們可能會假設(讀:「祈禱,希望」),這腳本結束始終放在雙引號,也永遠不會是一個變量名的一部分。這個簡單的gsub在大多數情況下工作:

<%= MyModel.all.map{|m| m.attributes}. 
    to_json.gsub("</script", "<\"+\"/script").html_safe %>; 

不過,我覺得這是多餘的信心非常令人不安:-(

+0

然後它會跳過引號,需要有效的json字符串'"',並且JavaScript將被打破 – welldan97 2012-01-27 12:17:38

+0

是的,你是完全正確的。轉義「

  • 11. 安全地將Ruby對象傳遞給JavaScript
  • 12. 如何將ControllerContext傳遞給屬性
  • 13. Rails - 將具有多個屬性的對象傳遞給javascript
  • 14. 將javascript模型傳遞給控制器​​
  • 15. C++ printf問題:如何安全地將char *傳遞給printf?
  • 16. 將屬性傳遞給msiexec
  • 17. 如何在Rails 3中將多個屬性傳遞給find_or_create_by?
  • 18. 將ajax請求傳遞給Codeigniter控制器的安全性如何安全
  • 19. 如何將參數傳遞給applet? (安全模式)
  • 20. Django - 如何將模型傳遞給CreateView
  • 21. 如何將模型傳遞給視圖?
  • 22. 如何將模型傳遞給anguarjs fileuploader?
  • 23. 如何將user_id傳遞給nested_resource模型?
  • 24. 如何將模型傳遞給@ html.partial?
  • 25. 如何將模型傳遞給FormsAuthentication.RedirectFromLoginPage()?
  • 26. 將單一模型屬性傳遞給JSP
  • 27. 嵌套屬性,將current_user.id傳遞給嵌套模型
  • 28. 未將模型屬性傳遞給剃刀視圖
  • 29. 主幹:將模型屬性傳遞給視圖返回undefined
  • 30. 主/細節編輯 - 將值傳遞給詳細模型屬性