当您在代码中创建新的 repl 实例时,它会自动访问全局范围内的任何内容。您可以修改 repl 上下文以在本地范围内公开一些自定义变量,以便 repl 可以访问它们,但我没有看到消除对全局范围的访问的简单方法。我希望我能给 repl 一个新的空白全局范围。
这是一个示例 repl 实例:
var repl = require('repl'),
msg = "Hello world!";
repl.start('> ').context.msg = msg;
在该 repl 中我输入了以下内容:
for (var key in global) {
console.log(key);
}
结果如下:
- 数组缓冲区
- Int8Array
- Uint8Array
- Uint8ClampedArray
- Int16Array
- Uint16Array
- Int32Array
- Uint32Array
- Float32Array
- Float64Array
- 数据 View
- DTRACE_NET_SERVER_CONNECTION
- DTRACE_NET_STREAM_END
- DTRACE_NET_SOCKET_READ
- DTRACE_NET_SOCKET_WRITE
- DTRACE_HTTP_SERVER_REQUEST
- DTRACE_HTTP_SERVER_RESPONSE
- DTRACE_HTTP_CLIENT_REQUEST
- DTRACE_HTTP_CLIENT_RESPONSE
- COUNTER_NET_SERVER_CONNECTION
- COUNTER_NET_SERVER_CONNECTION_CLOSE
- COUNTER_HTTP_SERVER_REQUEST
- COUNTER_HTTP_SERVER_RESPONSE
- COUNTER_HTTP_CLIENT_REQUEST
- COUNTER_HTTP_CLIENT_RESPONSE
- 全局
- 进程
- 全局
- 根
- 缓冲区
- 设置超时
- 设置时间间隔
- 清除超时
- 清除间隔
- 立即设置
- 立即清除
- 控制台
- 模块
- 需要
- 消息
- _
- key
您可以看到我们的msg
在那里添加了变量,这很棒,但是有很多全局变量我不想公开。我想揭露一些危害较小的,比如setTimeout
, console
等等,但绝对不是像 require
这样的东西, process
等等。有谁知道我如何在不产生全新子进程的情况下克服这个问题?
最佳答案
我不知道这是否是最好的解决方案,但我确实做到了这一点。 repl 的上下文对象是全局对象。它只是自动用 global
中的所有内容进行增强。这意味着您可以迭代其上的属性并删除您不感兴趣的属性。
https://gist.github.com/Chevex/7000130
// Function to determine if an array contains a specific value.
function contains(array, value) {
for(var i = 0; i < array.length; i++) {
if(array[i] === value) return true;
}
return false;
}
var repl = require('repl'),
newRepl = repl.start('> ');
var allowedGlobals = ['ArrayBuffer', 'Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array',
'Uint32Array', 'Float32Array', 'Float64Array', 'DataView', 'Buffer', 'setTimeout', 'setInterval',
'clearTimeout', 'clearInterval', 'console', '_'];
for (var key in newRepl.context) {
if (!contains(allowedGlobals, key)) {
delete newRepl.context[key];
}
}
必须维护我想要允许的全局变量的字符串数组,这有点烦人,但至少将它们列入白名单。如果 Node 更新并向全局范围添加新内容,则在我明确将其添加到列表之前,它不会公开。
如果您还需要将 repl 命令列入白名单或消除 repl 对 Node 核心模块的访问,请参阅 this question .
关于javascript - 如何限制 Node repl 实例,使它们无法访问全局范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19392483/