深度求索公司最新推出的 自研 MoE 模型 DeepSeek-V3,多项评测成绩超越了 Qwen2.5-72B 和 Llama-3.1-405B 等其他开源模型,并在性能上和世界顶尖的闭源模型 GPT-4o 以及 Claude-3.5-Sonnet 不分伯仲
我尝试了下,同样的编码场景,通义千问给出的答案没有实际帮助,但是 DeekSeek 却告之具体的实现步骤与依据,一大利器呀!其效果跟 ChatGPT 比都不遑多让,关键是国内可以直接使用,不需要黑科技速度也非常快
我的问题
使用 isolated-vm 开发一个在 node.js 后端程序执行动态脚本的功能,可以绑定 objection.js 的数据库访问对象,但是希望限制 IO 范围在指定的目录,能实现吗?
答案
是的,使用 isolated-vm
可以实现你的需求,但需要注意一些细节。isolated-vm
提供了强大的隔离能力,但它本身并不直接支持文件系统的访问控制。你需要通过以下步骤来实现限制 IO 范围在指定目录的功能:
使用 isolated-vm
创建隔离环境:
sandbox
将 objection.js
的数据库访问对象注入到隔离环境中。限制文件系统访问:
fs
模块。确保安装了 isolated-vm
和 objection.js
:
npm install isolated-vm objection knex
const ivm = require('isolated-vm');
const { Knex } = require('knex');
const { Model } = require('objection');
// 初始化 Knex 和 Objection
const knex = Knex({
client: 'sqlite3',
connection: {
filename: './mydb.sqlite',
},
});
Model.knex(knex);
// 创建隔离环境
const isolate = new ivm.Isolate({ memoryLimit: 128 });
const context = isolate.createContextSync();
// 将 objection.js 的数据库访问对象注入到隔离环境
const dbSandbox = {
Model: new ivm.ExternalCopy(Model).copyInto(),
};
context.global.setSync('db', dbSandbox);
const fs = require('fs');
const path = require('path');
// 指定允许访问的目录
const ALLOWED_DIR = '/path/to/allowed/directory';
// 文件系统代理函数
function safeFsAccess(filePath, operation, ...args) {
const resolvedPath = path.resolve(ALLOWED_DIR, filePath);
// 检查路径是否在允许的目录内
if (!resolvedPath.startsWith(ALLOWED_DIR)) {
throw new Error('Access to this path is not allowed');
}
// 执行文件操作
return fs[operation](resolvedPath, ...args);
}
// 将代理函数注入到隔离环境
const fsSandbox = {
readFile: new ivm.ExternalCopy((filePath, callback) => {
safeFsAccess(filePath, 'readFile', 'utf8', callback);
}).copyInto(),
writeFile: new ivm.ExternalCopy((filePath, data, callback) => {
safeFsAccess(filePath, 'writeFile', data, callback);
}).copyInto(),
};
context.global.setSync('fs', fsSandbox);
const script = `
(async function() {
// 使用 objection.js 查询数据库
const users = await db.Model.query().select('*').from('users');
console.log(users);
// 使用安全的文件系统操作
fs.writeFile('test.txt', 'Hello, world!', (err) => {
if (err) throw err;
console.log('File written successfully');
});
fs.readFile('test.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log('File content:', data);
});
})();
`;
// 在隔离环境中执行脚本
const scriptInstance = isolate.compileScriptSync(script);
scriptInstance.runSync(context);
路径检查:
safeFsAccess
函数中,使用 path.resolve
和 startsWith
确保文件路径在允许的目录内。隔离环境:
isolated-vm
提供了强大的隔离能力,确保动态脚本无法直接访问 Node.js 的主程序环境。安全性:
isolated-vm
的隔离机制会带来一定的性能开销,尤其是在频繁调用时。fs
模块的其他方法(如 unlink
、mkdir
等)。通过以上方法,你可以实现一个安全且功能强大的动态脚本执行环境。
给出的解答非常给力,后续我会更新一个开放平台的实战系列