如何为在线 IDE 的 node.js 中用户提交的代码安全地运行测试用例

问题描述 投票:0回答:0

我正在开发一个在线代码学习平台,如 Leetcode/Hackerrank 和 express.js,用户可以在其中提交代码并在该代码上运行测试用例。目前我已经在 docker 容器中使用“vm2”库编译用户提交的代码,以便用户不能在服务器中运行恶意代码。这种在服务器中运行用户代码的方法运行良好。 但是对于在用户提交的代码上运行测试用例,我遇到了一些问题,因为我没有在 vm2 或 Jest 库中找到任何可以在 vm2 环境中运行 jest 的 API。目前,我正在为用户提交的代码运行测试用例,如下面的带有子进程的代码片段可以正常工作,但我不满意在虚拟环境之外运行的用户代码,这可能会导致安全问题。谁能指出我如何安全地执行测试用例?

import { FileFata } from '@interfaces/util.interface';
import { createFileFromUserCode, removeTempFile } from '@utils/util';
const util = require('util');
const execFile = util.promisify(require('child_process').execFile);
import { v4 as uuidv4 } from 'uuid';

class ExecutionTestService {
  static executeTestCode = async (executeData: string) => {
    try {
      const fileId = uuidv4();

      const fileName = `src/tests/user/${fileId}.test.ts`;

      const fileContent = executeData;
      const fileData: FileFata = { fileName, fileContent };
      await createFileFromUserCode(fileData);

      const { stdout, stderr } = await execFile('jest', [`user/${fileId}.test.ts`], { timeout: 10000 }); //here jest consider file directory from tests folder

      console.log('=========stdout===========================');
      console.log('stdout:::', stdout);
      console.error('stderr:', stderr);
      console.log('===========stdout=========================');
      await removeTempFile(`${fileName}`);

      const output = { stdout, stderr, error: null };

      return output;
    } catch (error) {
      console.log('error', error);

      return { stdout: null, stderr: null, error };
    }
  };
}

export default ExecutionTestService;
node.js docker express jestjs ide
© www.soinside.com 2019 - 2024. All rights reserved.