2011-04-06 56 views
2

SPOJ的是一个网站,列出了编程难题,然后允许用户编写代码来解决这些难题,并上传自己的源代码服务器。服务器然后编译该源代码(或者解释它是否是解释型语言),针对代码运行一系列单元测试,并验证它是否正确地解决了该问题。架构到沙箱的编译和执行不可信的源代码

什么来实现这样的事情最好的办法 - 你怎么沙箱用户输入,使其不能妥协的服务器?你应该使用SELinux,chroot还是虚拟化?所有三个加上我还没有想到的其他东西?

如何应用可靠的通信,同时也确保了结果不受损害监狱外的结果吗?例如,如何防止应用程序将大量无意义的数据写入磁盘或其他恶意活动?

我真正好奇,因为这似乎只是一个非常危险的类型的应用程序来运行的。

回答

1

从一个受限用户帐户执行的chroot监牢听起来就像是最好的起点(即根或运行你的web服务器相同的用户)

为了防止废话庞大的数据块写入磁盘,您可以使用磁盘配额或单独的卷,您不介意填满(假设您不是在同一用户下并行测试 - 否则最终会处理恼人的竞争条件)

如果您想要要做更具伸缩性和安全性的事情,您可以使用动态虚拟化主机与您自己的服务器/客户端解决方案进行通信 - 您有一个“年龄池” nts'接收指令以从X存储库或共享中复制和编译,然后执行一系列测试,并通过相同的服务器/客户端协议将输出记录回来。您的主机的过程可以观看过多的磁盘使用情况和报告警告,如果需要,代理人可能会或可能不会chroot监牢下执行代码,如果你是超级偏执狂,你会在每次运行后破坏剂和旋转了一个新的虚拟机当下一个样品准备好进行测试时。如果您在云中进行大规模(例如,运行在EC2上的100多个代理商),您只有足够的时间来满足需求,从而降低成本。同样,如果你打算进行扩展,你可以使用像Amazon SQS这样的缓冲请求,或者如果你正在做一个实验样本项目,那么你可以做更简单的事情(只考虑分布式并行处理系统,例如seti @ home)

+0

“并因此降低您的成本。” - 考虑到降低成本,为什么不使用[Ideone API(http://ideone.com/api)?它已经准备好并免费供小型非商业项目使用。 – kuszi 2011-04-08 08:45:18

+0

@ŁukaszKuszner,我指的是商业部署的持续成本。一旦您的成本按每小时美元计算,开发成本变得微不足道;) – saschabeaumont 2011-04-11 00:31:16