[英]How do I limit node repl instances so they cannot access global scope?
在代码中创建新的repl实例时,它会自动访问全局范围内的任何内容。 您可以修改repl上下文以在本地范围内公开一些自定义变量,以便repl可以访问它们,但是我看不到消除对全局范围的访问的简便方法。 我希望我可以给repl一个新的空白全局范围。
这是一个示例repl实例:
var repl = require('repl'),
msg = "Hello world!";
repl.start('> ').context.msg = msg;
在该副本中,我输入了以下内容:
for (var key in global) {
console.log(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];
}
}
必须维护一个我想允许的全局变量的字符串数组是一种烦人的事情,但是至少此方法将它们列入了白名单。 如果节点更新并将新内容添加到全局范围,则在我将其明确添加到列表之前,它不会公开。
如果您还需要将repl命令列入白名单或消除repl对节点核心模块的访问,请参阅此问题 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.