【问题标题】:Backbone: Should model.escape be used instead of model.get?Backbone:应该使用 model.escape 代替 model.get 吗?
【发布时间】:2012-12-17 23:56:53
【问题描述】:

我今天正在阅读有关跨站点脚本 (XSS) 攻击的内容。 Backbone 似乎内置了model.escape('attr'),据我所知,应该始终使用它而不是model.get('attr') 来防止这些攻击。

我进行了一些初步搜索,但没有找到任何类似的建议。从模型中检索值时我是否应该始终使用model.escape('attr')

【问题讨论】:

  • 你用什么做模板?
  • 标准下划线模板。我真的只是在寻找未来的最佳实践。

标签: javascript backbone.js xss


【解决方案1】:

是的,为了避免 xss 攻击,您可以始终使用 model.escape() ,这更可取,它也用于转义 html 内容...

但如果您要立即使用数据...您可以简单地使用 model.get()...

【讨论】:

    【解决方案2】:

    而不是 model.escape(),请参阅渲染时的 _.escape。 因此,您可以根据需要使用模型,但在渲染时要小心逃逸。 渲染时在模板中使用 _.escape 就足够了。 这样可以避免 XSS 攻击。

    看这个方法:

    http://underscorejs.org/#escape

    【讨论】:

      【解决方案3】:

      使用下划线模板,我通常看到/做过这样的事情:

      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()));
          }
      });
      

      当您使用&lt;%- someModelAttribute %&gt; 时,Underscore 知道要转义给定的值(而不是 &lt;%= someModelAttribute %&gt;,它直接注入属性而不转义)。

      【讨论】:

      【解决方案4】:

      我找到了good article on when to use the backbone escape function。作者断言您应该始终使用转义,除非您绝对不会执行模型属性的值。例如,如果您正在检查模型属性不是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
      }
      

      需要注意的一个相关点是,如果您检查来自model.escape("foo") 的返回值,它将始终返回一个字符串。因此,如果您期待null,那么您可能会感到困惑。

      console.log(model.get("foo")); // null
      console.log(model.escape("foo")); // ""
      

      然而,正如 Jeremy Ashkenas 在pull report querying this issue 中指出的那样,在转义属性后检查属性的存在是没有意义的。

      【讨论】:

        猜你喜欢
        • 2016-10-10
        • 2011-06-05
        • 1970-01-01
        • 1970-01-01
        • 2015-04-08
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多