今日、私はクロスサイトスクリプティング(XSS)攻撃について読んでいました。Backboneがmodel.escape('attr')
組み込まれているようで、私が言えることmodel.get('attr')
から、これらの攻撃を防ぐのではなく、常に使用する必要があります。
最初に検索を行いましたが、そのような推奨事項は見つかりませんでした。model.escape('attr')
モデルから値を取得するときに常に使用する必要がありますか?
今日、私はクロスサイトスクリプティング(XSS)攻撃について読んでいました。Backboneがmodel.escape('attr')
組み込まれているようで、私が言えることmodel.get('attr')
から、これらの攻撃を防ぐのではなく、常に使用する必要があります。
最初に検索を行いましたが、そのような推奨事項は見つかりませんでした。model.escape('attr')
モデルから値を取得するときに常に使用する必要がありますか?
アンダースコアテンプレートを使用して、私は一般的に次のように見たり、実行したりしました。
var TemplateHtml = "<div><%- someModelAttribute %></div>"; // Really, you should load from file using something like RequireJS
var View = Backbone.View.extend({
_template: _.template(TemplateHtml),
render: function() {
this.$el.html(this._template(this.model.toJSON()));
}
});
を使用する<%- someModelAttribute %>
と、アンダースコアは指定された値をエスケープすることを認識します(エスケープ<%= someModelAttribute %>
せずに属性を直接挿入するのとは対照的です)。
model.escape()の代わりに、レンダリング中の_.escapeを参照してください。したがって、モデルは好きなように使用できますが、レンダリング中はエスケープするように注意してください。レンダリング中にテンプレートで_.escapeを使用するだけで十分です。これにより、XSS攻撃が回避されます。
この方法を参照してください。
はい、xss攻撃を回避するには、常にmodel.escape()を使用できます。これは、望ましい方法であり、htmlコンテンツをエスケープするためにも使用されます...
ただし、データをすぐに使用する場合は、model.get()を使用するだけで済みます。
バックボーンescape
関数をいつ使用するかについての良い記事を見つけました。作成者は、モデル属性の値を実行する予定がない場合を除いて、常にエスケープを使用する必要があると主張しています。たとえば、モデル属性をチェックしていた場合は、次のようになりませんでしたnull
。
var model = new Backbone.Model({foo: "Bar"});
if (model.get("foo") != null) { //notice how here we did not use escape
$("h1").html(model.escape("foo")); //but here we do
}
注意すべき関連点の1つは、そこからの戻り値を確認すると、model.escape("foo")
常に文字列が返されるということです。したがって、期待している場合null
は、混乱する可能性があります。
console.log(model.get("foo")); // null
console.log(model.escape("foo")); // ""
ただし、Jeremy Ashkenasがこの問題を照会するプルレポートで指摘しているように、属性をエスケープした後で属性の存在を確認することは意味がありません。