首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何静态分析文件是否适合导入?

问如何静态分析文件是否适合导入?
EN

Stack Overflow用户
提问于 2016-05-04 19:33:12
回答 2查看 90关注 0票数 1

我有一个CLI程序,可以用描述指令的文件列表来执行,例如

代码语言:javascript
复制
node ./my-program.js ./instruction-1.js ./instruction-2.js ./instruction-3.js

下面是我导入和验证目标文件是否为指令文件的方法:

代码语言:javascript
复制
const requireInstruction = (instructionFilePath) => {
    const instruction = require(instructionFilePath)

    if (!instruction.getInstruction) {
        throw new Error('Not instruction file.');
    }

    return instruction;
};

这种方法的问题是,它将执行文件执行,而不管它是否与预期的签名匹配,即如果文件包含诸如连接到数据库的辅助操作:

代码语言:javascript
复制
const mysql = require('mysql');

mysql.createConnection(..);

module.exports = mysql;

Not instruction file.将启动,我将忽略该文件,但副作用将保留在后台。

如何安全地验证目标文件签名?

最坏的情况是,如果文件被确定为不安全,有没有一种传统的方法来完全用沙箱保护请求逻辑并终止进程?

EN

回答 2

Stack Overflow用户

发布于 2016-05-09 05:05:24

在最坏的情况下,如果文件被确定为不安全,有没有一种传统的方法来完全用沙箱保护require逻辑并终止

进程?

将检查逻辑移动到特定的js文件中。当一切正常时让它成为process.exit(0),当它出错时让它成为process.exit(1)。

在您当前的程序中,不是通过require加载文件,而是使用child_process.exec调用您的新文件,为它提供所需的参数以知道要测试哪个文件。

在更新后的程序中,绑定close事件以了解返回代码是0还是1。

如果您需要比0或1更多的信息,请将其放入将加载指令的新js文件中,将一些JSON.stringified数据打印到stdout (console.log),然后在调用child_process.exec的回调中检索它,然后对其执行JSON.parse操作。

或者,你有没有研究过AST处理?http://jointjs.com/demos/javascript-ast

它可以帮助您识别未嵌入到导出函数中的代码段。

票数 1
EN

Stack Overflow用户

发布于 2016-05-09 08:26:01

(注:我在IRC上与作者讨论了这个问题。我的答案中可能有一些原始问题中没有的上下文。)

鉴于您的场景纯粹是为了防止意外包含非指令文件,而不是为了防止恶意行为,使用Esprima之类的静态分析可能就足够了。

一种方法是要求每个指令文件导出某种具有name属性的对象,其中包含指令文件的名称。由于除了字符串文字之外没有任何东西可以放入其中,因此可以相当肯定的是,如果不能通过静态分析找到name属性,那么该文件就不是指令文件-即使是在JavaScript这样不能完全静态分析的语言中也是如此。

对于本线程的任何读者,如果他们试图防止恶意行为,而不是意外-例如,在接受来自用户的不受信任的代码时: you cannot sandbox or 'validate‘JavaScript or Node.js (也不能使用vm模块),上面的解决方案将不适用于您的。您需要系统级的容器化或虚拟化来安全地运行这类代码。没有其他选择。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37026609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档