繁体   English   中英

如何限制节点repl实例,使其不能访问全局范围?

[英]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);
}

结果是以下列表:

  • 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
  • 全球
  • 处理
  • 全球
  • 缓冲
  • 的setTimeout
  • 的setInterval
  • clearTimeout
  • clearInterval
  • setImmediate
  • clearImmediate
  • 安慰
  • 要求
  • 味精
  • _

您可以看到其中添加了我们的msg变量,这很棒,但是我不想公开很多全局变量。 我想公开一些危害较小的程序,例如setTimeoutconsole等,但是绝对不是诸如requireprocess等之类的东西。有人知道我如何在不产生全新子进程的情况下克服这一问题吗?

我不知道这是否是最好的解决方案,但我确实做到了。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM