2012-09-25 26 views
25

私はBackbone.jsアプリケーションを構築していますが、Backbone.jsを使用しているときにXSSのHTMLエスケープを処理するにはどうすればよいのでしょうか。Backbone.jsとXSS/HTMLエスケープ

正式なBackbone.jsのドキュメントの​​では、データはエスケープされません。 RESTサーバーを使用する場合

"><script>alert('xss');</script> 

:このデータは、TODO項目をレンダリングするために、テンプレートに使用されるので、次のテキストを(上記のリンクで再生することができる)を入力してJavascriptコードを実行することが可能ですストレージバックエンドとして、このXSSはすべてのユーザーに永続的です。

この問題をどうやって解決しますか?

私の考えは、サーバー上のデータをエスケープすることで、返されたデータはテンプレートで使用するのが安全です。エスケープされていないデータがレンダリングされないように常にwait: trueを使用する必要がありますか?編集するには、エスケープされていないデータを持つ別の属性を追加してください。これを使用して.val()を使用してテキストフィールドを埋めることができますか?

または、テンプレートをレンダリングする前に、クライアント上のデータをエスケープしないでください。

+2

モデルのエスケープ機能はどうですか? http://backbonejs.org/#Model-escape – eveevans

+1

例が修正されたようです。 –

答えて

48

Todoの例は、最もクリーンな例ではありません。 、正しくHTMLをエスケープするには

<input class="edit" type="text" value="<%= title %>" /> 

代わり<%=の​​3210を使用します:それは次のように、underscore's template engineを使用しています

<input class="edit" type="text" value="<%- title %>" /> 
2

バックボーンにおける標準的な方法はmodel.escape(attribute)を使用することです。バックボーンのドキュメントbackbonejs.org/#Model-escapeから

「を得ると同様ですが、モデルの属性のHTMLエスケープバージョンを返しますが、HTMLの中にモデルからのデータを補間している場合、属性を取得するために、エスケープを使用して防ぐことができます。 XSS攻撃。

var hacker = new Backbone.Model({ 
    name: "<script>alert('xss')</script>" 
}); 

alert(hacker.escape('name'));