2

我目前正在编写一个自动源代码验证工具。基本上,学生必须上传他们的 C# 源代码文件作为不同任务的解决方案。服务器在一个框架内编译这些文件,并根据不同的输入文件检查程序。如果程序生成的输出是有效的(等于预定义的输出),则程序是有效的并且学生获得该程序的分数。

但我认为我不能信任学生;)他们可能会尝试获取文件访问权限或在服务器上执行其他坏事。

我可以做些什么来将访问限制在最低限度?
我需要考虑什么?

已经想好了:

  • 文件访问
  • 最大限度。执行时间处理时间
  • 启动其他程序
  • 做网络的东西
  • 反射

目前,我能想象的检查代码的唯一方法是使用正则表达式搜索“文件”、“网络”、“进程”等关键字。

但我很确定这是非常不安全的。
有什么建议么?

4

4 回答 4

1

如果只是安全方面,您应该在沙箱中编译和运行程序。如果您有权访问虚拟机,请考虑使用虚拟机。扫描安全漏洞的源代码听起来像是一项艰巨的任务(坦率地说,如果学生能够在正确输出代码的同时实现漏洞,那么您应该考虑加分:P)

于 2012-05-12T22:04:19.137 回答
1

如果你愿意使用 Roslyn CTP,你可以看看Compilify。您不需要扩展基础设施,关键部分是创建沙箱。

于 2012-05-13T03:35:32.327 回答
0

您还可以做的一件事是以具有非常有限权限的新 System.Diagnostics.Process 用户身份运行编译。这不会防止无限循环等,但您可能应该在自己的程序中手动检查,因为即使是新手程序员也可能提交意外的无限循环。

http://www.curlybrace.com/words/2009/06/04/run-external-application-as-another-user-in-c/

于 2012-05-13T03:10:02.317 回答
0

编译学生源代码本身不会造成任何安全风险,但是执行学生代码需要一个沙箱,因为代码是不受信任的。AppDomains 可用于此目的,并且可以分配特定的权限(例如 Execution 或 FileIO)。请参阅MSDN 上的这篇文章。您可能想要添加一些工具来在另一个线程上执行目标代码,以便在超时时可以中止它。

如果您担心学生会导致程序崩溃(例如,导致 StackOverflowException 的无限递归调用),那么您将不得不在可以与主应用程序通信的单独主机进程中执行上述所有操作。

更新

实际上,编译可能会带来问题,因为 msbuild 可以通过 proj 文件中的任务执行任意代码。我不认为运行编译器(csc.exe)会造成问题,但您必须自己构建命令行。

于 2012-05-13T03:39:55.443 回答