Ho bisogno di servire script inviati dall'utente sul mio sito (un po 'come jsfiddle). Voglio che gli script vengano eseguiti sui browser dei visitatori in modo sicuro, isolati dalla pagina in cui sono pubblicati. Poiché il codice viene inviato dagli utenti, non vi è alcuna garanzia che sia affidabile.Come posso sandbox il contenuto JavaScript inviato dall'utente non affidabile?
In questo momento mi viene in mente tre opzioni:
- Servire il contenuti inviati dagli utenti in un iframe da un dominio diverso, e si basano sulla politica stessa origine. Ciò richiederebbe la creazione di un dominio aggiuntivo che vorrei evitare, se possibile. Credo che sia così che jsfiddle lo fa. Lo script può ancora fare alcuni danni, cambiando ad esempio
top.location.href
, che non è l'ideale. http://jsfiddle.net/PzkUw/ - Utilizzare sandbox attribute. Sospetto che questo non sia ben supportato tra i browser.
- Sanitizzare gli script prima di servirli. Preferirei non andarci.
Esistono altre soluzioni o raccomandazioni in merito?
Aggiornamento
Se, come sospetto, la prima opzione è la soluzione migliore, cosa può uno script dannoso fare altro che cambiare la posizione superiore della finestra, e come posso evitare questo? Posso manipolare o rifiutare determinati script basati sull'analisi del codice statico, ma questo è hard dato il numero di modi in cui è possibile accedere agli oggetti e la difficoltà analizzando javascript in modo statico in generale. Per lo meno, richiederebbe un parser completo e una serie di regole complesse (alcune, ma sospetto non tutte, delle quali sono presenti in JSLint).
Penso che l'idea del sottodominio sia la migliore. Ho esaminato personalmente questa domanda e non sono riuscito a trovare una soluzione migliore. Una volta ho giocato con il caricamento degli script in modo dinamico tramite XmlHttpRequest e l'esecuzione di eval - non mi ricordo perché l'ho lasciato cadere, però. –
Correlati: http://stackoverflow.com/questions/958997/frame-buster-buster-buster-code-needed- – Petah
Sono d'accordo con @JeremyJStarcher. Indipendentemente da ciò, hai la possibilità di controllare determinati elementi di JS, ** window ** è il più importante? In tal caso, proverei a respingere alcune richieste fatte dall'iframe, ma non sono sicuro di quanto sarebbe facile. – inhan