2012-05-12 9 views
2

В настоящее время я пишу инструмент автоматического проверки исходного кода. В основном студенты должны загружать свои файлы исходного кода на C# в качестве решения для различных задач. Сервер компилирует эти файлы в рамках и проверяет программу на разные входные файлы. Если результат, который генерирует программа, является допустимым (равным предопределенному выходу), то программа действительна, и ученик получает очки для программы.Автоматическая компиляция и запуск стороннего кода

Но я не думаю, что могу доверять студентам;) Может попытаться получить доступ к файлам или выполнить другие плохие вещи на сервере.

Что я могу сделать, чтобы ограничить доступ к минимуму?
Что мне нужно учитывать?

Allready думал:

  • доступа к файлу
  • макс. Время выполнения
  • начиная другие ПРОГРАММЫ
  • делает сетевой подсистемы
  • отражение

В настоящее время единственным способом проверки кода я мог себе представить, должен был искать его для ключевого слова, как «Файл», «Net», «Процесс», ... с использованием регулярных выражений.

Но я уверен, что это ОЧЕНЬ небезопасно.
Любые предложения?

+2

Просто, чтобы дважды проверить, вы планируете дать ученику, который разбивает вашу песочницу на A +? Очень озадачивающе, что вы не станете им назначать. Anyhoo, я с удовольствием возьму их резюме. –

+0

Ну, большинство из них новички, но когда они поправляются ... Если студент способен сломать песочницу и оставить текстовый файл с информацией, которую он разбивает на сервере, все в порядке, и он получает A +, но я не знаю, t хотят, чтобы они разбивали сервер. – raisyn

ответ

1

Если это всего лишь аспект безопасности, вы должны скомпилировать и запустить программы в песочнице. Рассмотрите виртуализированную машину, если у вас есть доступ к ней. Сканирование исходного кода для эксплойтов безопасности звучит как задача (и, откровенно говоря, если учащийся может добиться эксплойта при правильном выводе кода, то вы должны рассмотреть бонусные баллы: P)

+0

Это было бы решением, но с большими накладными расходами, а также сложно получить файлы в и из виртуальной машины и перезапустить, если что-то пойдет не так. – raisyn

0

Одна вещь, которую вы могли бы также do - запустить компиляцию как новый пользователь System.Diagnostics.Process с очень ограниченными разрешениями. Это не будет защищать от бесконечных циклов и т. Д., Но вы, вероятно, должны проверять это вручную, а также в своей собственной программе, потому что даже начинающий программист может представить случайный бесконечный цикл.

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

1

Если вы готовы использовать Roslyn CTP, вы можете посмотреть на Compilify. Вам не нужна масштабирующая инфраструктура, ключевая часть - создание песочницы.

0

Компиляция источника для студентов не должна представлять никаких рисков для безопасности сама по себе, однако для выполнения кода учащихся требуется песочница, поскольку код не доверен. AppDomains можно использовать для этой цели и могут быть назначены определенные разрешения (например, Execution или FileIO). См. this article на MSDN. Возможно, вам захочется добавить какое-либо средство для выполнения целевого кода в другом потоке, чтобы вы могли его прервать, если он истечет.

Если вы беспокоитесь о том, что студенты сбой программы (например, бесконечно рекурсивный вызов, который вызывает исключение StackOverflowException), вам придется все это сделать в отдельном хост-процессе, который может связываться с вашим основным приложением.

Update

На самом деле, компиляция может представлять проблему, как MSBuild может выполнить произвольный код с помощью задач в файле PROJ. Я не думаю, что запуск компилятора (csc.exe) может создать проблему, но вам придется самостоятельно строить командную строку.