2010-10-18 21 views
5

Vorrei implementare un linguaggio di scripting per assistere parzialmente nell'automazione di determinate attività su un wiki pubblico. Non riesco ad installare nulla come Google Caja sul server o modificare il software wiki stesso, ma posso installare codice JavaScript per l'esecuzione lato client. Poiché il mio intento è di consentire agli utenti ordinari di creare e pubblicare script, l'utilizzo di JavaScript non è sicuro e potrebbe portare a compromessi sull'account.Linguaggio di scripting semplice e sicuro implementato in JavaScript?

Esiste un'implementazione del linguaggio di scripting o, in caso contrario, è relativamente facile da creare? Il mio obiettivo è la semplicità dell'elaborazione del testo, le richieste Ajax e l'implementazione.

Ecco un compito esempio uno script avrebbe bisogno di eseguire, tratto da Wikipedia's procedure for requesting article deletion:

  1. chiedere all'utente per il nome di una pagina wiki e un buon motivo per eliminarlo.
  2. Ottieni il codice sorgente di quella pagina, aggiungi una notifica di eliminazione in alto e salva il nuovo testo.
  3. Creare una nuova pagina (il suo nome in base al nome della prima pagina) che include il motivo dell'eliminazione.
  4. Ottenere l'elenco degli utenti che hanno modificato la pagina e notificare il primo (ancora, modificando una pagina specifica) che la pagina da lui creata sta per essere eliminata.
+0

Se si desidera che questo linguaggio sia in grado di effettuare richieste Ajax e di accedere/modificare il DOM, non si ottiene alcuna sicurezza solo su JS (se non può toccare il DOM che non può essere il problema) – tobyodavies

+0

l'idea non è per qualsiasi modifica DOM arbitraria o richiesta Ajax, solo quelli che sono relativamente "sicuri" e possono essere facilmente annullati dopo che all'utente viene mostrato un elenco di azioni che sono state effettivamente eseguite. – PleaseStand

+0

Non capisco affatto. Che cosa dovrebbe essere in grado di fare questo "linguaggio di scripting"? – Pointy

risposta

3

Ecco un'implementazione di Tcl in javascript: Tcl in Javascript.

Ecco la fonte: tcl.js.

Ed ecco codice che implementa una console dal vivo nel tuo browser per giocare con: A little tcl.js console

Tcl non può essere la vostra tazza di tè, ma la realizzazione sembra abbastanza semplice semplice. Questo è principalmente dovuto al fatto che tcl stesso è un linguaggio così semplice. Puoi usarlo per avere idee su come implementare variabili e funzioni.

Suggerimento: in tcl, le strutture di controllo sono funzioni in modo da osservare dove sono implementate le funzioni integrate per vedere l'implementazione di for, while e foreach.

1

Si potrebbe semplicemente sandbox; vale a dire, ambito in un paio di variabili chiave in modo che il codice dell'utente non è in grado di accedere agli oggetti non sicuri.

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

Anche se, permettendo codice utente per effettuare richieste Ajax è, di per sé, intrinsecamente pericolosi. Vorrei riconsiderare la sanità mentale del progetto se è quello che è richiesto.

+4

Non abbastanza buono. Per i principianti, questo può essere facilmente evitato usando 'self' invece di window. Il modo in cui JavaScript è, sarebbe estremamente difficile correggere tutti i buchi - vedi http://code.google.com/p/google-caa/wiki/AttackVectors. – PleaseStand

2

Si suppone che Douglas Crockford ADsafe sia un sottoinsieme sicuro di JavaScript.

Consiste in una libreria di runtime (~ 20 KB minificata) e un verificatore (incluso in JSLint). Se Crockford dovesse abbandonare "The Software shall be used for Good, not Evil" dalla licenza, entrambi i componenti sarebbero programmi open source compatibili GPL.

Poiché JSLint è un programma JavaScript, è in grado di verificare gli script utente interamente all'interno del browser web. Questo è in contrasto con Google Caja, che è scritto in Java.

+0

Adsafe sembra non fare nulla su loop infiniti o imporre un timeout, il che significa che è ancora possibile per un utente fare qualcosa come "for (;;);" e bloccare la pagina di un altro utente; o qualcosa come 'a = []; per (;;) {a = [a, a]} 'per un'esplosione di memoria. –

Problemi correlati