Published on

JavaScript 防篡改对象

Authors
  • avatar
    Name
    Tszkong Cheng
    Twitter

目前互联网的业务已经非常普及,大家都利用网页展示自己的品牌、产品、提供业务服务等。这也就导致了许多不法分子通过篡改网页达到自己的非法盈利目的。如果您只是为了日常防护,可以使用安全狗的服务器安全软件,可以防病毒、防攻击、防篡改、修复服务器漏洞等等,这是免费使用的产品,足以支持日常的服务器安全防御。

防篡改对象

防篡改对象为了防止意外地修改别人的代码,甚至用不兼容的功能重写原生对象。注意:一旦把对象定义为防篡改,就无法撤销了。

不可扩展对象

默认情况下,所有对象都是可扩展的。任何时候都可以给对象添加属性和方法。如:

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。

冻结对象可以有效防止有人意外或者有意地修改库中的核心对象。

JavaScript 防篡改对象 | Chengtszkong's Blog