TsgcWebSocketServer_HTTPAPI › Właściwości › MaxMessageSize
Maksymalny rozmiar w bajtach przychodzącej wiadomości WebSocket; chroni serwer przed atakami wyczerpującymi pamięć.
property MaxMessageSize: Int64 read FMaxMessageSize write FMaxMessageSize;
67108864 (64 MB). Użyj 0, aby uzyskać brak limitu.
Ten serwer działa na Windows HTTP Server API (http.sys). Wiadomość WebSocket nie ma wbudowanego limitu rozmiaru, więc złośliwy klient może próbować wyczerpać pamięć serwera na kilka sposobów: deklarując ogromną długość ramki, nigdy nie kończąc pofragmentowanej wiadomości (niekończący się strumień ramek kontynuacji) lub wysyłając małą ramkę per-message-deflate, która po dekompresji rozrasta się do gigabajtów (tzw. „bomba dekompresyjna”). MaxMessageSize ogranicza wszystkie trzy przypadki: serwer odrzuca ramkę, której zadeklarowana długość przekracza limit, ogranicza łączny rozmiar ponownie składanej pofragmentowanej wiadomości oraz przerywa dekompresję, gdy rozpakowane dane osiągną limit. Po przekroczeniu limitu połączenie jest zamykane z kodem zamknięcia WebSocket 1009 (Message Too Big).
Domyślna wartość 64 MB jest bezpieczna dla zdecydowanej większości aplikacji. Zwiększ ją, jeśli aplikacja w uzasadniony sposób wymienia większe wiadomości, lub zmniejsz, aby zacieśnić ograniczenie pamięci na serwerze dostępnym publicznie. Wartość 0 wyłącza limit (niezalecane dla serwerów osiągalnych z niezaufanych sieci). Niezależnie od tej wartości, 64-bitowa długość ramki z ustawionym najwyższym bitem jest zawsze odrzucana jako błąd protokołu, więc limitu nie można obejść przez przepełnienie liczby całkowitej.
Ta sama właściwość jest dostępna w TsgcWebSocketServer i TsgcWebSocketHTTPServer. Aby ograniczyć tempo połączeń i tempo wiadomości, połącz ją z RateLimiter i 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;