2011-03-21 13 views
5

Estoy construyendo una interfaz basada en web donde las personas pueden escribir en código C simple para resolver preguntas de programación algorítmica. Estoy usando el editor Ace donde las personas pueden escribir el código y cuando presionas el botón ejecutar, el código C se envía al servidor, se compila y se devuelve la salida.Organizing Programming Contest - Cómo compilar y ejecutar

Cómo lograr la segunda parte de una manera segura. Me refiero a dado un archivo de código C, compilarlo y ejecutarlo. No puedo confiar en el código, así que ¿cómo puedo asegurarme de que no sea malicioso y no dañe mi sistema? También cómo imponer la memoria y los límites de tiempo.

¿Existe algún sistema de código abierto ya existente que pueda modificar para adaptarlo a mis necesidades? No encontré nada en mi búsqueda. ¿O algunos consejos sobre cómo debo proceder ahora?

edición: Encontrado http://cs.sru.edu/~contest/rocktest/ y tratando de entender su código, pero todavía en busca de mejores opciones, preferentemente en php

+0

posible duplicado de [Programa Grading - Compilar/ejecución de código C++ dentro de C++] (http://stackoverflow.com/questions/5131085/grading-program-compile-executing-c-code-within-c) –

+1

¿Es http://ideone.com/ demasiado simplista? – Johnsyweb

+1

Consulte la [sobre la página] (http://codepad.org/about) para [codepad.org] (http://codepad.org/). A saber: "La estrategia es ejecutar todo bajo ptrace, con muchas llamadas al sistema no permitidas o ignoradas. Los compiladores y los ejecutables finales se ejecutan en una cárcel chroot, con límites de recursos estrictos". –

Respuesta

1

recomiendo la API Ideaone: http://ideone.com/api

+0

Solo para añadir a la respuesta basada en mi investigación hasta ahora: Ideone proporciona una API gratuita donde puedes enviar código en muchos idiomas, incluida C, y devuelven la salida o el error. También dan memoria y tiempo utilizado. – itsfrosty

1

Vas a tener que ejecutar el código en un sandboxed environment. Hay un similar question en SO que podría ayudar.

También podría ejecutar algunas máquinas virtuales para ejecutar el código, pero eso es básicamente un ejemplo de sandboxing, solo un poco pesado.

+0

Coudl entrar en detalles sobre cómo crear un sandbox fuera de los procedimientos normales de chroot/sysjail (que no son una solución completa) – Earlz

0

Ejecute el código en una caja de arena, una máquina virtual.

Además de eso, eliminaría el acceso a cualquier llamada de sistema y solo permitiría las llamadas a las bibliotecas estándar de C. Además, reemplace todas las llamadas de la biblioteca inseguras con sus propias llamadas que verifican la entrada y delegan entradas seguras a las funciones reales (en particular para malloc, usted querría poner un límite superior sobre cuánto puede asignar cada programa).

Si hace lo anterior, solo una máquina virtual debería ser suficiente para el código de todos.

+0

Así que básicamente use algo como openvz o linux en modo usuario para confinar al usuario a su propio entorno . Para la segunda parte que está reemplazando llamadas de la biblioteca inseguras con la mía parece - ¿Alguna idea de las soluciones existentes? – itsfrosty

+0

@itsfrosty: ¿Las soluciones existentes para el conjunto "reemplazan los encabezados C por los suyos"? No, pero es fácilmente factible si usa una biblioteca de análisis C (que puede encontrar en el SDK de eclipse). – CromTheDestroyer

2

Permítanme conectar el AppArmor, un mecanismo de control de acceso obligatorio simple que puede hacer que la creación de este tipo de entornos sea simple. Aquí es un perfil que tengo en lugar de limitar mi xpdf visor de 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, 
} 

que usted podría aprender los conceptos básicos de confinar las aplicaciones de su elección en la mitad de un día más o menos, y tienen perfiles escritos para su servidor en otro medio día. (Ese perfil de xpdf me tomó aproximadamente cuatro minutos para escribir, pero sé lo que estoy haciendo. Hemos desplegado AppArmor en los servidores públicos más importantes de un minorista en línea durante una tarde, con resultados similares con otras implementaciones).

AppArmor también da an easy interface for configuring run-time limits, tales como la cantidad de memoria se permite un proceso para asignar:

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

AppArmor sería más fácil de utilizar en distribuciones Ubuntu, openSUSE, SLES, PLD, Mandriva, PARDIS o Annvix, como las herramientas vienen preinstaladas. Pero la funcionalidad básica de AppArmor está disponible en los kernels de Linux 2.6.36 y posteriores, y it is possible to install AppArmor on any Linux distribution.

Otras herramientas similares incluyen SElinux, TOMOYO, o SMACK. Creo que SMACK sería el siguiente más fácil de implementar, pero cualquiera de ellos podría evitar que el código malicioso dañe su sistema.

+0

+1 para AppArmor y la solución más robusta hasta el momento –

0

Me va a utilizar uevalrun:

"El caso de uso principal para uevalrun es la evaluación de los programas de solución presentadas por los concursantes de concursos de programación: uevalrun compila la solución , lo ejecuta con la entrada de prueba, compara su salida con la salida esperada y escribe un informe de estado ".

Cuestiones relacionadas