2015-06-14 35 views
18

Używam modułu ws i chciałbym ograniczyć ilość danych przesyłanych przez klienta przez websocket do 1MB. Zapobiegnie to wysyłaniu przez złośliwego użytkownika ogromnych ilości danych (w kategoriach GB), co powoduje, że serwerowi brakuje pamięci, co spowoduje błędy odmowy usługi dla każdego normalnego użytkownika.
Na przykład, przykład ekspresowe pozwala określić maksymalny rozmiar żądania POST tak:
jak ograniczyć ilość danych przesyłanych przez klienta za pomocą websocket?

bodyParser.json({limit:'1Mb'}) 

Jak zrobić coś podobnego z modułem ws?
Próbowałem:

var ws = require('ws').Server 
var wsserver = new ws({port:8080, limit:'1Mb'}) 

Ale to oczywiście nie działa.
Chcę, aby transmisja danych została przerwana (po przekroczeniu 1 MB) i aby połączenie websocket zostało zamknięte. Jak mogę to zrobić?
Musi istnieć sposób ograniczenia ramek danych pochodzących od klienta ...

+0

chyba nikt jeszcze nie wie ... https://github.com/websockets/ws/issues/513 ... https://github.com/websockets/ws/issues?utf8=%E2%9C% 93 & q = limit – rafaelcastrocouto

+0

Jakiej biblioteki "ws' używasz? Jeśli w dokumentacji dla używanej biblioteki webSocket nie ma odpowiedzi, odpowiedź można ustalić tylko po zapoznaniu się z kodem biblioteki, aby sprawdzić, czy ma jakąkolwiek zdolność ograniczania lub zrozumienia, gdzie kod mógł zostać zmieniony. aby dodać taki limit. To brzmi jak rozsądna rzecz, której chce. – jfriend00

+0

@ jfriend00 https://www.npmjs.com/package/ws tutaj jest. Najwyraźniej w dokumentacji nie ma właściwości argumentu opcji, który by to zrobił. Być może istnieje metoda instancji wsServer, która może ustawić limit. Sprawdzę to. –

Odpowiedz

12

Ta umiejętność nie istnieje (obecnie) w tej bibliotece.

Wyczuwanie kodu źródłowego wydaje się, że miejscem rozpoczęcia będzie metoda processPacket() w https://github.com/websockets/ws/blob/master/lib/Receiver.js.

Gdy już dostępny jest nagłówek pakietu, możesz zobaczyć rozmiar wysyłanej wiadomości. Jeśli jest powyżej pewnego progu, powinien istnieć sposób na zamknięcie połączenia, zanim wszystkie bajty uderzą w twoją sieć.

Oczywiście fajnie byłoby rozwidlić ich repozytorium, wydać żądanie funkcji, dodać opcję konfiguracji, która domyślnie nie podejmuje żadnych działań, jeśli nie jest ustawiona (nie przerywaj kompatybilności wstecznej), i wyślij żądanie ściągnięcia.

Jeśli im się to podoba, połączą się. Jeśli nie, nadal będziesz mógł połączyć swoje przyszłe wersje z własnym repo i pozostać na bieżąco, bez konieczności ponownego wykonywania pracy za każdym razem, gdy przesyłają nową wersję.

+0

Istnieje kilka instancji' pakietów o długości obejmującej więcej niż 32-bitowe obecnie nie jest obsługiwane'. Zmiana warunku maksymalnej długości, która prowadzi do tego błędu, może być prostym sposobem na zrobienie tego, chociaż nie jestem pewien, co dzieje się z ramkami, które mają określoną długość, ale w rzeczywistości trwają znacznie dłużej. –

+0

Wielkość pakietów o długości przekraczającej 32 bity określa się w specyfikacji RFC WebSockets jako prawidłową długość komunikatu, która wymaga specjalnej obsługi, ponieważ zmienia rozmiar nagłówka ramki. Wiadomość o takim rozmiarze przekracza 4 GB. – Ghedipunk

+0

Istnieje również poprawny przypadek dla wiadomości, w których jest więcej danych w ramce TCP po osiągnięciu całkowitej długości ramki WebSockets, ze względu na sposób, w jaki TCP obsługuje bardzo małe wiadomości przez połączenia o dużym opóźnieniu.Algorytm Walkera scali wiele wiadomości razem w warstwie TCP, powodując, że wiele ramek WebSockets trafi do tej samej sieci odczytanej, potencjalnie przenosząc nieodebrane komunikaty, jeśli serwer ich nie sprawdzi ... Chociaż to się dzieje tylko w seriach bardzo krótkie wiadomości ... Nigdy nie pojawi się prawidłowo w wiadomości o rozmiarze prawie 4 GB. – Ghedipunk