有什么办法来防止越权/覆盖在单一实例函数/变量的?(Is there any way to prev

2019-08-16 17:33发布

考虑下面的伪代码:

(function(window){
   var options = { /*where everything goes */ };

   var instance = (function(options){
       for (var i in options){
       if (options.hasOwnProperty(i)){
         this[i] = options[i];
       }
     }
   })(options);

   instance.callbacks = function(cb){
     //...
   }

   instance.is_allowed = function()
    //... checks, return boolean
   }

   window.instance = instance;
})(this);

如果有谁想操纵这个代码(例如恶意用户),他会改写is_allowed功能用他自己的,例如,使用地址栏(他没有萤火虫,谁知道)。

javascript:(function(){ window.instance.is_allowed = function(){ return true; } })();

这是一个简单的例子,但是这一点,在Javascript中什么都可以覆盖。

我知道在ES5我们有Object.defineProperty,所​​以你可以设置:

// being explicit
Object.defineProperty(instance, "is_allowed", {
  enumerable: false,
  configurable: false,
  writable: false,
  value: function(){
    // do checks
  }    
});

其实,在这个意义上说最好是用Object.freeze(instance)Object.seal(instance) ,而不是Object.defineProperty ,因为以后可以再次被称为writable: false (傻吧?)

有它在旧的浏览器(即IE6-8)没有太多的麻烦工作什么办法? 如果这是不可能的,那么我就只是耸耸肩,继续前进。

Answer 1:

如果有谁想操纵这个代码(例如恶意用户),他会改写is_allowed功能用他自己的

他可以重写你的整个JavaScript代码,甚至不使用浏览器,但模拟“浏览器的少”的请求到服务器。

有它在旧的浏览器(即IE6-8)没有太多的麻烦工作什么办法?

号任何你暴露在全球范围可以由用户改变,它是由浏览器限制javascript:行为,避免用户被愚弄访问预先制作的环节。 火狐最近已经取得了一些怎样的变化给ja​​vascript URL协议。

由于这篇文章说: http://survey-remover.com/blog/javascript-protocol-dangers/

如铬V13,火狐V6和IE 9的,浏览器的开发者采取通知“的javascript:”的危险协议,并随后禁止代码...在Chrome和IE的情况下“的javascript:”串是当代码粘贴,而火狐不再执行该活动页面的范围之内的脚本剥离。

所以...

如果这是不可能的,那么我就只是耸耸肩,继续前进。

你应该。



Answer 2:

提案

我不会说我对这些事情的专家。 但是,假设你可以完全包裹你的代码,并使用事件触发的行为,你可以使用一个结构是这样的:

Closed = function(args) { return (function() {
  "use strict";

  var secret, init, get_secret, use_secret;

  init = function(something){
    secret = something;
  };

  get_secret = function() {
    return secret;
  };

  use_secret = function () {
    console.log(secret);
  };

  /* Run constructor */
  init(args);

  /* Publish API */
  return { use_secret:use_secret };

}())};

与设置它obj = Closed("Anything"); 你仍然可以有一个恶意用户覆盖use_secret()方法,因为它暴露出来,但get_secret()方法,以及任何其他内部得到保护。

如果你的init方法声明了许多事件绑定到应用程序,你可以保持你的状态,这样的私人。 该活动将能够触发内部方法,因为他们在那里从内罩,但外部代码里面绑定不会看到他们。

预订

虽然这可能会解决你的问题,我不是100%肯定它,它不被信任的反正。 希望只要能穿透你的应用程序的安全性是客户端上的任何用户。 没有什么可以从手工制作自己的对象反正更换事后你,ES5或没有ES5阻止他们。

对于任何实际需要是安全的,你将不得不重新验证服务器端。 永远不要信任客户端代码来保护你,请求甚至可能不来自你所服务的网页...



Answer 3:

如果什么is_allowed会完全地方?

(function(window){
   var options = {}, is_allowed;

   var instance = (function(options){
     for (var i in options) {
     if (options.hasOwnProperty(i)) {
        this[i] = options[i];
       }
     }
     return this;
   })(options);

   instance.callbacks = function(cb){
       /* ... */
   };

   function check_allowed(){
     /* check and let this function set [is_allowed] */
   };

  window.instance = check_allowed()
                     ? instance
                     : { callbacks: function(){(alert('not allowed'));}  };

} (this) );

jsBin样机

BTW:在你的代码, window.instanceundefined



文章来源: Is there any way to prevent override/overwrite of functions/variables in singleton instance?