1

当您在代码中创建新的 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);
}

这导致了以下列表:

  • 数组缓冲区
  • 整数8数组
  • Uint8Array
  • Uint8ClampedArray
  • Int16Array
  • Uint16Array
  • Int32Array
  • Uint32Array
  • Float32Array
  • 浮点64数组
  • 数据视图
  • 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
  • 全球的
  • 过程
  • 全球的
  • 缓冲
  • 设置超时
  • 设置间隔
  • 清除超时
  • 清除间隔
  • 立即设置
  • 清除立即
  • 安慰
  • 模块
  • 要求
  • 味精
  • _
  • 钥匙

你可以看到我们的msg变量被添加在那里,这很好,但是有很多全局变量我不想暴露。我想公开一些危害较小的,例如setTimeout,console等,但绝对不是require,process等。有谁知道我如何在不产生全新子进程的情况下克服这个问题?

4

1 回答 1

1

我不知道这是否是最好的解决方案,但我确实做到了。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 对节点核心模块的访问权限,请参阅此问题

于 2013-10-15T23:21:30.670 回答