2012-01-08 45 views
3

保護在我的工作的應用中,一個客戶端視圖來生成基於數據庫中的一些記錄。我首先生成JSON的記錄,將其保存在一個變量在我的網頁,然後用JS來構建界面。從XSS在escape_javascript()輸出中的Rails

問題是記錄包含用戶生成的字段,因此應用程序易受XSS影響。如果讓JSON通過escape_html(由不調用它html_safe),它會搞砸了引號。

要得到的代碼。在我的模型:

Class Foo 
    # ... 
    def describe_for_view 
    [{:title => "hello", :content => "<script>I.Am.Evil()</script>"}] 
    end 
end 
在我看來

某處:

<script> 
    var describedForView = $.parseJSON("<%= escape_javascript(@foo.describe_for_view.to_json).html_safe %>"); 
</script> 

然後在我的javascript:

$("body").append("title: " + describedForView[0].title + ", content: " + describedForView[0].content); 

什麼我目前做的是,我包裹訪問用戶 - 按照以下定義的呼叫$.sanitize生成的字段:

$.sanitize = function(str) { 
    return $("<div/>").text(str).html(); 
}; 

事情以這種方式工作,但我不認爲它是乾淨的。

有什麼建議嗎?

回答

1

Rails 3內置SanitizeHelper,它採用白名單方式。我會在將用戶數據保存到數據庫之前或在您的escape_javascript調用中調用它:

escape_javascript(sanitize(some_stuff.to_json))