组织编程竞赛 - 如何编译和执行

时间:2011-03-21 01:20:10

标签: php c linux compiler-construction

我正在构建一个基于Web的界面,人们可以输入简单的C代码来解决算法编程问题。我正在使用Ace编辑器,人们可以输入代码,当按下运行按钮时,C代码被发送到服务器,编译并输出回发送。

如何以安全的方式完成第二部分。我的意思是给出一个C代码文件,编译并执行它。我不相信代码,所以我如何确保它不是恶意的,不会损害我的系统。还有如何施加记忆和时间限制。

是否有现有的系统开源系统可以修改以满足我的需求?我在搜索中找不到任何内容。或者关于我下一步该如何进行的一些指示?

编辑:找到http://cs.sru.edu/~contest/rocktest/并尝试了解他们的代码但仍在寻找更好的选项,最好是在php中

5 个答案:

答案 0 :(得分:2)

允许我插入AppArmor,这是一个简单的强制访问控制机制,可以简化创建这些类型的沙箱。这是我用来限制xpdf PDF查看器的配置文件:

#include <tunables/global>

/usr/bin/xpdf {
  #include <abstractions/base>
  #include <abstractions/bash>
  #include <abstractions/X>
  #include <abstractions/fonts>

  /dev/tty rw,
  owner /dev/pts/* rw,
  /etc/papersize r,
  /etc/xpdf/* r,
  /bin/bash ix,
  /usr/bin/xpdf r,
  /usr/bin/xpdf.bin rmix,
  /usr/share/xpdf/** r,
  /usr/share/icons/** r,
  owner /**.pdf r,
  owner /tmp/* rw,
}

您可以在半天左右的时间内了解限制所选应用程序的基本知识,并在另外半天内为您的服务器编写配置文件。 (那个xpdf个人资料花了我大约四分钟的时间来写,但我知道我在做什么。我们在一个下午的过程中在一家领先的在线零售商的面向公众的服务器上部署了AppArmor,与其他公司的结果相似部署。)

AppArmor还提供an easy interface for configuring run-time limits,例如允许进程分配多少内存:

rlimit as <= 100M,  # limit address space to 100 megabytes

AppArmor最容易在Ubuntu,openSUSE,SLES,PLD,Mandriva,Pardis或Annvix发行版上使用,因为这些工具已预先安装。但AppArmor的核心功能是库存Linux内核2.6.36及更高版本,以及it is possible to install AppArmor on any Linux distribution

其他类似工具包括SElinuxTOMOYOSMACK。我认为SMACK将是下一个最容易部署的,但它们中的任何一个都可以防止恶意代码损害您的系统。

答案 1 :(得分:1)

您必须在sandboxed environment中执行代码。 SO上有similar question可能有帮助。

你也可以运行一些虚拟机来执行代码,但这基本上是一个沙箱的例子 - 只是有点沉重。

答案 2 :(得分:1)

我推荐使用Ideaone API:http://ideone.com/api

答案 3 :(得分:0)

在沙盒中运行代码 - 虚拟机。

除此之外,我将删除对任何系统调用的访问权限,并且只允许调用标准C库。另外,用您自己的调用替换任何不安全的库调用,这些调用检查输入并将安全输入委托给实际函数(特别是对于malloc,您希望对每个程序可以分配的数量设置上限)。

如果您执行上述操作,只需一个虚拟机即可满足每个人的代码。

答案 4 :(得分:0)

我将使用uevalrun

  

“uevalrun的主要用例是对编程竞赛参赛者提交的解决方案程序的评估:uevalrun编译解决方案,使用测试输入运行它,将其输出与预期输出进行比较,并写入状态报告。”< / p>