如何限制节点repl实例以使其无法访问全局范围?

时间:2013-10-15 22:56:05

标签: javascript node.js scope global-variables read-eval-print-loop

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

导致以下列表:

  • ArrayBuffer
  • Int8Array
  • Uint8Array
  • Uint8ClampedArray
  • Int16Array
  • Uint16Array
  • Int32Array
  • Uint32Array
  • Float32Array
  • Float64Array
  • 数据视图
  • 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
  • 全球
  • 过程
  • GLOBAL
  • 缓冲
  • 的setTimeout
  • 的setInterval
  • clearTimeout
  • clearInterval
  • setImmediate
  • clearImmediate
  • 控制台
  • 模块
  • 需要
  • MSG
  • _

你可以看到我们的msg变量已添加到其中,这很好,但是我不想公开许多全局变量。我希望揭露一些危害较小的内容,例如setTimeoutconsole等,但绝对不是requireprocess等等。有谁知道如何我可能会在没有产生全新的儿童过程的情况下克服这个问题吗?

1 个答案:

答案 0 :(得分: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对节点核心模块的访问权限,请参阅this question