javascript - 如何限制 Node repl 实例,使它们无法访问全局范围?

标签 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);
}

结果如下:

  • 数组缓冲区
  • 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/

相关文章:

mysql - 使用 Nodemailer 获取 SQL 数据并发送多封电子邮件?

javascript - 将应用程序部署到谷歌应用程序引擎并希望启动 api 和客户端

php - 是否可以在 PHP 函数内部将变量设置为全局变量?

javascript - 重置 div 的内容

javascript - JS CSS 字体颜色和下划线

javascript - (Javascript)如何删除警报框后的 'undefined'

javascript - 重新启动 Flip.js

node.js - 如何在更新 Mongoose 上推送对象数组

java - 在运行时,private、public、package 关键字之间有什么区别吗?

scope - prog 与 let in LISP 性能差异