- Published on
JavaScript 防篡改对象
- Authors
- Name
- Tszkong Cheng
目前互联网的业务已经非常普及,大家都利用网页展示自己的品牌、产品、提供业务服务等。这也就导致了许多不法分子通过篡改网页达到自己的非法盈利目的。如果您只是为了日常防护,可以使用安全狗的服务器安全软件,可以防病毒、防攻击、防篡改、修复服务器漏洞等等,这是免费使用的产品,足以支持日常的服务器安全防御。
防篡改对象
防篡改对象为了防止意外地修改别人的代码,甚至用不兼容的功能重写原生对象。注意:一旦把对象定义为防篡改,就无法撤销了。
不可扩展对象
默认情况下,所有对象都是可扩展的。任何时候都可以给对象添加属性和方法。如:
var person = { name: "nickname" };
person.age = 20;
怎么禁止再给对象添加属性和方法?使用 Object.preventExtensions()
方法可以改变这个行为。
var person = { name: "nickname" };
Object.preventExtensions(person);
person.age = 20;
console.log(person.age); // undefined
使用 Object.preventExtensions()
防篡改方法后,在非严格模式下会静默失败,在严格模式下会导致抛出错误。
还可以使用 Object.istExtensible()
方法可以确定对象是否可以扩展。
密封的对象
密封对象不可扩展,不能删除属性和方法。使用 Object.seal()
方法。
var person = { name: "nickname" };
Object.seal(person);
person.age = 20;
delete person.name;
console.log(person.age, person.name); // undefined "nickname"
添加属性和删除属性的操作都被忽略了。在非严格模式下无任何影响,在严格模式下添加或删除对象会导致错误。使用 Object.isSealed()
可以检测对象是否被密封了。使用 Object.isExtensible()
检测密封的对象会返回 false。
冻结的对象
最严格的防篡改对象——冻结对象。既不可扩展,又是密封。可以使用 Object.freeze()
方法冻结对象。
var person = { name: 'nickname' };
Object.freeze(person);
person.age = 20;
delete person.name;
person.name = "zhangsan";
冻结对象在非严格模式下会被忽略,在严格模式下会抛出错误;因为冻结对象是密封的又是不可扩展的。所以 Object.isExtensible()
和 Object.isSealed()
检测冻结对象会返回 false 和 true。
冻结对象可以有效防止有人意外或者有意地修改库中的核心对象。