考虑下面的伪代码:
(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)没有太多的麻烦工作什么办法? 如果这是不可能的,那么我就只是耸耸肩,继续前进。
如果有谁想操纵这个代码(例如恶意用户),他会改写is_allowed功能用他自己的
他可以重写你的整个JavaScript代码,甚至不使用浏览器,但模拟“浏览器的少”的请求到服务器。
有它在旧的浏览器(即IE6-8)没有太多的麻烦工作什么办法?
号任何你暴露在全球范围可以由用户改变,它是由浏览器限制javascript:
行为,避免用户被愚弄访问预先制作的环节。 火狐最近已经取得了一些怎样的变化给javascript URL协议。
由于这篇文章说: http://survey-remover.com/blog/javascript-protocol-dangers/
如铬V13,火狐V6和IE 9的,浏览器的开发者采取通知“的javascript:”的危险协议,并随后禁止代码...在Chrome和IE的情况下“的javascript:”串是当代码粘贴,而火狐不再执行该活动页面的范围之内的脚本剥离。
所以...
如果这是不可能的,那么我就只是耸耸肩,继续前进。
你应该。
提案
我不会说我对这些事情的专家。 但是,假设你可以完全包裹你的代码,并使用事件触发的行为,你可以使用一个结构是这样的:
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阻止他们。
对于任何实际需要是安全的,你将不得不重新验证服务器端。 永远不要信任客户端代码来保护你,请求甚至可能不来自你所服务的网页...
如果什么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.instance
将undefined
。
文章来源: Is there any way to prevent override/overwrite of functions/variables in singleton instance?