私はBackbone.jsアプリケーションを構築していて、Backbone.jsを使用するときにXSSまたはHTMLエスケープを処理するための最良の方法は何であるか疑問に思っています。
基本的な Todosサンプルアプリケーション の公式Backbone.jsドキュメントでは、データはエスケープされていません。このデータはテンプレートでtodoエントリをレンダリングするために使用されるため、次のテキストを入力することでJavascriptコードを実行できます(で再現できます)上記のリンク):
_"><script>alert('xss');</script>
_
RESTサーバーをストレージバックエンドとして使用する場合、このXSSはすべてのユーザーに対して永続的です。
この問題をどのように解決しますか?
私の考えは、サーバー上のデータをエスケープして、返されたデータをテンプレートで安全に使用できるようにすることです。次に、エスケープされていないデータがレンダリングされないようにするために、常に_wait: true
_を使用する必要がありますか?また、編集する場合は、エスケープされていないデータを使用して別の属性を追加します。この属性を使用して、.val()
?を使用してテキストフィールドに入力できます。
または、テンプレートをレンダリングする前に、これを何も行わず、クライアント上のデータをエスケープしますか?
Todoの例は最もクリーンな例ではありません。次のように、 アンダースコアのテンプレートエンジン を使用します。
<input class="edit" type="text" value="<%= title %>" />
HTMLを正しくエスケープするには、<%-
の代わりに<%=
を使用します。
<input class="edit" type="text" value="<%- title %>" />
バックボーンの標準的な方法は、model.escape(attribute)
を使用することです。
バックボーンドキュメントから backbonejs.org/#Model-escape :
「getと似ていますが、モデルの属性のHTMLエスケープバージョンを返します。モデルからHTMLにデータを補間する場合、エスケープを使用して属性を取得すると、XSS攻撃を防ぐことができます。」
var hacker = new Backbone.Model({
name: "<script>alert('xss')</script>"
});
alert(hacker.escape('name'));