web-dev-qa-db-ja.com

Backbone.jsとXSS / HTMLのエスケープ

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

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

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

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

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

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

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

25
hupf

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

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

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

<input class="edit" type="text" value="<%- title %>" />
49
Rob W

バックボーンの標準的な方法は、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'));
2
Levsero