我可以保护原生JavaScript函数吗?

时间:2016-05-30 19:51:48

标签: javascript security native

有没有办法阻止用户覆盖原生函数?

示例:

var getRand;
(function(){
  'use strict';
  getRand = function(){
    return Math.random();
  }
})();

getRand(); //gives a nice random number

页面加载后,覆盖控制台。

Math.random = function (){ return 0 };

getRand(); //gives 0 :(

有没有办法阻止本机功能被覆盖?也许使用CSP或密封对象......这甚至可能吗?

1 个答案:

答案 0 :(得分:4)

事实上,您可以使用Object.freeze(Math)

  

Object.freeze()方法冻结一个对象:即阻止new   属性被添加到它;防止现有属性   被删除;并防止现有的属性,或他们的   可更改性,可配置性或可写性。在   本质上,对象是有效不可变的。该方法返回   被冻结的物体。

Object.freeze(Math);

// This won't work or it won't replace
// the function with the whole string...
Math.random = "hello world"; 

除非任何其他库可能依赖于扩展或修改Math(例如,可能 polyfill 可能需要向Math添加函数或其他内容,但是之前说过,冻结内置物体只是一个可能的问题......)。

您还可以冻结各个属性......

...使用Object.defineProperty(...)修改现有的属性描述符:

Object.defineProperty(Math, "random", { 
    configurable: false,
    writable: false 
});