美文网首页
JS防篡改对象

JS防篡改对象

作者: 躺在家里干活 | 来源:发表于2019-09-29 10:22 被阅读0次

1. 一级保护措施:不可扩展对象

在默认情况下,所有对象都是可以扩展的,也就是说,无论什么时候都可以向对象中添加属性和方法。

例如以下,先定义一个对象,再向其添加一个新属性:

var obj = {
    name: "Tom"
}
obj.age = 20;
console.log(obj.age); //20

即使先定义好一个对象,后面也可以向其新添加属性和方法。

1.1 Object.preventExtensions()方法

现在使用Object.preventExtensions()方法可以改变这个行为,这样就不能向对象中新添加属性和方法了,但是仍然可以修改(覆盖)对象中原有的属性和方法。

var obj = {
    name: "Tom"
}
Object.preventExtensions(obj); //阻止篡改对象
obj.age = 20;
console.log(obj.age); //undefined
//修改原有的属性
obj.name = "Bob";
console.log(obj.name); //Bob

可以发现,使用了Object.preventExtensions()方法,就不能向对象中新添加属性和方法了,但是可以修改对象原有的属性和方法。

1.2 Object.isExtensible()方法

使用这个方法可以确定对象是否为可篡改,如果可篡改,则返回true,相反返回false。

var obj = {
name: "Tom"
}
console.log(Object.isExtensible(obj)); //true
Object.preventExtensions(obj); //阻止篡改对象
console.log(Object.isExtensible(obj)); //false

2.二级保护措施:密封的对象

密封对象不可扩展,且其对象的属性特性Configurable被设置为false,意味着对象的属性和方法不能通过delete操作符删除,但是仍然可以修改(覆盖)对象中原有的属性和方法。

2.1 Object.seal()方法:该方法用于密封对象。

var obj = {
    name: "Tom"
}
//密封对象
Object.seal(obj);
obj.age = 20;
console.log(obj.age); //undefined 不能新添加属性
obj.name = 'Jack'
delete obj.name;
console.log(obj.name); //Jack 不能删除对象的属性,但是对象的属性仍然可以被修改

密封的对象不能新添加属性、不能删除属性。拥有了不可扩展对象的特性。

2.2 Object.isSealed()方法

该方法用于确定对象是否是密封对象,如果是密封对象返回true,相反返回false。

var obj = {
    name: "Tom"
}
console.log(Object.isExtensible(obj)); //true
console.log(Ojbect.isSealed(obj)); //false
Object.seal(obj);
console.log(Object.isExtensible(obj)); //false
console.log(Ojbect.isSealed(obj)); //true

3. 三级保护:冻结对象

保护对象的最高级防篡改就是冻结对象。冻结的对象,即是不可扩展的,也是密封的,而且其属性的特性Writable被设置为false,也就是说属性值也不能修改。

3.1 Object.freeze()方法:该方法用于设置对象为冻结对象。

var obj = {
    name: "Tom"
}
Object.freeze(obj); //冻结对象
obj.age = 20;
console.log(obj.age); //undefined 不可扩展
delete obj.name;
console.log(obj.name); //Tom 不可删除
obj.name = "Jack";
console.log(obj.name); //Tom 不可修改

冻结对象同时拥有了不可扩展对象、密封对象的特性。

3.2 Object.isFrozen()方法

该方法用于确定对象是否是冻结对象。如果是返回true,相反返回false。

var obj = {
    name: "Tom"
}
//未冻结之前
console.log(Oject.isExtensible(obj)); //true
console.log(Oject.isSealed(obj)); //false
console.log(Oject.isFrozen(obj)); //false
//冻结对象之后
Object.freeze(obj); //冻结对象
console.log(Oject.isExtensible(obj)); //false
console.log(Oject.isSealed(obj)); //true
console.log(Oject.isFrozen(obj)); //true

总结:

  • 不可扩展对象、密封对象均可修改属性。
  • 不可扩展对象、密封对象、冻结对象均不可扩展。
  • 密封对象、冻结对象均不可删除属性。

4. Object.defineProperty() 创建一个不能被修改的对象的属性

window.scatter={
    name: "Tom"
}
Object.defineProperty(window, "scatter", {
    writable: false
});
window.scatter='Jack'
console.log(window.scatter) // {name: "Tom"} 不可修改
  • Object.defineProperty(obj, prop, options)方法接收三个参数:需要添加或修改属性的对象,属性名称,属性描述options
  • 第三个参数的options中,writablefalse 即不可改写

相关文章

  • JS防篡改对象

    防篡改对象 JS是若类型语言,变量和对象都可以被同一个运行环境中的代码修改掉;开发人员很可能会意外地修改别人的代码...

  • JS防篡改对象

    1. 一级保护措施:不可扩展对象 在默认情况下,所有对象都是可以扩展的,也就是说,无论什么时候都可以向对象中添加属...

  • js中的防篡改对象

    在js中,任何对象都可以被在同一环境中运行的代码修改,开发人员很可能意外的修改别人的代码,甚至用不兼容的功能重写原...

  • 防篡改对象

    1、不可拓展对象 使用Object.preventExtensions(obj)方法,阻止对obj添加属性或方法,...

  • JavaScript防篡改对象

    preventExtensions:不能增,能删改seal:不能增删,能改freeze:不能增删改 对象属性增删改...

  • JavaScript 防篡改对象

    开发过程中,每个开发者定义的对象可能不想要被别的开发者所重写或者新增对象属性,这时候可以将对象变为防篡改对象,当然...

  • 防篡改对象:preventExtensions(),seal()

    不可扩展对象isExtensions:不可以给对象再添加新属性和方法了,但是可以修改和删除已有的成员。 密闭的对象...

  • JS防止篡改对象(锁定/密封/冻结对象)

    JS防止篡改对象的三种方法 1.锁定对象,不可扩展的对象,但可删除 Object.preventExtensi...

  • 高级技巧

    本章内容:使用高级函数、防篡改对象、Yielding with Timers JavaScript 是一种极其灵活...

  • 深度分析JavaScript创建防篡改对象的

    本文实例讲述了JavaScript创建防篡改对象的方法。分享给大家供大家参考,具体如下: 之前的 JavaScri...

网友评论

      本文标题:JS防篡改对象

      本文链接:https://www.haomeiwen.com/subject/lyahyctx.html