È necessario eseguire sempre codice non affidabile in un processo separato, che è esattamente ciò che fa il modulo sandbox. Un motivo semplice è che congela il nodo.
Si avvia creando un processo separato, che in seguito invierà il risultato serializzato a JSON sul suo stdout. Il processo genitore continua a essere eseguito indipendentemente da ciò che fa il bambino e può attivare un timeout.
Il codice non attendibile viene quindi inserito in una chiusura con strict mode (nel normale JavaScript, è possibile utilizzare arguments.callee.caller
per accedere ai dati esterni all'ambito). Infine, viene inviato un oggetto global
molto limitato per impedire l'accesso all'API del nodo. Il codice non affidabile può eseguire solo calcoli di base e non ha accesso a file o socket.
Mentre si dovrebbe leggere il codice di sandbox come fonte di ispirazione, non mi consiglia di usarlo come è:
- Il codice è vecchio e non è stato aggiornato per 7 mesi.
- Il modulo Processo figlio nel nodo fornisce già la maggior parte delle funzionalità necessarie, in particolare child_process.fork().
- Il canale IPC fornito da child_process.fork probabilmente ha prestazioni migliori.
Per una maggiore sicurezza, è possibile anche considerare l'utilizzo di setuid-sandbox. È il codice utilizzato da Google Chrome per impedire ai processi di tabulazione di accedere al file system. Dovresti creare un modulo nativo, ma questo example sembra semplice.
fonte
2012-08-03 12:54:49
Si consiglia di utilizzare 'vm' perché fa parte del nodo core. E poiché il nodo core tende a correggere i bug, supponiamo che il problema venga risolto. – Raynos
@Raynos non è un bug. I documenti dicono che è inteso solo per codice noto. – thejh
@thejh - true, ma l'API si presta alla ragionevole credenza che il codice sia in esecuzione in un contesto completamente diverso, implicando che detto codice non dovrebbe essere in grado di accedere al contesto corrente. E mi aspetto che l'intento * dell'API sia esattamente quello: fornire una sandbox in cui eseguire gli script. Quindi ... Penso che un caso abbastanza forte possa essere fatto che questo è semplicemente un bug ben documentato. :) – broofa