【问题标题】:how to restrict global variables or functions in node js如何限制节点js中的全局变量或函数
【发布时间】:2013-01-14 08:53:54
【问题描述】:

nodejs中如何限制全局变量和函数?

like: 需要方法

我想限制使用 require 方法。 我不希望任何节点应用程序访问我在 express 之上构建的节点框架中的“fs”,它们只能需要我想要的模块。 而且我想限制对进程的访问,全局范围。

假设当我为任何应用加载任何 js 库时

喜欢:

var x=require('app1.js');

在我的框架中

然后我想确保这个 app1.js 不能使用 require("fs") 访问文件系统

app1.js

var x=require("fs");
exports.hello=function(){
   console.log(typeof x.readSync);
}

我希望这个控制台打印 undefined;

在这个示例中

var x=require("helper.js");
exports.hello=function(){
   console.log(typeof x.hello);
}

我想要这个控制台打印功能;

提前致谢

【问题讨论】:

  • 沙盒 3rd 方代码在这个答案中有很好的描述:stackoverflow.com/a/11796148/1762886
  • 在不同的上下文中执行代码后,vm可以返回对象吗?我可以将参数传递给内部可用的 vm 吗?

标签: node.js express


【解决方案1】:

我会创建一个新函数,其作用类似于 require。

requireSafe = function(param){
    if(!isAllowedLogic(param)) return null;
    else return require(param);
}

当有人提交代码时,您在顶部附加var require; 以防止他们使用常规的require。或者您在他们提交的内容中进行搜索,并且仅在不包含 requireeval 时才批准它。

【讨论】:

    【解决方案2】:

    你为什么要这样做?

    无法更改 require 的工作方式,因为它是一个内置的 node.js 函数。

    【讨论】:

    • 我做了一个简单的框架来托管用户服务器代码,我不希望他们访问文件系统和类似的 api。这就是为什么我要限制或抽象 require 方法。
    • 那么您应该使用 UNIX chroot 并构建安全沙箱来执行此操作。然而,节点不是这样做的正确位置。 de.wikipedia.org/wiki/Chroot
    • 我希望在 javascript 中找到一些解决方法,而不是低级编码。我有办法限制用户使用 eval,但我怀疑它是否安全。
    • 使用 chroot 不是“低级编码”。它简单的 unix 设置,是唯一可以帮助您解决问题的方法。使用 eval 作为安全机制是你能做的最糟糕的事情,真的 - 你最终会编写自己的 javascript 解释器 - 只需花几个小时了解 chroots - 真的
    【解决方案3】:

    试试this库, 有关其安全性如何工作的一些详细信息,请参阅自述文件:

    Jailed 库创建了一个 Node.js 子进程;

    子进程(下载)加载包含不受信任代码的文件作为 字符串(或者,在 DynamicPlugin 的情况下,只需使用提供的字符串 带代码)

    然后“使用严格”;附加到该代码的头部(为了 防止使用 arguments.callee.caller) 破坏沙箱;

    最后使用 vm.runInNewContext() 方法执行代码,其中 提供的沙箱仅公开了一些基本方法,例如 setTimeout(),以及用于与 申请网站。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-10
      • 2021-12-12
      • 2015-06-02
      • 1970-01-01
      • 2018-02-17
      • 2019-09-14
      • 1970-01-01
      • 2021-03-24
      相关资源
      最近更新 更多