SPOJ是一个列出编程难题的网站,然后允许用户编写代码来解决这些难题并将其源代码上传到服务器。然后,服务器编译该源代码(或者如果它是解释语言则对其进行解释),对代码运行一系列单元测试,并验证它是否正确解决了问题。
实现这样的事情的最佳方法是什么 - 如何对用户输入进行沙箱处理以使其不会危及服务器?您应该使用SELinux,chroot还是虚拟化?这三个加上我没有想过的其他东西?
应用程序如何可靠地在监狱外传递结果,同时确保结果不会受到损害?例如,您如何防止应用程序将大量无意义数据写入磁盘或其他恶意活动?
我真的很好奇,因为这似乎是一种非常冒险的应用程序。
答案 0 :(得分:1)
从有限的用户帐户执行的chroot监狱听起来像是最好的起点(即不 root或运行您的网络服务器的同一用户)
为了防止将大量无意义的数据写入磁盘,您可以使用磁盘配额或单独的卷,而这些卷您不介意填写(假设您没有在同一用户下并行测试 - 或者您将最终处理恼人的竞争条件)
如果您想要做一些更具伸缩性和安全性的事情,您可以使用动态虚拟化主机和您自己的服务器/客户端解决方案进行通信 - 您有一个“代理”池,可以接收从X存储库或共享进行复制和编译的指令然后执行一系列测试,并通过相同的服务器/客户端协议记录输出。您的主机进程可以监视过多的磁盘使用情况并在需要时报告警告,代理可能会也可能不会在chroot jail下执行代码,如果您是超级偏执,则会在每次运行后销毁代理并启动新VM当下一个样品准备好进行测试时。如果您在云中进行大规模扩展(例如,在EC2上运行100多个代理),您只需要足够的旋转以满足需求,从而降低成本。同样,如果您要扩展规模,您可以使用Amazon SQS等缓冲请求,或者如果您正在进行实验性示例项目,那么您可以做一些更简单的事情(只需考虑分布式并行处理系统,例如seti @ home)