我打算在CodeChef,TechGig等方面建立一个在线评判。最初,我将只接受C / C ++中的解决方案。
已经考虑过相同的安全模型,但我现在关注的是如何为执行和测试部分建模。
方法1
似乎更受欢迎的方法是将标准输入重定向到可执行文件并将标准输出重定向到文件,例如:
./submission.exe < input.txt > output.txt
然后逐个比较output.txt文件和一些solution.txt文件并报告结果。
方法2
我看到的第二种方法是不允许用户编写main()。相反,编写一个函数,以字符串的形式接受一些参数,并设置一个全局变量作为输出。例如:
//This variable should be set before returning from submissionAlgorithm()
char * output;
void submissionAlgorithm(char * input1, char * input2)
{
//Write your code here.
}
在每一步,并且对于要执行的测试用例,重复调用函数submissionAlgorithm()并检查输出变量的结果。
形成初步分析我发现方法2不仅是安全的(我会阻止对提交的代码对文件系统的所有读写访问),而且还可以更快地执行测试用例(可能是?),因为测试结果的计算将在内存中进行。
我想知道为什么方法1优于方法2的原因是否有任何理由。
P.S:当然,我会在Linux服务器上托管在线评判引擎。答案 0 :(得分:4)
不要误解,但你需要从更高的角度来看待安全性。问题不在于输入和输出被写入文件,这也不会对性能造成太大影响。但是你需要管理可以实际处理你的进程(在第二种情况下)或整个系统的子目录(调用操作系统写入磁盘,获取太多内存......)
免责声明我绝不是安全专家。