我目前正在编写一个自动源代码验证工具。基本上学生必须上传他们的C#源代码文件作为不同任务的解决方案。服务器在框架内编译这些文件,并根据不同的输入文件检查程序。如果程序生成的输出有效(等于预定义的输出),则程序有效,学生获得该程序的分数。
但我认为我不能相信学生;)可能会尝试获取文件访问权限或在服务器上执行其他不良内容。
如何将访问权限限制在最低限度? 我需要考虑什么?
已经考虑过:
目前检查我能想象的代码的唯一方法是使用正则表达式搜索“File”,“Net”,“Process”等关键字。
但我很确定这是非常不安全的 有什么建议吗?
答案 0 :(得分:1)
如果只是安全方面,您应该在沙箱中编译和运行程序。如果您有权访问虚拟机,请考虑使用虚拟机。扫描安全漏洞的源代码听起来就像是完成任务(坦率地说,如果学生能够在获得正确输出代码的同时实现漏洞,那么你应该考虑奖励积分:P)
答案 1 :(得分:1)
如果您愿意使用Roslyn CTP,可以查看Compilify。您不需要扩展基础架构,关键部分是创建沙箱。
答案 2 :(得分:0)
您还可以做的一件事是将编译作为具有非常有限权限的新System.Diagnostics.Process用户运行。这不会防止无限循环等,但您可能应该在自己的程序中手动检查,因为即使是新手程序员也可能提交意外的无限循环。
http://www.curlybrace.com/words/2009/06/04/run-external-application-as-another-user-in-c/
答案 3 :(得分:0)
学生来源的汇编本身不应构成任何安全风险,但执行学生代码需要沙箱,因为代码不受信任。 AppDomains可用于此目的,并可为其分配特定权限(例如Execution或FileIO)。请参阅MSDN上的this article。您可能希望添加一些工具来在另一个线程上执行目标代码,以便在超时时可以中止它。
如果您担心学生会崩溃程序(例如导致StackOverflowException的无限递归调用),那么您必须在可以与主应用程序通信的单独主机进程中执行上述所有操作。
更新
实际上,编译可能会造成问题,因为msbuild可以通过proj文件中的任务执行任意代码。我不认为运行编译器(csc.exe)会造成问题,但你必须自己构建命令行。