2011-03-21 64 views
5

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

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

是否有任何已有的系统开源系统可用,我可以根据自己的需要进行修改?我在搜索中没有找到任何东西。或者关于我应该如何继续下一步的一些指示?

编辑:发现http://cs.sru.edu/~contest/rocktest/,并试图了解他们的代码,但仍在寻找更好的选择,最好是在PHP

+0

的可能重复的[分级计划 - 编译/内执行的C++代码C++](http://stackoverflow.com/questions/5131085/grading-program-compile-executing-c-code-within-c) – 2011-03-21 01:40:23

+1

是否http://ideone.com/太简单了? – Johnsyweb 2011-03-21 01:42:28

+1

查看[codepad.org](http://codepad.org/)的[关于页面](http://codepad.org/about)。即:“策略是在ptrace下运行所有​​的东西,许多系统调用都被禁止或忽略。编译器和最终的可执行文件都在chroot jail中执行,并且资源限制严格。” – 2011-03-21 01:56:56

回答

1

我建议Ideaone API:http://ideone.com/api

+0

只需添加以回答为基础,直至现在我的研究结果:Ideone提供了一个免费的soap api,您可以使用C语言等多种语言提交代码,并返回输出或错误。他们也给予记忆和时间使用。 – itsfrosty 2011-03-21 12:22:37

1

你必须在sandboxed environment来执行代码。 SO上有一个similar question可能有帮助。

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

+0

Coudl你会详细介绍如何在正常的chroot/sysjail程序(这不是一个完整的解决方案)之外创建一个沙箱 – Earlz 2011-03-21 01:57:18

0

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

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

如果你这样做,只需要一个虚拟机就足够每个人的代码。

+0

因此,基本上使用openvz或用户模式的linux来限制用户到他自己的环境。第二部分是用我自己的方式取代不安全的图书馆电话 - 对现有解决方案有何看法? – itsfrosty 2011-03-21 01:49:09

+0

@itsfrosty:整个现有解决方案“用您自己的替换C头”?不,但是如果使用C语法分析库(可以在eclipse SDK中找到)很容易实现。 – CromTheDestroyer 2011-03-21 13:04:21

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

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

+0

适用于AppArmor的+1以及迄今为止最强大的解决方案 – 2011-03-21 04:30:05

0

我将使用uevalrun

“的基本用例uevalrun是提交的编程竞赛的参赛者解决方案的评价:uevalrun编译解决方案,用测试输入运行它,将其输出与预期输出进行比较,并写出状态报告。“