La idea inicio porque en ESTE POST se comento sobre un programa en linea (realizado en php, creo) llamado "Juez". La idea de esta pagina, es prinicpalmente una iniciativa (asi lo veo yo), para que puedas desarrollar tus conocimientos y habilidades en programacion, basandose en un programa en linea que te permite compilar, ejecutar y comprobar la funcionalidad de tu programa.
El Juez es una aplicacion que se basa en Retos, un reto seria un enunciado en donde se plantea que hagas X programa que permita capturar cierta informacio y genere un resultado, la idea es realizar el programa en C, subirlo al "Juez", y el mismo Juez realiza el proceso de compilacion, ejecucion y entrada de argumentos/comandos, con la finalidad de que los resultados arrojados por tu programa se comparan con los resultados que se supone debes obtener, si los resultados coinciden, pues superas el reto.
El unico Juez que me llamo la atencion, fue el de olimpiada-informatica.es, ya que te permite usar los retos siempre y cuando este registrado.
Objetivo
Realizar un programa Juez en linea disponible para quien desee pasar los retos, probar sus habilidades o bien intentar hackear al juez
.... Claro, tambien que entre los interesados y participantes oficiales del proyecto, realizen la creacion y anidacion de nuevos retos.Delimitaciones
El proceso de compilacion y ejecucion seria el unico inconveninete, ya que basandose en que el lenguaje PHP nos permite la utilizacion de funciones como exec() y system(), hacer el proceso completo, pero... estas funciones por lo general no estan disponibles en Servidores Gratuitos (hosting), solamente en Servidores Dedicados (de compra)... Bueno, eso es lo que yo creo !!...
CODIGO FUENTE
He codificado buen parte del programa Juez de Programacion (asi lo llame/bautice), mas abajo explico lo que he logrado que haga el codigo PHP y que seria lo que falta.
>> Descargar Juez de Programacion v1.0[Beta] <<
COMO COLABORO
Seria interesante que entre los interesados bajaran el codigo, lo montaran en su servidor casero, lo corrieran y proporcionaran sus aportes de codigo, ya sea en: mejoras, bugs, anidaciones, correcciones, etc... Utilizando ESTE MISMO POST, tomando en cuenta las siguienets delimitaciones cuando vayan a colocar un aporte de codigo:
1- Debes usar la etiqueta CODE para pegar codigo.
2- Todo codigo que aportes debes darlo bien informado y sin errores, vaya, debes probarlo y verificar que corra bien.
3- Proporciona toda la informacion en forma de //comentarios dentro del codigo, para que los coders no se pierdan y entiendan lo que haces.
Aqui les dejo un Ejemplo:
Código
<?php
# Coder: Nick_de_Autor <mail@mail.com>
# Date DIA/MES/año, HORA:MINUTO
# Fuente: ARCHIVO_PHP_QUE_MODIFIQUE.php
# Extras: Funciones que toque.. a(), b(), c(), d(), etc...
# Comentarios sobre la modificacion, aporte, correccion
#
inicio las modificaciones.....
..... y con comentarios y todo
?>
RE-COLABORACIONES
Esto se aplicaria solo y unicamente cuando un codigo que alguien proporciono, aun asi era ineficiente, o se podia mejorar aun mas, entonces en este caso seria una re-modificacion a una colaboracion ya colocada, se pide porfavor respeten los siguienets pasos para tocar una colaboracion ya puesta (re-modificarla).
1- Pulsa en CITAR sobre la modificacion/colaboracion que alguien ya aporto.
2- Debes usar la etiqueta CODE para pegar codigo.
3- Todo codigo que aportes debes darlo bien informado y sin errores, vaya, debes probarlo y verificar que corra bien.
4- Proporciona toda la informacion en forma de //comentarios dentro del codigo, para que los coders no se pierdan y entiendan lo que haces.
5- Muy importante.. Respeten la modificacion que hizo inicialmente el autor, ya que esto sera un proyecto que se retroalimentara constantemente y se debe tener un historial de autores para que no queden excluidos.
Aqui les dejo un Ejemplo:
Código
<?php
# Coder: Nick_de_Autor_Nuevo <mail@mail.com>
# Date DIA/MES/año, HORA:MINUTO
# Fuente: ARCHIVO_PHP_QUE_MODIFIQUE.php
# Extras: Funciones que toque.. a(), b(), c(), d(), etc...
# Comentarios sobre la modificacion, aporte, correccion
#
# Last-Coder: Nick_de_Autor_2 <mail@mail.com>
# Date DIA/MES/año, HORA:MINUTO
# Fuente: ARCHIVO_PHP_QUE_MODIFIQUE.php
# Extras: Funciones que toque.. a(), b(), c(), d(), etc...
# Comentarios sobre la modificacion, aporte, correccion
#
# Last-Coder: Nick_de_Autor_1 <mail@mail.com>
# Date DIA/MES/año, HORA:MINUTO
# Fuente: ARCHIVO_PHP_QUE_MODIFIQUE.php
# Extras: Funciones que toque.. a(), b(), c(), d(), etc...
# Comentarios sobre la modificacion, aporte, correccion
#
inicio las modificaciones.....
..... y con comentarios y todo
?>
QUEJAS Y SUGERENCIAS
Envien un Mensaje Privado o bien solo den una Respuesta a este hilo SIN CITAR.
NIVEL DE PARTICIPANTES
Pues solamente que deseen ayudar y brinden aportes, ya que no es un proyecto para ensenar a programar, sino a retroalimentar el codigo que he propuesto.
AVANCES DE JUEZ-1.0beta
Jues de Programacion tiene los siguentes avances:
- Se proporciona archivo base.mysql para que se instale en su servidor casero.
- el Menu Admin es facil y rapido de gestionar (aun muy ostero), basicamente poner tu username, tu password, nombre del reto, nivel de dificultad y contenido del reto.
- El Menu Retos muestra en forma de lista los retos agregados por el Admin, si se pulsa encima de algn reto se despliega contenido nuevo.
- Al acceder a un reto puedes ver el contenido del reto e intentar darle una solucion, vaya, subir el archivo.
Esto es lo que aun no hace el programa:
- Aun no se agrega el codigo para compilar, solamente se puede subir un archivo, se revisa que sea formato *.c y quedo pendiente el procesod e compilacion, de echo aparece el mensaje de: "Compilando..." (para que se ubiquen en el code).
- El Mini-foro tampoco ha quedado, la idea es que sea un foro simple y sencillo que sirva de ayuda, comentarios y aportaciones.
- Bugs, pues aun no se encuentra ninguno, pues el code esta fresco
- El formulario que se muestra n la parte de admin, no tiene implementado el chequeo de seguridad en los INPUT de nombre dle reto, Contenido del Reto, vaya, si se enian vacios se guarda la consulta.
COMO - Juez
Instalacion.
Descarga el paquete de Juez, descomprimelo y copia los archivos a tu carpeta del Servidor Web, despues edita el archivo funciones.php y en la funcion conectar() debes sustituir los valores de TU_USERNAME y TU_PASSWORD por el username y password que tienes en tu Base de Datos de MySQL (oviamente debes tener instalado mysql).
En seguida puedes utilizar el archivo base.mysql para poder crear la Base de Datos con las Tablas de una forma rapida
.Ya Por ultimo abre el archivo index.php y ves hasta la linea 59, en esa linea veras:
Código
if( proteger_cadena($_POST["user"])=="TU_USERNAME" && proteger_cadena($_POST["pass"])=="TU_PASSWORD" )
Editala y sustituye los valores de TU_USERNAME y TU_PASSWORD, por el username y password que quieras usar para administrar los retos.
Agregando Retos.
Una ves instalado el Juez, accede a tu web (localhost) donde pusiste Juez, y veras al menu de Admin, se desplegara un formulario donde escribiras el Username y Password de Administracion, despues el Nombre de tu Reto y el Contenido.
Código
# formulario para agregar un nuevo reto
echo '<p><form action="index.php?id='. proteger_cadena($_GET["id"]). '" method="POST"><table>
<td>User: </td><td><input type="text" name="user"></td><tr>
<td>Clave: </td><td><input type="password" name="pass"></td><tr>
<td>Nombre Reto: </td><td><input type="text" name="reto_name"></td><tr>
<td>Dificultad: </td><td><select name="level">
<option value="1">Facil</option>
<option value="2">Intermedio</option>
<option value="3">Dificil</option>
<option value="4">Dios</option>
</select></td>
<td colspan="2">Contenido Reto:</td><tr>
<td colspan="2"><textarea name="reto_contenido" style="width:300px;height:200px;"></textarea></td><tr>
<td colspan="2"><input type="submit" value="Enviar" name="boton"></td>
</table></form>';
MUY IMPORTANTE dentro del TextArea de Contenido del Reto (en el formulario), se supone que debes escribir de lo que consta el reto y despues cuando vayas a indicar las entradas que hara el Juez como metodo de comprobacion de tu programa y mostrar las salida "exitosa" que se supone debes obtener, debes usar dos tags BBCode que he creado, que son:
Código
# Ejemplo de Redaccion de Contenido del Reto
En este reto deberas cumplir lo siguiente:
[input]2x1[/input]
[output]2[/output]
Las Etiquetas BBCode de INPUT y OUTPUT seran interpretadasa al momento de que un usuario vaya a la listade retos y acceda al reto, los que has escrito dentro de las etiquetas se mostrara en un TextArea (para cada etiqueta), y con el texto por encima de: Entrada: o Salida: (segun sea la etiqueta).
Como Compila Juez?
Como bien se explico, los retos son solo enunciados textuales que en primera parte describen el reto/problema/enunciado y llevan etqieutas INPUT y OUTPUT, por cada etiqueta INPUT debe haber un OUTPUT, ya que una etiqueta INPUT indica que lo que este escrito dentro, es lo que introducira el Juez al correr tu codigo fuente compilado (programa), y el Juez esperar como resultado, que tu programa envie lo que esta dentro de la etiqueta OUTPUT.
Es por eso que la creacion de retos no tiene ninguna dificultad, ni tampoco se requiere que la persona que cree/realize/plantee un reto interesante, tenga que poner el codigo que resuelva el reto... El Reto lo resuelve el interesado que accede al reto, solo que si se les pide que el reto tenga logica y que exista una solucion.
La compilacion y ejecucion de programas en PHP se logra mediante las funciones system() y/o exec(), y el Juez utiliza las etiquetas INPUT para introducirlas al programa, espernado como resultado el contenido de la etiqueta OUTPUT.
Seguridad en Codigos Fuente
En primer instancia unicamanete se me ocurre que para evitar que un usuario ejecute codigo malicioso, haga llamadas a funciones de sockets, etc, etc.. que comprometan el Servidor donde corre el Juez, es que simplemente antes de que el Juez compile y corra el programa, se realize una llamda de apertura de archivo fopen(), en donde se eliminen las headers que puedan comprometer el Servidor, por ejemplo estas headers:
Código:
## Header de Linux
sys/socket.h
fcntl.h
sys/stat.h
netinet/in.h
## Headers de Windows
winsock.h
sys/socket.h
fcntl.h
sys/stat.h
netinet/in.h
## Headers de Windows
winsock.h
Seria la unicamanera de moemento, que se le considere rapido....
La otra forma seria correr un programa alterno dentro dle Servidor en donde este programa limitara la ejecucion de comandos/funciones, pero seria un poco mas engorrozo, tardado y suceptible a mas bugs.










Autor




En línea





. Ahora claro, para usar exec() necesitas un servidor dedicado o un servidor propio. A ver si por la tarde tengo tiempo y puedo hacer algo en C que filtre y compile código y luego que le pase la salida del programa al php. Pero nada de gcc! Visual Studio bajo Win32 mejor no? Así permitimos usar código nativo, no sólo de la stdlib de C, lo que hace más interesante el intento de explotar algún bug.
. Por ejemplo, si quieres poner ejercicios solo de el programa tiene que recibir X entrada y sair con Y valor, pues si, da igual, pero se pueden poner ejercicios más imaginativos, como leer X clave del registro de Windows, crear X archivo en tal sitio, no se, mas cosas que lo típico de cin y cout. Para controlar eso, se puede programar algo parecido a lo que tienen los antivirus, un emulador, que sería llamado por el código en php, y que se encargaría de comprobar si el código funciona correctamente, si se llama correctamente a las apis, vamos, que se podría analizar más que la salida del programa, y ofrecería tambien relativa seguridad, ya que se podría prohibir acceder a ciertas apis etc.
.
.



