我可以保护原生JavaScript函数吗

ilo*_*ast 1 javascript security native

有什么方法可以防止用户覆盖本机功能?

例:

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

getRand(); //gives a nice random number
Run Code Online (Sandbox Code Playgroud)

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

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

getRand(); //gives 0 :(
Run Code Online (Sandbox Code Playgroud)

有什么方法可以防止本机函数被覆盖?也许使用CSP或密封对象...这甚至可能吗?

Mat*_*zer 5

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

Object.freeze()方法冻结一个对象:即,防止向其添加新属性;防止现有属性被删除;并防止更改现有属性或其可枚举性,可配置性或可写性。本质上,对象实际上是不可变的。该方法返回被冻结的对象。

Object.freeze(Math);

// This won't work or it won't replace
// the function with the whole string...
Math.random = "hello world"; 
Run Code Online (Sandbox Code Playgroud)

除非任何其他库都可以依赖于扩展或修改Math(例如,也许polyfill可能需要添加函数或其他功能,Math但是正如我之前说过的那样,冻结内置对象时这只是一个可能的问题...)。

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

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

Object.defineProperty(Math, "random", { 
    configurable: false,
    writable: false 
});
Run Code Online (Sandbox Code Playgroud)