Estoy trabajando en una aplicación web para enseñar conceptos de programación. Las páginas web tienen algo de texto sobre un concepto de programación, luego permiten que el usuario ingrese el código de JavaScript en una ventana del editor de texto para intentar responder un problema de programación. Cuando el usuario hace clic en "enviar", analizo el texto que han tipeado para ver si han resuelto el problema. Por ejemplo, les pido que "escriban una función llamada f
que agrega tres a su argumento".¿Cómo puedo "evaluar" de forma segura el código de usuario en una página web?
Aquí es lo que estoy haciendo para analizar el texto del usuario:
- Run JSLint en el texto con los ajustes estrictos, en particular, sin asumir funciones del navegador o de la consola.
- Si hay algún error, muestre los errores y deténgase.
eval(usertext);
- Pasa por las condiciones para pasar la tarea,
eval(condition)
. Una condición de ejemplo es"f(1)===4"
. Las condiciones provienen de fuentes confiables. - Mostrar condiciones de aprobación/falla.
Mis preguntas: ¿esto es lo suficientemente bueno para evitar problemas de seguridad? ¿Qué más puedo hacer para ser paranoico? ¿Hay una mejor manera de hacer lo que quiero?
En caso de que sea relevante, mi aplicación está en Google App Engine con el back-end de Python, usa JQuery, tiene cuentas de usuario individuales.
Me pregunto si jsfiddle tiene alguna fuente/notas disponibles ... Estoy seguro de que en algún momento todo se reduce a que el sitio no sea vulnerable a XSS o similar.(XSS * permitiría que otra persona * proporcione un enlace al código evaluado en dicha página que luego puede "ejecutarse como" el usuario que realmente vio el enlace.) –
Tengo que decir cuando uso JSLint para escanear mi JS para Problemas antes de comprimir Intento y deshabilito todas las características que puedo que simplemente representan las preferencias del autor y no un problema de código, luego ignoro el 90% de lo que dice y busco los puntos y comas que faltan. Si yo fuera tú, pensaría en cuánto disfrutarán los usuarios al leer los "errores" que encuentra JSLint. – tomfumb
Ese es un buen punto, agregaré una opción para desactivar las comprobaciones "estilísticas". Pero quiero que el valor predeterminado sea estricto, parte del objetivo del proyecto es enseñar programación limpia de JavaScript. –