Necesito presentar scripts enviados por el usuario en mi sitio (algo así como jsfiddle). Quiero que los scripts se ejecuten en los navegadores visitantes de forma segura, aislados de la página en la que se publican. Dado que el código es enviado por los usuarios, no hay garantía de que sea confiable.¿Cómo puedo resguardar el contenido JavaScript no confiable del usuario?
En este momento me ocurren tres opciones:
- servir al contenido enviado por el usuario en un iframe de un dominio diferente, y se basan en la política del mismo origen. Esto requeriría configurar un dominio adicional que me gustaría evitar si es posible. Creo que así es como lo hace jsfiddle. La secuencia de comandos todavía puede hacer algún daño, cambiando
top.location.href
, por ejemplo, que es menos que ideal. http://jsfiddle.net/PzkUw/ - Utilice sandbox attribute. Sospecho que esto no está bien soportado en todos los navegadores.
- Sanitice las secuencias de comandos antes de atenderlas. Preferiría no ir allí.
¿Hay alguna otra solución o recomendación sobre lo anterior?
actualización
Si, como sospecho, la primera opción es la mejor solución, qué puede hacer un script malicioso que no sea cambiar la ubicación de la ventana superior, y cómo puedo evitar esto? Puedo manipular o rechazar ciertos guiones basados en el análisis de código estático, pero esto es hard dada la cantidad de formas en que se puede acceder a los objetos y la dificultad para analizar javascript de forma estática en general. Por lo menos, requeriría un analizador completo y una serie de reglas complejas (algunas, pero sospecho que no todas, de las cuales están presentes en JSLint).
Creo que su idea de subdominio es la mejor. He investigado esta cuestión y no he podido encontrar una mejor solución. Una vez jugué con la carga de los scripts dinámicamente a través de XmlHttpRequest y ejecución de eval - No recuerdo por qué lo dejé caer. –
Relacionados: http://stackoverflow.com/questions/958997/frame-buster-buster-buster-code-needed – Petah
Estoy de acuerdo con @JeremyJStarcher. De todos modos, ¿tienes la oportunidad de controlar ciertos elementos JS, ** ventana ** es el más importante? De ser así, intentaría rechazar ciertas solicitudes hechas desde el iframe, pero no estoy seguro de lo fácil que sería. – inhan