Организация конкурса по программированию – компиляция и выполнение Howto

Я создаю веб-интерфейс, где люди могут вводить простой C-код для решения алгоритмических вопросов программирования. Я использую редактор Ace, где люди могут вводить код, а когда нажимают кнопку запуска, код C отправляется на сервер, компилируется и выводится обратно.

Как выполнить вторую часть безопасным способом. Я имею в виду заданный файл кода C, скомпилируем его и запустим. Я не могу доверять коду, так как я могу убедиться, что он не вреден и не повредит моей системе. Также как навязывать память и временные рамки.

Есть ли уже существующая система с открытым исходным кодом, которую я могу изменить в соответствии с моими потребностями? Я ничего не нашел в своем поиске. Или некоторые указатели на то, как я должен действовать дальше?

edit: Нашли http://cs.sru.edu/~contest/rocktest/ и попытались понять их код, но все еще искали лучшие варианты, желательно в php

Related of "Организация конкурса по программированию – компиляция и выполнение Howto"

Я рекомендую API-интерфейс Ideaone: http://ideone.com/api

Позвольте мне подключить 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 также предоставляет простой интерфейс для настройки пределов времени выполнения , например, сколько памяти может выделяться для процесса:

 rlimit as <= 100M, # limit address space to 100 megabytes 

AppArmor будет проще всего использовать в дистрибутивах Ubuntu, openSUSE, SLES, PLD, Mandriva, Pardis или Annvix, поскольку инструменты поставляются заранее. Но основная функциональность AppArmor находится в запасах ядер Linux 2.6.36 и новее, и можно установить AppArmor для любого дистрибутива Linux .

Другие аналогичные инструменты включают SElinux , TOMOYO или SMACK . Я думаю, что SMACK будет проще всего развертывать, но любой из них может помешать вредоносному коду вредить вашей системе.

Вам придется выполнить код в изолированной среде . Аналогичный вопрос в отношении SO может помочь.

Вы также можете запустить некоторые виртуальные машины для выполнения кода, но это в основном пример песочницы – немного тяжелый.

Запустите код в песочнице – виртуальную машину.

В дополнение к этому я бы удалял доступ к любым вызовам sytem и разрешал только звонки в стандартные библиотеки C. Кроме того, замените любые небезопасные вызовы библиотеки вашими собственными вызовами, которые проверяют ввод и делегируют безопасные входы для реальных функций (в частности, для malloc вы хотели бы установить верхнюю границу того, сколько каждой программы может выделить).

Если вы сделаете это, для всего кода достаточно всего одной виртуальной машины.

Я буду использовать uevalrun :

«Основным вариантом использования uevalrun является оценка программ решений, представленных участниками конкурсов программирования: uevalrun компилирует решение, запускает его с помощью тестового ввода, сравнивает его результат с ожидаемым выходом и записывает отчет о состоянии».