2015-06-14 15 views
18

Sto usando il modulo ws e vorrei limitare la quantità di dati inviati dal client tramite websocket a 1Mb. Ciò impedirà a un utente malintenzionato di inviare enormi quantità di dati (in termini di GB) che causano l'esaurimento della memoria del server, il che causerebbe errori di tipo Denial of Service per ogni utente normale.
Per esempio, ad esempio Express consente di specificare la dimensione massima di un corpo della richiesta posta in questo modo:
come limitare la quantità di dati inviati dal client tramite websocket?

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

Come faccio qualcosa di simile con il modulo ws?
Ho provato

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

Ma questo, naturalmente, non funziona.
Desidero interrompere la trasmissione dei dati (dopo che 1Mb è stato superato) e la connessione web socket da chiudere. Come lo posso fare?
Ci deve essere un modo per limitare i frame di dati provenienti dal client ...

+0

indovina nessuno lo sa ancora ... https://github.com/websockets/ws/issues/513 ... https://github.com/websockets/ws/issues?utf8=%E2%9C% 93 & q = limite – rafaelcastrocouto

+0

Quale libreria 'ws' stai usando? Se non c'è una risposta nella documentazione per la libreria webSocket che stai usando, allora una risposta può essere determinata solo studiando il codice per la libreria per vedere se ha qualche tipo di capacità limite o capire dove il codice potrebbe essere cambiato aggiungere un tale limite. Sembra una cosa ragionevole da volere. – jfriend00

+0

@ jfriend00 https://www.npmjs.com/package/ws eccolo qui. Apparentemente nella documentazione non vi è alcuna proprietà dell'argomento dell'opzione che lo farebbe. Forse c'è un metodo dell'istanza wsServer che può impostare il limite. Controllerò. –

risposta

12

Quell'abilità non esiste (attualmente) in quella libreria.

Girando attorno al loro codice sorgente, sembra che il punto di partenza sia il metodo processPacket() in https://github.com/websockets/ws/blob/master/lib/Receiver.js.

Una volta disponibile l'intestazione del pacchetto, è possibile visualizzare la dimensione del messaggio inviato. Se è al di sopra di una certa soglia, dovrebbe esserci un modo per chiudere la connessione prima che tutti i byte colpiscano la tua rete.

Ovviamente, la cosa migliore da fare sarebbe biforcarsi il repository, emettere una richiesta di funzionalità, aggiungere un'opzione di configurazione che non esegue alcuna azione se non è impostata (non rompere la compatibilità con le versioni precedenti), e inviare una richiesta di pull.

Se gli piace, si uniranno. In caso contrario, sarà comunque possibile unire le versioni future nel proprio repository e rimanere aggiornati senza dover ripetere il lavoro ogni volta che inviano una nuova versione.

+0

Ci sono un paio di istanze di' pacchetti di lunghezza superiore a 32 bit che al momento non sono supportati'. Cambiare la condizione di lunghezza massima che porta a quell'errore potrebbe essere un modo semplice per farlo, anche se non sono sicuro di cosa succede ai frame che richiedono una certa lunghezza, ma in realtà continuano per molto più tempo. –

+0

Il caso di lunghezza del pacchetto che supera più di 32 bit è specificato nel WebSockets RFC come lunghezza di messaggio valida che richiede una gestione speciale a causa della modifica della dimensione dell'intestazione del frame. Un messaggio che la dimensione sarebbe superiore a 4 GB. – Ghedipunk

+0

Esiste anche un caso valido per i messaggi in cui vi sono più dati nel frame TCP dopo che è stata raggiunta la lunghezza totale del frame WebSockets, a causa del modo in cui TCP gestisce messaggi molto piccoli su connessioni ad alta latenza.Nagle's Algorithm unirà più messaggi insieme al livello TCP, causando più frame WebSockets nella stessa rete letti, potenzialmente portando messaggi persi se il server non li controlla ... Anche se questo accade legittimamente solo su una serie di messaggi brevi ... Non si verificherebbe mai in modo legittimo su un messaggio di dimensioni quasi 4 GB. – Ghedipunk

Problemi correlati