Browserify私有全局变量

时间:2016-04-23 11:36:03

标签: javascript browserify

如何使用browserify创建私人自定义全局变量?
例如,可以从所有browserify文件(require())访问变量,但不能在browserify块之外,console或其他脚本无法访问它。
我尝试过全局,但可以从窗口/控制台访问它。

编辑:没有答案?我真的需要这样来防止自我XSS(例如,恶意脚本窃取用户数据或发送坏包以删除他的房间等...)

示例代码:

Main.js

mycustomglobal.test  = require('blabla');
mycustomglobal.test2 = require('blablablabla');

var users = require('./users.js');

Users.js文件:

console.log(mycustomglobal);
// we need to be able to get test and test2

控制台/或其他脚本

console.log(mycustomglobal)
// we need to get undefined

2 个答案:

答案 0 :(得分:2)

我不确定你想要实现的目标(可能会发布更多代码),但我认为你想要做一些事情而不暴露全局变量?你能使用立即调用的函数吗?只要您的所有代码都在函数内部,一切都将受到保护,但没有任何功能会在功能上发生变化:

(function() {
    var module = require('your_module'),
        connection = new WebSocket('server.php'),
        data = [{score: 12, name: 'test'}, {score: 40, name: 'user1'}];
    // ... Your other code
})();

如果您有许多脚本,您可能需要将它们包装在函数中,然后使用IIF从主脚本中调用它们,传递任何参数以便它们不会泄漏:

js_file_1.js:

(function() {
    var private_non_global = 1234;
    // Do some stuff...
    script2(private_non_global); // Go to next script...
})();

js_file_2.js:

function script2(private_non_global_from_script1) {
    private_non_global_from_script1 === 1234;
    // Do more stuff, etc.
}

如果你可以改变服务器端的东西,你可以将所有代码包装在一个巨大的IIF中。您不能拥有只能访问代码的全局变量,因为任何人都可以打开控制台来访问任何全局变量。保护变量的唯一方法是封装所有代码。

答案 1 :(得分:0)

我认为这样的事情会满足你的需求。您需要创建一个模块,我更喜欢将其命名为private_globals.js

var globals={};
module.exports=globals;

在您的其他文件中,您可以使用此模块的导出对象。

var globals=require("./private_globals")
console.log(globals.privateVar1);
globals.privateVar2=10;

除非你搞乱浏览器的来源,否则我无法想到其他任何方式。