Организация соревнования по программированию - как скомпилировать и выполнить - PullRequest
5 голосов
/ 21 марта 2011

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 21 марта 2011

Позвольте мне подключить 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 на общедоступных серверах ведущего интернет-магазина в течение дня, с аналогичными результатами в других развертываниях. ) * +1010 *

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 будет самым простым в развертывании, но любой из них может помешать вредоносному коду нанести вред вашей системе.

1 голос
/ 21 марта 2011

Я рекомендую API Ideaone: http://ideone.com/api

1 голос
/ 21 марта 2011

Вам нужно будет выполнить код в изолированной среде . Существует аналогичный вопрос о SO, который может помочь.

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

0 голосов
/ 02 апреля 2011

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

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

0 голосов
/ 21 марта 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...