在线 IDE 的 node.js 中用户提交的代码安全地运行测试用例"/>
如何为在线 IDE 的 node.js 中用户提交的代码安全地运行测试用例
我正在开发一个在线代码学习平台,如 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;
回答如下:
更多推荐
如何为在线 IDE 的 node.js 中用户提交的代码安全地运行测试用例
发布评论