2010-11-15 6 views
7

Estoy inmerso en el desarrollo web después de diez años de desarrollo de escritorio y estoy experimentando con algunos conceptos de prueba. Me preguntaba si es posible guardar en la arena y ejecutar el código C++ que se ingresó en un campo de texto en un navegador. Con eso, me refiero a ejecutar el código C++ o C# en el servidor web back-end y devolver un análisis del código. Para que quede claro, no me refiero a ejecutar código C++ o C# que esté destinado a generar ningún tipo de marcado, sino simplemente a la prueba de blackbox del bloque de código C++ o C# que se ingresó.¿Es posible guardar en la arena y ejecutar el código C++ o C# que se ingresó en un campo de texto en un navegador?

  1. ¿Cómo invocaría el compilador, dependiendo del servidor web que esté utilizando?
  2. ¿Cómo podría proteger el código para evitar el comportamiento malicioso? Si consideramos solo una de las variantes C, ¿qué pasa con las listas negras/listas blancas de funciones y bibliotecas específicas para evitar el comportamiento malicioso? ¿O esa lista negra sería demasiado larga y demasiado restrictiva para permitir que se ejecute una buena cantidad de código?

Estas son algunas preguntas de alto nivel que estoy preguntando solo porque estoy teniendo dificultades para encontrar una dirección, pero voy a seguir investigando en este momento. Muchas gracias de antemano por su ayuda!

+0

su sería una manera de hacer esto ... pero estoy más atascado en por qué querrías hacer esto ... – thecoshman

+0

@thecoshman, por razones similares a por qué existe el sitio web del teclado (ver respuestas a continuación), solo para compartir el código y sus resultados de tiempo de ejecución. – BeachRunnerFred

Respuesta

2

El Dinkumware site tiene algo como esto.

Un simple Perl (o Python, ...) cgi podría utilizarse para invocar el compilador, analizar los resultados, ejecutar el ejecutable resultante y mostrar sus resultados.

me gustaría echar un vistazo a SELinux (tal vez AppArmor?) Para los controles de acceso. Tal vez no le permite escribir y leer desde/hasta el disco y limitar su tiempo de ejecución. No sé si lo posterior también se puede hacer con SELinux.

2

# 1 es fácil con C#. Las capacidades de Reflejo de .NET le permiten compile and run code "on the fly." Y aquí hay un enlace al another good looking tutorial.

# 2 es un poco más difícil, pero supongo que una técnica básica de boxeo de arena podría implicar la ejecución de un proceso dinámico en virtud de una licencia limitada, y por lo tanto cuenta en caja de arena. Mediante programación, podría analizar las dependencias del ensamblado construido dinámicamente y no permitir que se ejecutara si utilizara API en ciertos espacios de nombres como System.IO. Esto no es trivial, por decir lo menos, sin embargo.

C++ no tiene capacidades de reflexión y bibliotecas 3 ª parte por lo que sería su mejor apuesta.

+0

¡Gracias, Paul, parece una gran capacidad para explorar! – BeachRunnerFred

1

Si el servidor se ejecuta en Linux, es posible considerar el uso de chroot

+0

Necesita acceso de raíz para eso, y chroot simplemente cambia su raíz. (De ahí el nombre), NO es un arenero, y nunca fue diseñado para ese propósito. – Arafangion

1

En realidad no sólo que con nuestro producto llamado iKnode. Estamos utilizando esta idea para crear un Backend en la nube.

Nos hicieron esto mediante la creación de una caja de arena que toma una parte específica de código y lo ejecuta, captura el resultado y la devuelve al usuario. Todo esto se hace en la nube.

¿Cómo invocaría el compilador, dependiendo del servidor web en el que está usando?

Lo hicimos utilizando las utilidades CodeDom del .Net framework.Y estamos explorando el próximo proyecto de 'compilador como servicio' que proviene de Microsoft con el nombre en código Roslyn.

Este es un buen punto de partida para usar CodeDom para compilar programáticamente.

¿Cómo podría proteger el código para evitar el comportamiento malicioso? Si estamos en considerando solo una de las variantes C, ¿qué pasa con listas negras/listas blancas de funciones y bibliotecas específicas para evitar el comportamiento malicioso de ? ¿O esa lista negra sería demasiado larga y demasiado como límite para permitir que se ejecute una buena cantidad de código?

Lo hicimos envolviendo la ejecución del código en un AppDomain separado y limitado. Puede ver algunos ejemplos here.

Además, es posible que desee buscar en el MonoSandBox, que fue creado para Moonlight, pero es un SandBox más robusto. Estamos experimentando con esto en este momento, para alejarnos de AppDomains. Creemos que MonoSandBox es mucho mejor que simples AppDomains.

Cuestiones relacionadas