4

我想构建一个基于 Web 的服务,让用户输入一些 C 代码,然后服务器将编译并运行并返回结果。我知道,我知道,安全噩梦。所以也许我可以选择 chroot 或 lxc 或类似的东西。关于这些,stackoverflow 上有很好的帖子。另一种选择是使用编程竞赛软件。

我正在做的不是一般的编程目的。用户将能够向一些存根函数添加代码,仅此而已。他们不需要能够使用指针、数组或字符串。他们不应该能够打开/关闭/读取/写入文件或套接字或共享内存。他们甚至无法创建自己的功能。他们应该只能执行以下操作:

// style comments
/* */ style comments
declare variables of type int, double, float, int64_t, int32_t, uint64_t, uint32_t
for, while, do
+, -, *, /, % arithmetic operators ( * as dereference is NOT allowed )
( )
+, - unary operators
++, -- operators
math functions like sin, cos, abs, fabs, etc
a bunch of API functions that will exist
switch, case, break
{ }
if, else, ==, !=
=, +=, -=, *=, /=, etc

有没有一种工具可以用来检查给定的 C 代码块,以确保它只包含那些元素?

如果我找不到现有的解决方案,我可以使用 Antlr 或类似的东西自己想出它。

4

1 回答 1

1

有关运行用户代码的 Web 服务的真实示例,请查看Travis CI持续集成服务。开源项目使用它以集中方式运行其单元测试。Travis 流程有点像这样:

  • 从已知良好的配置启动全新的虚拟机。
  • 加载和编译用户代码。
  • 运行测试并显示结果。
  • 丢弃虚拟机。

有一个时间限制(10 分钟 IIRC)来防止人们在系统上运行僵尸网络,但除此之外,VM 功能齐全并连接到 Internet。无需限制语法或其他人为限制。

要记住的想法是,无论您对用户进行多少限制,您都永远无法保护服务器免受用户代码的威胁。另一种方法是假设服务器在被用户代码触及的那一刻就完全被破坏了,然后就将其丢弃,这就是 Travis 所做的。VM 软件通常具有快照功能来帮助这种事情。

于 2013-04-24T18:07:32.113 回答