2011-07-18 9 views
17

Jeśli używam modułu http nodejs do utworzenia prostego serwera http, ile muszę sprawdzać/sprawdzać?Jak solidne jest nodejs jako serwer http?

Czy moduł zajmuje się kwestiami bezpieczeństwa, takimi jak błędne żądania i żądania o złośliwych wartościach nagłówka? Czy moduł zapewnia, że ​​wszystko jest zgodne ze specyfikacją http, czy też muszę dużo sprawdzać, aby mój serwer nie ulegał łatwo awarii?

Edytuj: Powiedzmy, że nodejs nie przeprowadza żadnej prawdziwej weryfikacji, co do której jestem pewien, że tak jest. Co muszę zrobić, aby mój serwer nie ulegał łatwo awarii?

+0

[źródło modułu http] (https://github.com/joyent/node/blob/master/lib/http.js) – Raynos

+1

@Raynos: wygląda na to, że praktycznie nie ma żadnego sprawdzania poprawności, po prostu analizuje żądanie do nagłówki i ciało. Czy sie zgadzasz? – shelman

+0

Nie wiem nic na temat bezpieczeństwa/luk w zabezpieczeniach serwera HTTP lub hakowania. Nie mogę więc komentować, co powinien sprawdzić. – Raynos

Odpowiedz

1

Co to jest złośliwa wartość nagłówka? Węzeł ma niski poziom, więc wiele rzeczy nie jest sprawdzanych. Ale musisz patrzeć na te rzeczy. Ale to nie jest tak, że ktoś może wysłać "wykonaj 0xFA894224" lub coś podobnego. Jedyne luki, które najprawdopodobniej są możliwe, to takie, które pozwalają na nieprawidłowe sformułowanie żądania (np. Być może dostaniesz request.location: "\*\*\* CHINAAA \*\*\*", zapomnisz uruchomić zdarzenie zamknięcia gniazda lub rzucisz błąd JavaScript i zakończysz go z wdziękiem

Zawsze możesz sprawdzić się za te lub użyj bloku catch catch, process.on itd. Oczywiście, nie oznacza to, że nie może być przepełnienia bufora lub czegoś w innym miejscu, ale jest mało prawdopodobne, aby węzeł został zbudowany na v8, a wiele z biblioteki są czystym JavaScript

EDIT: Jak zatrzymać losowe awarie:

process.on('uncaughtException',function() { 
/* ignore error */ 
}); 
+3

Ponadto, chociaż zatrzyma to 99% losowych awarii, 99% losowych awarii jest powodowanych przez JavaScript, a nie węzeł. Na przykład możesz wykonać polecenie obj [request.location] = request.headers, które może się zawiesić, jeśli ktoś w jakiś sposób wymusi "\ _ \ _ proto \ _ \ _". To tylko ogólne uwagi dotyczące JavaScript. –

+5

Dla rekordu "/ * ignoruj ​​błąd * /" jest bardzo głupim pomysłem. Jeśli ją wdrożysz, zastąp ją rozsądną obsługą błędów. – Raynos

-1

NodeJS nie został stworzony do użycia jako serwer HTTP skierowany do świata. Jego możliwości HTTP można jednak wykorzystać do pośredniczenia w żądaniach do właściwego serwera WWW.

Nie na temat, ale Nginx naprawdę dobrze sobie z tym radzi, ponieważ posiada stałą liczbę wątków.

+0

Więc ogólnie rzecz biorąc, nie jest dobrym pomysłem obsługa zgłoszeń POST i GET bezpośrednio za pomocą serwera nodejs? – shelman

+2

Najbardziej popularną konfiguracją, o której słyszałem, jest używanie Nginx jako bramy do jednej lub więcej instancji node.js. Nie sądzę, że słuszne jest twierdzenie, że "nie zostało stworzone, by być ...", kiedy nie zostało to zrobione. Deweloperzy projektu wydają mi się strzelać do serwera aplikacji internetowych. –

+1

Węzeł może uruchomić więcej procesów węzłowych, imho, używanie nginx nie jest użyteczne. –