JavaScript中的防篡改对象

由于JavaScript共享的特性,任何对象都可以被放在同一环境下运行的代码修改。

例如:

var person = {name:"caibin‘}

person.age = 21;

即使第一行定义了完整的person对象,那么第二行代码仍然可以对其添加属性,删除属性等。

我们有三个方法可以防止你做出这些行为。

一、不可扩展对象:

先来看person本身的扩展性:

Object.isExtensible(person); // true

接下来执行:

Object.preventExtensions(person);

Object.isExtensible(person) ;// false

person.age = 29;

console.log(person.age) ;//undefined

默认情况下,person.age = 29会静默失败,严格模式下,会报错。

然后,我们可以修改之前已经存在的person的属性。

例如:

person.name = "cb";

console.log(person.name); // cb

甚至可以删除:

delete person.name; // true;

console.log(person) ; // {}

小结:当对象被设置为不可扩展之后,不可以增加属性,但是可以修改,删除原来存在的属性。

二、密封的对象:

密封对象意味着:不可扩展,不能删除属性和方法,但是属性值是可以修改的。

先来看默认的对象的密封性和扩展性:

var caibin = {name:"caibin"};

console.log(Object.isSealed(caibin)); // false;

console.log(Object.isExtensible(caibin)); // true

接下来,执行密封操作:

Object.seal(caibin);

然后,检查扩展性:

console.log(Object.isExtensible(caibin)); // false 不可扩展

caibin.age = 21;

console.log(caibin.age) ;// undefined

删除属性:

delete caibin.name; // false; 删除失败

console.log(caibin.name) ;// caibin

修改属性:

caibin.name = "cb";

console.log(caibin.name);//cb 修改成功

三、冻结的对象:

这是最严格的防篡改级别,冻结的对象即不可扩展,又是密封的,对象的数据属性Writable被设置成false,这意味着不能修改属性的值。

先看对象默认的密封性,扩展性,冻结性:

var cb = {name:"caibin"}

console.log(Object.isExtensible(cb)) ;// true;

console.log(Object.isSealed(cb)) ;// false

console.log(Object.isFrozen(cb)); // false

然后,执行冻结操作:

Object.freeze(cb);

查看扩展性:

console.log(Object.isExtensible(cb)); // false

cb.age = 21;

console.log(cb.age); // undefined

查看密封性:

console.log(Object.isSealed(cb)); // true;

delete cb.name ;// false

console.log(cb.name) ;// caibin

查看Writable属性:

cb.name = "cb";

console.log(cb.name);//caibin 说明Writable属性被设置成false.

来自为知笔记(Wiz)

JavaScript中的防篡改对象,布布扣,bubuko.com

时间: 2024-10-27 12:47:39

JavaScript中的防篡改对象的相关文章

深入理解javascript之防篡改对象

javascript中对象内置有多个属性Configurable,Writable,Enumerable,Value,Get和Set,来控制属性的行为.同样的ES5也有几个方法,来指定对象的行为.我们知道,javascript中的对象是可以共享的,也是默认可拓展的: //一旦将对象设置防篡改,就不能撤销了 //众所周知,一般的对象是可以随意拓展的 var person = {name:'liufang'}; person.age = 22; document.write(person.age+"

在JavaScript中生成自定义的对象

使用对象便于组织信息.下面我们介绍如何在JavaScript中生成自定义的对象. ---------------------- JavaScript 对象 在前面几章中我们学到JavaScript中有些内置的对象,比如String, Date, Array等等.除此之外,你还可以定义自己的对象. 对象是一种特殊的数据,含有属性和函数. 下面让我们用一个例子来说明:比如一个人是一个对象.属性是与对象有联系的值,比如人的属性包括姓名,身高,体重,年龄,肤色,眼睛的颜色等等.所有人都有这些属性,但是每

javascript中遇到的字符串对象处理

在javascript中对参数处理: 1 <script> 2 function getParam() 3 { 4 urlInfo=window.location.href; //获取当前页面的url 5 intLen=urlInfo.length; //获取url的长度 6 offset=urlInfo.indexOf("?"); //设置参数字符串开始的位置 7 strKeyValue=urlinfo.substr(offset,len); //取出参数字符串 这里会获

Javascript中使用WScript.Shell对象执行.bat文件和cmd命令

Javascript中使用WScript.Shell对象执行.bat文件和cmd命令 http://www.cnblogs.com/ZHF/p/3328439.html WScript.Shell(Windows Script Host Runtime Library)是一个对象,对应的文件是C:/WINDOWS/system32/wshom.ocx,Wscript.shell是服务器系统会用到的一种组件.shell 就是“壳”的意思,这个对象可以执行操作系统外壳常用的操作,比如运行程序.读写注

WebApi系列~安全校验中的防篡改和防复用

回到目录 web api越来越火,因为它的跨平台,因为它的简单,因为它支持xml,json等流行的数据协议,我们在开发基于面向服务的API时,有个问题一直在困扰着我们,那就是数据的安全,请求的安全,一般所说的安全也无非就是请求的防篡改和请求的防复用,例如,你向API发一个查询用户账户的请求,在这个过程中,你可能要传递用户ID,用户所在项目ID等,而现在拦截工具如此盛行,很容易就可以把它的请求拦截,然后篡改,再转发,这样你的API就是不安全的,而对于订单,账户模块这种糟糕的API设计更是致命的,可

javascript中window与document对象、setInterval与setTimeout定时器的用法与区别

一.写在前面 本人前端菜鸟一枚,学习前端不久,学习过程中有很多概念.定义在使用时容易混淆,在此给向我一样刚踏入前端之门的童鞋们归纳一下.今天给大家分享一下js中window与document对象.setInterval与setTimeout定时器的用法与区别.讲得不对的地方,烦请大家指正,还望前辈.大牛多多指教! 二.window对象与document对象的用法和区别 window是全局对象,document是window对象的一个属性它也是一个对象.如图: document对象指的页面这个文档

JavaScript中的Event事件对象详解

JavaScript事件[event] 在JavaScript中对于事件来讲,首先,我们需要了解这样几个概念:事件:事件处理程序:事件类型:事件流:事件冒泡:事件捕获:事件对象:浏览器内核:事件绑定:事件方面的性能优化(事件委托.移除事件处理程序):常见的浏览器兼容问题等. 什么是事件event: JavaScript事件是:浏览器.文档(document)窗口中的发生的特定的交互瞬间:而JavaScript和HTML之间的交互行为就是通过事件来触发的. 事件处理程序: 事件处理程序:我们用户在

javascript中对两个对象进行排序 和 java中的两个对象排序

javascript中的对象数组排序 一 定义一个对象数组 var text = [{"name":"张","age":24},{"name":"秦","age":26},{"name":"刘","age":29},{"name":"司空","age":78},{&qu

JavaScript中的类数组对象

在javascript中,对象与数组都是这门语言的原生规范中的基本数据类型,处于并列的位置. 一般来说,如果我们有一个对象obj和一个数组a: obj["attr1"];    //取obj对象的attr1属性 a[1];   //取数组a中的第二个元素 但是,有些时候,也会将一个对象“伪装”成一个数组来用,我们把这种对象称为“类数组对象”,再此我们可以給它下一个定义,请看如下的代码: var a= {}; var i = 0; for(i=0; i<10 ; i++){ a[i