4

今日、私はクロスサイトスクリプティング(XSS)攻撃について読んでいました。Backboneがmodel.escape('attr')組み込まれているようで、私が言えることmodel.get('attr')から、これらの攻撃を防ぐのではなく、常に使用する必要があります。

最初に検索を行いましたが、そのような推奨事項は見つかりませんでした。model.escape('attr')モデルから値を取得するときに常に使用する必要がありますか?

4

4 に答える 4

5

アンダースコアテンプレートを使用して、私は一般的に次のように見たり、実行したりしました。

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 %>せずに属性を直接挿入するのとは対照的です)。

于 2013-01-03T16:41:45.807 に答える
3

model.escape()の代わりに、レンダリング中の_.escapeを参照してください。したがって、モデルは好きなように使用できますが、レンダリング中はエスケープするように注意してください。レンダリング中にテンプレートで_.escapeを使用するだけで十分です。これにより、XSS攻撃が回避されます。

この方法を参照してください。

http://underscorejs.org/#escape

于 2013-01-03T15:49:16.293 に答える
1

はい、xss攻撃を回避するには、常にmodel.escape()を使用できます。これは、望ましい方法であり、htmlコンテンツをエスケープするためにも使用されます...

ただし、データをすぐに使用する場合は、model.get()を使用するだけで済みます。

于 2013-01-03T15:38:25.090 に答える
0

バックボーン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がこの問題を照会するプルレポートで指摘しているように、属性をエスケープした後で属性の存在を確認することは意味がありません。

于 2014-08-01T07:05:49.733 に答える