25

私はBackbone.jsアプリケーションを構築していて、Backbone.jsを使用するときにXSSまたはHTMLエスケープを処理するための最良の方法は何でしょうか。

公式のBackbone.jsドキュメントの基本的なTodosサンプルアプリケーションでは、データはエスケープされていません。このデータはtodoエントリをレンダリングするためのテンプレートで使用されるため、次のテキストを入力することでJavascriptコードを実行できます(上記のリンクで再現できます)。

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

RESTサーバーをストレージバックエンドとして使用する場合、このXSSはすべてのユーザーに対して永続的です。

この問題をどのように解決しますか?

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

または、テンプレートをレンダリングする前に、これを行わずにクライアント上のデータをエスケープしますか?

4

2 に答える 2

50

Todoの例は、最もクリーンな例ではありません。次のように、アンダースコアのテンプレートエンジンを使用します。

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

HTMLを正しくエスケープするには、次<%-の代わりにを使用し<%=ます。

<input class="edit" type="text" value="<%- title %>" />
于 2012-09-25T16:26:01.800 に答える
2

バックボーンの標準的な方法は、を使用すること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'));
于 2015-08-02T03:31:09.897 に答える