使用NodeJS API限制启动另一个节点文件

时间:2015-12-09 08:31:02

标签: node.js

如何启动另一个NodeJS应用程序(作为子进程)并限制某些NodeJS API文件(例如,不允许NodeJS进程访问<input type="text" name="expectedClosedDate" class="form-control width-160 float-left" uib-datepicker-popup="{{expectedClosedDate.format}}" min-date="minDate" ng-model="ideaDetail.Idea.ExpectedCloseDate" datepicker-options="expectedClosedDate.dateOptions" close-text="Close" is-open="expectedClosedDate.isOpened" disabled date-disabled="expectedClosedDate.disabled(date, mode)" /> <span class="addon-brit input-group-addon mouse-hand float-left" ng-click="expectedClosedDate.open()" style="width:50px;line-height: 1.68"> <span class="glyphicon glyphicon-calendar"></span> </span> )。

另外,如果这是可能的并且我要限制对require('fs')的访问,那么用户是否可以通过其他任何方式访问文件系统? (忽略通过命令行)

1 个答案:

答案 0 :(得分:3)

简短回答:你不能。

require是一个全局函数,您可以在文件范围内重新定义:

require = function(module) { return null; };
// OR
global.require = function(module) { return null; };

此更改是您修改的文件的本地更改,因此您无法使用此文件启动child_process来“准备”环境。

另一个想法是弄乱require缓存。 console.log ging require变量,您可以看到它存储了所需文件的缓存。您可以简单地require要私有的所有模块,并使用其他对象或空对象替换(不删除)它们在缓存中。 遗憾的是......如果您的用户知道require如何工作,他基本上可以清除require缓存并再次要求文件,使该解决方案无法实现。

潜在的解决方案可能是强制用户使用包裹require的函数:

var myRequire = function(moduleName) {
  // Validate or refuse requiring depending on the `moduleName` value
  ...
  else
    return require(moduleName);
};

首先检查用户是否使用全局require函数(可能通过自定义JS解析器或其他东西?)。

希望它有所帮助!