国产大模型 DeepSeek,能跟 ChatGPT 一战,还不用梯子,确定不试试?

国产大模型 DeepSeek,能跟 ChatGPT 一战,还不用梯子,确定不试试?_第1张图片
深度求索公司最新推出的 自研 MoE 模型 DeepSeek-V3,多项评测成绩超越了 Qwen2.5-72B 和 Llama-3.1-405B 等其他开源模型,并在性能上和世界顶尖的闭源模型 GPT-4o 以及 Claude-3.5-Sonnet 不分伯仲
国产大模型 DeepSeek,能跟 ChatGPT 一战,还不用梯子,确定不试试?_第2张图片
国产大模型 DeepSeek,能跟 ChatGPT 一战,还不用梯子,确定不试试?_第3张图片

我尝试了下,同样的编码场景,通义千问给出的答案没有实际帮助,但是 DeekSeek 却告之具体的实现步骤与依据,一大利器呀!其效果跟 ChatGPT 比都不遑多让,关键是国内可以直接使用,不需要黑科技速度也非常快

我的问题

使用 isolated-vm 开发一个在 node.js 后端程序执行动态脚本的功能,可以绑定 objection.js 的数据库访问对象,但是希望限制 IO 范围在指定的目录,能实现吗?

答案

是的,使用 isolated-vm 可以实现你的需求,但需要注意一些细节。isolated-vm 提供了强大的隔离能力,但它本身并不直接支持文件系统的访问控制。你需要通过以下步骤来实现限制 IO 范围在指定目录的功能:


实现思路

  1. 使用 isolated-vm 创建隔离环境

    • 在隔离环境中执行动态脚本。
    • 通过 sandboxobjection.js 的数据库访问对象注入到隔离环境中。
  2. 限制文件系统访问

    • 在 Node.js 主程序中实现一个代理函数,用于处理文件系统的访问。
    • 在代理函数中检查文件路径,确保访问范围限制在指定目录。
    • 将代理函数注入到隔离环境中,替代原生的 fs 模块。

实现步骤

1. 安装依赖

确保安装了 isolated-vmobjection.js

npm install isolated-vm objection knex
2. 创建隔离环境并注入数据库对象
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);
3. 实现文件系统代理函数
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);
4. 执行动态脚本
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);

关键点

  1. 路径检查

    • safeFsAccess 函数中,使用 path.resolvestartsWith 确保文件路径在允许的目录内。
  2. 隔离环境

    • isolated-vm 提供了强大的隔离能力,确保动态脚本无法直接访问 Node.js 的主程序环境。
  3. 安全性

    • 通过代理函数限制文件系统访问,避免动态脚本越权操作。

注意事项

  • 性能开销:isolated-vm 的隔离机制会带来一定的性能开销,尤其是在频繁调用时。
  • 错误处理:确保在代理函数和动态脚本中正确处理错误,避免程序崩溃。
  • 进一步限制:如果需要更严格的限制,可以禁用 fs 模块的其他方法(如 unlinkmkdir 等)。

通过以上方法,你可以实现一个安全且功能强大的动态脚本执行环境。


给出的解答非常给力,后续我会更新一个开放平台的实战系列

你可能感兴趣的:(AI/人工智能,chatgpt)