Pisanie bezpiecznego kodu
Developer, który zdecyduje się na wykorzystanie SSJS w produkcyjnej aplikacji musi zwrócić uwagę na szereg problemów związanych z bezpieczeństwem. Po części są to zasady typowe dla wszystkich javascriptowych projektów.
Modyfikacja zmiennych globalnych
Moduły Node.JS mogą korzystać ze zmiennych globalnych. Nadpisanie zmiennej globalnej może skutkować nieprzewidywalnym zachowaniem modułów (np. wyrzucaniem wyjątków). Dużą trudność sprawia śledzenie wykorzystania zmiennych globalnych przez każdy z modułów.
Sprawdzono nadpisywanie następujących zmiennych:
undefinedInfinityNaNErrorObject.prototype.toString
Właściwie wszystkie moduły przestały poprawnie działać w momencie nadpisania zmiennej undefined. Nadpisanie zmiennych dotyczących liczb (Infinity, NaN) nie skutkowało awarią, ale prawdopodobnie tylko dlatego, że akurat testowane moduły nie korzystały z wartości tych zmiennych.
Dodatkowe niebezpieczeństwo stwarza metoda eval. Używanie jej, a zwłaszcza dostarczanie jej danych, które pochodzą bezpośrednio od użytkownika, jest bardzo niebezpieczne.
Rozwiązaniem powyższych problemów jest biblioteka node-secure (https://github.com/ddrcode/node-secure), która:
- zabezpiecza zmienne globalne przed modyfikacją,
- wyzwala zdarzenie kiedy wykonywana jest metoda eval,
- pozwala zamrozić metody obiektu zabezpieczając je przed nadpisaniem (secureMethods),
- zapobiega wypisywaniu właściwości o nazwach zaczynających się od znaku _ (securePrivates)
Wykonywanie bezpieczenego kodu JavaScript
Moduł vm dla node.js pozwala na wykonywanie kodu JavaScriptowego w sandboksie czyli środowisku odseparowanym od reszty aplikacji. Biblioteka pozwala na uruchamianie kodu z dostępem do zmiennych globalnych ale bez dostępu do zmiennych lokalnych funkcji (vm.runInThisContext) lub uruchamianie kodu w nowym, całkowicie izolowanym środowisku (vm.runInNewContext). Ostatnia funkcja jest szczególnie przydatna przy importowaniu kodu różnorakich modułów i pluginów rozszerzających funkcje aplikacji. Te możliwości wykorzystuje moduł Sandbox (http://gf3.github.com/sandbox/), oferując przyjazny interfejs do ewaluowania kodu w izolowanym środowisku.
Aby uniknąć wstrzyknięcia kodu po stronie przeglądarki, zaleca się użycie biblioteki Google Caja. Stosuje ona zaawansowane techniki zabezpieczania niezaufanego kodu, pozwalając na jego bezpieczne uruchomienie. Google Caja jest też dostępne jako moduł Node.js sanitizer, który pozwala na oczyszczenie danych podanych przez użytownika (np. ze skryptów wywołujących złośliwy kod).
Na uwagę w dziedzinie bezpieczeństwa zasługuje funkcja dodana w Node v5.0: child_process.fork, która stworzy kopię naszej aplikacji (więcej na Wikipedii), działającą równolegle w systemie. Komunikacja następuje w wyniku bezpiecznej techniki "wiadomości" przesyłanych między aplikacjami. Uruchamiając niezaufany kod w takiej kopii, nie ryzykujemy zatrzymaniem aplikacji, nawet jeśli hakerowi uda się w jakiś sposób uśmiercić wspomniany proces.
Wspomniane techniki (sandboxing, sanitizing, forking) tworzą względnie bezpieczne środowisko do wykonywania niezaufanego kodu.
Nieprzechwycone wyjątki Node.js
Innym problemem w Node.js są nieprzechwycone wyjątki. Taki wyjątek jest przedstawiony użytkownikowi jako strona z błędem, włącznie z wrażliwymi danymi takimi jak ślad wyjątku. Rozwiązaniem tego problemu jest przechwycenie takiego wyjątku i wygenerowanie własnej strony z komunikatem o błędzie oraz zapisanie wyjątku w dzienniku:
process.on('uncaughtException', function (err) {
console.log('error: ' + err);
});
Sam Node.js okazał się odporny na wyjątkowo długie adresy oraz znaki specjalne w URLach.

Komentarze
1
Steffie napisał/a 29.09.2011 o 06:31
Was toltaly stuck until I read this, now back up and running.
2
jwiyvgka napisał/a 29.09.2011 o 18:24
t7uSDW lkfdwqlptyny
3
merrodu napisał/a 30.09.2011 o 16:54
sAgfNV , [url=http://mlaxayvfxntd.com/]mlaxayvfxntd[/url], [link=http://elskauqusseq.com/]elskauqusseq[/link], http://yvlipvtxpazi.com/