Javascript Browserify私有全局变量

Javascript Browserify私有全局变量,javascript,browserify,Javascript,Browserify,如何使用browserify创建私有自定义全局变量? 例如,可以从所有browserify文件(require())访问变量,但不能在browserify块、console或其他脚本无法访问该变量。 我尝试过全局,但可以从窗口/控制台访问 编辑:没有答案?我真的需要它来防止自我XSS(例如,恶意脚本窃取用户数据或发送坏数据包删除他的房间等…) 示例代码: Main.js mycustomglobal.test = require('blabla'); mycustomglobal.test2

如何使用
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

我不太确定您想要实现什么(可能会发布更多的代码),但我假设您希望在不公开全局的情况下做一些事情?您可以使用立即调用的函数吗?只要您的所有代码都在函数中,所有内容都将受到保护,但功能上不会发生任何变化:

(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_文件_1.js:

(function() {
    var private_non_global = 1234;
    // Do some stuff...
    script2(private_non_global); // Go to next script...
})();
js_文件_2.js:

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

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

我不太确定您想要实现什么(可能会发布更多代码),但我假设您希望在不公开全局变量的情况下执行某些操作?您可以使用立即调用的函数吗?只要您的所有代码都在函数中,所有内容都将受到保护,但功能上不会发生任何变化:

(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_文件_1.js:

(function() {
    var private_non_global = 1234;
    // Do some stuff...
    script2(private_non_global); // Go to next script...
})();
js_文件_2.js:

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

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

我认为这样的东西会适合您的需要。您需要创建一个模块,我更喜欢将其命名为
private\u globals.js

var globals={};
module.exports=globals;
在其他文件中,可以使用此模块的导出对象

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

我想不出别的办法,除非你弄乱了browserify的来源

我想这样的东西适合你的需要。您需要创建一个模块,我更喜欢将其命名为
private\u globals.js

var globals={};
module.exports=globals;
在其他文件中,可以使用此模块的导出对象

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


我想不出别的办法,除非你弄乱了browserify的来源

我想你做不到。可能最接近的方法是使用API定义一个带有私有变量的模块,以从其他JS访问该变量——但该API也让控制台对其进行检查。你打算在这个变量中保留什么?我打算在游戏中保留不同的对象,例如一个用于UI,一个用于画布,另一个用于声音等。。。为了使数据更难通过控制台编辑或获取,我想这样做可能会对您有所帮助:我认为您做不到。可能最接近的方法是使用API定义一个带有私有变量的模块,以从其他JS访问该变量——但该API也让控制台对其进行检查。你打算在这个变量中保留什么?我打算在游戏中保留不同的对象,例如一个用于UI,一个用于画布,另一个用于声音等。。。为了使数据更难通过控制台编辑或获取,我想这样做可能会对您有所帮助:这并不是我想要的。我不想用函数将变量传递给另一个脚本,但我想做一些类似全局变量的东西,但保持私有。这是一个矛盾修饰法,你不能拥有它(至少在JavaScript中不能)。如果你不想“公开”全局变量,你必须使用作用域。这样想:全局变量赋予每个人相同的权利。优点:所有脚本和作用域都可以访问变量。缺点:其他任何东西都可以访问它,例如未知代码、控制台、浏览器扩展、其他库等。那么,是否不可能声明一个仅在browserify块内的自定义“全局”变量?也许可以为上下文添加一些示例代码,并给出您希望发生和不希望发生的事情的确切示例。然后我们可能会帮你找到一个更好的解决方案,因为globals可能不是你想要的。那不是我想要的。我不想用函数将变量传递给另一个脚本,但我想做一些类似全局变量的东西,但保持私有。这是一个矛盾修饰法,你不能拥有它(至少在JavaScript中不能)。如果你不想“公开”全局变量,你必须使用作用域。这样想:全局变量赋予每个人相同的权利。优点:所有脚本和作用域都可以访问变量。缺点:其他任何东西都可以访问它,例如未知代码、控制台、浏览器扩展、其他库等。那么,是否不可能声明一个仅在browserify块内的自定义“全局”变量?也许可以为上下文添加一些示例代码,并给出您希望发生和不希望发生的事情的确切示例。然后我们可能会帮助您找到更好的解决方案,因为globals可能不是您想要的。globals.privateVar2可以访问(获取并设置)所有内容(除非我遗漏了什么?),它应该只有在使用require获取globals对象后才可以访问。如果require未公开,则无法获取globals对象。我不确定这是否能在捆绑包之间工作,但不暴露require的唯一方法是封装require