Ho svolto le mie ricerche e ci sono alcuni modi efficaci per JS di sandbox, ovvero:
- Utilizzare un JS VM che esegue il JS utilizzando un modulo sandbox di js, come VM.js
- Utilizza un transpiler come Google Caja, che aggiunge ulteriori controlli per conservare determinati invarianti e non consente specifici codepath
- Utilizza un dominio incrociato (e / o
sandbox
ed)iframe
, potenzialmente anche con un WebWorker, ad es. imprigionato
Sfortunatamente, nessuno di questi funziona bene fuori dagli schemi per la mia applicazione. Sto cercando di creare un'alternativa jsperf.com (cioè un sistema di benchmarking JS basato sul web), quindi i primi due sono fuori, poiché influenzerebbero le prestazioni del codice fornito dall'utente, che invalida completamente qualsiasi risultato di benchmarking.
Il jailed è più vicino, ma non è una grande alternativa perché A) il suo approccio solo whitelist è così restrittivo che il mio sito non sarebbe in grado di testare le prestazioni di molte funzionalità del web (operazioni DOM, IndexedDb, WebWorkers , LocalStorage, ecc.) Senza un sacco di whitelist che non sono nemmeno sicuro funzionerebbe e B) Non sono sicuro di quanto sia ben mantenuto (e quindi sicuro) viene data la poca attività sul suo repository GitHub.
Qual è il sistema più permissivo (in termini di vicinanza alla pubblicazione in modalità non controllata) che posso tranquillamente utilizzare per eseguire il JS fornito dall'utente per il benchmarking? È sufficiente una percentuale di sandbox% co_de sufficiente affinché i benchmark possano almeno accedere a alcuni DOM e ad altre API Web? Il WebWorker è davvero necessario? Cosa fanno jsfiddle e simili?