2010-10-18 11 views
5

Me gustaría implementar un lenguaje de scripting para ayudar a automatizar parcialmente ciertas tareas en una wiki pública. No puedo instalar nada como el Google Caja en el servidor o modificar el software wiki en sí, pero puedo instalar código JavaScript para la ejecución del lado del cliente. Debido a que mi intención es permitir que los usuarios comunes creen y publiquen secuencias de comandos, usar JavaScript en sí mismo es inseguro y podría llevar a compromisos en la cuenta.Lenguaje de scripting simple y seguro implementado en JavaScript?

¿Existe tal implementación de lenguaje de scripting, o si no, es relativamente fácil de crear? Mi atención se centra en la facilidad de procesamiento de texto, las solicitudes de Ajax y la implementación.

Aquí es una tarea ejemplo un guión tendrían que realizar, tomada de Wikipedia's procedure for requesting article deletion:

  1. Preguntar al usuario el nombre de una página wiki y una buena razón para eliminarlo.
  2. Obtenga el código fuente de esa página, agregue un aviso de eliminación en la parte superior y guarde el nuevo texto.
  3. Crea una nueva página (su nombre se basa en el nombre de la primera página) que incluye el motivo de la eliminación.
  4. Obtenga la lista de usuarios que editaron la página y notifiquen a la primera (una vez más, editando una página específica) que la página que creó está a punto de ser eliminada.
+0

Si desea que este idioma sea capaz de realizar peticiones ajax y acceder/modificar el DOM, no obtendrá ninguna seguridad sobre JS (si no puede tocar el DOM aunque _no_será ningún problema) – tobyodavies

+0

La idea no es que se permita ninguna modificación arbitraria de DOM o solicitudes de Ajax, solo aquellas que son relativamente "seguras" y pueden deshacerse fácilmente después de que se muestre al usuario una lista de acciones que de hecho se realizaron. – PleaseStand

+0

No entiendo en absoluto. ¿Qué se supone que es capaz de hacer este "lenguaje de scripting"? – Pointy

Respuesta

3

Aquí hay una implementación de Tcl en javascript: Tcl in Javascript.

Aquí está la fuente: tcl.js.

Y aquí es código de la aplicación de una consola en vivo en su navegador para jugar con: A little tcl.js console

Tcl no puede ser su taza de té, pero la puesta en práctica parece bastante sencilla sencillo. Esto se debe principalmente a que tcl es un lenguaje tan simple. Puede usarlo para obtener ideas sobre cómo implementar variables y funciones.

Sugerencia: en tcl, las estructuras de control son funciones, así que mire dónde están implementadas las funciones incorporadas para ver la implementación de for, while y foreach.

1

Usted podría simplemente sandbox; es decir, alcance en un par de variables clave para que el código del usuario no pueda acceder a objetos inseguros.

var execSandboxedJS = function (jsCode) { 
    var window = document.getElementById('myRootElement'); 
    var document = window; 
    eval(jsCode); 
}; 

Sin embargo, permitir que el código de usuario haga solicitudes ajax es, en sí mismo, inherentemente inseguro. Yo reconsideraría la cordura del proyecto si eso es lo que se requiere.

+4

No es lo suficientemente bueno. Para empezar, se puede romper fácilmente usando 'self' en lugar de window. Al igual que JavaScript, sería extremadamente difícil parchear todos los huecos, ver http://code.google.com/p/google-caja/wiki/AttackVectors. – PleaseStand

2

Se supone que Douglas Crockford's ADsafe es un subconjunto seguro de JavaScript.

Consiste en una biblioteca de tiempo de ejecución (~ 20 KB minified) y un verificador (incluido en JSLint). Si Crockford dejara caer "El software se usará para Good, not Evil" de la licencia, ambos componentes serían programas de código abierto compatibles con GPL.

Como JSLint es un programa de JavaScript, puede verificar las secuencias de comandos del usuario completamente dentro del navegador web. Esto está en contraste con Google Caja, que está escrito en Java.

+0

Adsafe no parece hacer nada acerca de bucles infinitos ni imponer un tiempo de espera, lo que significa que aún es posible que un usuario haga algo como 'for (;;);' y que bloquee la página de otro usuario; o algo así como 'a = []; para (;;) {a = [a, a]} 'para una explosión de memoria. –

Cuestiones relacionadas