TsgcWebSocketServer_HTTPAPI › Proprietà › MaxMessageSize
Dimensione massima in byte di un messaggio WebSocket in ingresso; protegge il server dagli attacchi di esaurimento della memoria.
property MaxMessageSize: Int64 read FMaxMessageSize write FMaxMessageSize;
67108864 (64 MB). Utilizzare 0 per illimitato.
Questo server gira sulla Windows HTTP Server API (http.sys). Un messaggio WebSocket non ha un limite di dimensione intrinseco, quindi un client malevolo può tentare di esaurire la memoria del server in diversi modi: dichiarando una lunghezza di frame enorme, non completando mai un messaggio frammentato (un flusso infinito di frame di continuazione) oppure inviando un piccolo frame per-message-deflate che si espande fino a diversi gigabyte (una "bomba di decompressione"). MaxMessageSize limita tutti e tre i casi: il server rifiuta un frame la cui lunghezza dichiarata supera il limite, limita la dimensione totale di un messaggio frammentato riassemblato e interrompe la decompressione una volta che l'output espanso raggiunge il limite. Quando il limite viene superato la connessione viene chiusa con il codice di chiusura WebSocket 1009 (Message Too Big).
Il valore predefinito di 64 MB è sicuro per la stragrande maggioranza delle applicazioni. Aumentarlo se l'applicazione scambia legittimamente messaggi più grandi, oppure ridurlo per restringere il limite di memoria su un server esposto pubblicamente. Un valore di 0 disabilita il limite (non consigliato per server raggiungibili da reti non attendibili). Indipendentemente da questo valore, una lunghezza di frame a 64 bit con il bit più significativo impostato viene sempre rifiutata come errore di protocollo, quindi il limite non può essere aggirato tramite overflow di interi.
La stessa proprietà è disponibile su TsgcWebSocketServer e TsgcWebSocketHTTPServer. Per la limitazione della frequenza delle connessioni e dei messaggi, combinarla con RateLimiter e Firewall.
oServer := TsgcWebSocketServer_HTTPAPI.Create(nil);
oServer.Port := 80;
// accept messages up to 16 MB, close 1009 on anything larger
oServer.MaxMessageSize := 16 * 1024 * 1024;
oServer.Active := true;