2015-10-13 18 views
5

Sto lavorando su react-metaform e una delle mie sfide è che ho bisogno di consentire all'utente finale di definire i metadati come funzioni. Esempio:Come posso verificare se una funzione è una funzione pura?

socialSecurityNumber.required: (m) => m.type == 'person' 

Il problema è ovvio: non posso fidarmi dell'utente. Quindi, queste sono le precauzioni che sto pensando di fare:

  • Le funzioni definite dall'utente dovrebbe essere pura funzione. Nel senso che, queste funzioni possono accedere solo ai loro parametri, nient'altro.
  • Le funzioni definite dall'utente verranno eseguite in un ambiente che resiste alle eccezioni, a tempi di esecuzione troppo lunghi e a cicli infiniti. (Non sono preoccupato per questo adesso).

La domanda è: Come faccio certo una funzione definita dall'utente accede solo i suoi parametri e nient'altro?

+3

Vorrei assumere la soluzione migliore è quella di definire il proprio linguaggio delle espressioni che viene analizzato e quindi valutato sui tuoi oggetti reali, piuttosto che usare 'new Function'. – Bergi

+2

http://stackoverflow.com/questions/14889393/how-to-run-a-javascript-function-in-a-sandbox-environment – epascarello

+2

Penso che dal momento in cui chiedi all'utente di scrivere JS ed eseguirlo sono praticamente fatti per Non è possibile impedire lunghi tempi di esecuzione (esecuzione a completamento, sì!) O assicurarsi che la funzione sia pura (magari con ombreggiamento massiccio dei parametri, ma sarebbe strano). –

risposta

1

Vorrei utilizzare esprima per analizzare le funzioni JavaScript degli utenti archiviate in file o in un database. E vorrei consentire di eseguire solo il codice che supera il test di analisi (solo le funzioni di whitelist - utilizzando variabili locali, parametri, ...).

È possibile iniziare con un codice di controllo molto semplice che consente solo script molto limitati e progressivamente migliorarlo. Tuttavia, suppongo che col tempo dedichi molta attenzione alla soluzione perché i tuoi utenti vorranno sempre di più.


Nota: Angular.js utilizza per la sua iniezione di dipendenza questo tipo di 'trucco': https://jsfiddle.net/987Lwezy/

function test() { 
    console.log("This is my secret!"); 
} 


function parser(f) { 
    document.body.innerHTML = test.toString(); 
} 

parser(test); 
+0

Hm, come impedirebbe qualcosa come 'function() {[] .__ proto __. Slice = function() {return" Ho avvitato la tua app! "; }; } '(che non usa variabili libere)? – Bergi

+0

OP ha detto che vuole consentire solo l'accesso ai parametri dell'utente. L'assegnazione a '[] .__ proto __. Slice' non è un'assegnazione al parametro utente. –

+0

In sostanza, devi creare un sottoinsieme di JavaScript che autorizzi o scegli un'altra soluzione. È assolutamente fondamentale utilizzare una "soluzione white list" e non una "soluzione blacklist". Voglio dire, non puoi vietare l'eval e sperare per il meglio. È possibile abilitare solo aritmetica di base con parametri di funzione ... per quel che ne so potrebbe bastare in alcuni scenari. –

Problemi correlati