Powinieneś zawsze uruchamiać niezaufany kod w oddzielnym procesie, który jest dokładnie tym, co robi moduł piaskownicy. Prostym powodem jest to, że zamrozi węzeł.
Rozpoczyna się od utworzenia osobnego procesu, który później wyśle wynik serializowany do JSON na jego standardowym wyjściu. Proces nadrzędny kontynuuje wykonywanie niezależnie od tego, co robi dziecko i może wywołać limit czasu.
Niezaufany kod jest następnie zapakowany w zamknięcie z strict mode (w zwykłym kodzie JavaScript można użyć arguments.callee.caller
, aby uzyskać dostęp do danych spoza zakresu). W końcu, bardzo ograniczony obiekt global
jest przekazywany, aby uniemożliwić dostęp do API węzła. Niezaufany kod może wykonywać tylko podstawowe obliczenia i nie ma dostępu do plików ani gniazd.
Chociaż należy odczytać kod piaskownicy jako źródło inspiracji, nie polecam go używać jak:
- Kod jest już stary i nie zostały zaktualizowane przez 7 miesięcy.
- Moduł przetwarzania podrzędnego w węźle zawiera już większość potrzebnych funkcji, szczególnie child_process.fork().
- Kanał IPC zapewniony przez child_process.fork prawdopodobnie ma lepszą wydajność.
Dla zwiększenia bezpieczeństwa można również rozważyć użycie setuid-sandbox. Jest to kod używany przez Google Chrome, aby uniemożliwić procesom kart uzyskanie dostępu do systemu plików. Będziesz musiał utworzyć moduł natywny, ale ten example wydaje się prosty.
Polecam użycie 'vm', ponieważ jest to część rdzenia węzła. A ponieważ rdzeń węzła ma tendencję do naprawiania błędów, wystarczy założyć, że problem zostanie naprawiony. – Raynos
@Raynos to nie jest błąd. Dokumenty mówią, że jest przeznaczony tylko dla dobrze znanego kodu. – thejh
@thejh - prawda, ale API nadaje się do całkiem uzasadnionego przekonania, że kod wykonuje się w całkowicie innym kontekście, co oznacza, że wspomniany kod nie powinien mieć dostępu do bieżącego kontekstu. I spodziewam się, że * zamiar * interfejsu API jest dokładnie taki - aby zapewnić piaskownicę do uruchamiania skryptów. Więc ... sądzę, że można dość silnie stwierdzić, że jest to po prostu dobrze udokumentowany błąd. :) – broofa