Bezpieczeństwo nie jest już opcjonalne. Każdy serwer WebSocket wystawiony na działanie internetu jest celem ataków brute force, prób wstrzykiwania, zalewania połączeniami i automatycznych nadużyć. Obrona przed tymi zagrożeniami zazwyczaj wymaga dodatkowego oprogramowania pośredniego, pisania niestandardowej logiki filtrowania lub wdrożenia osobnego reverse proxy — co wszystko zwiększa złożoność i spowalnia rozwój.
sgcWebSockets 2026.4.0 wprowadza TsgcWSFirewall — dedykowany komponent firewalla, który podłącza się bezpośrednio do twojego serwera WebSocket, teraz z 15 modułami ochrony, w tym filtrowaniem krajów GeoIP, adaptacyjnym scoringiem zagrożeń, progresywną eskalacją banów i silnikiem reguł niestandardowych. Upuść komponent, skonfiguruj potrzebne moduły ochrony, przypisz do serwera i twoja aplikacja jest chroniona. Bez zewnętrznych zależności. Bez oprogramowania pośredniego. Bez niestandardowego kodu dla typowych przypadków.
Ten artykuł omawia pełny zestaw funkcji i pokazuje, jak skonfigurować każdy moduł ochrony w Delphi.
Piętnaście modułów ochrony, jeden komponent
Firewall udostępnia piętnaście niezależnych modułów ochrony. Włączaj tylko to, czego potrzebujesz — każdy moduł działa samodzielnie lub w połączeniu z innymi.
|
Lista blokowanych IP Blokuj konkretne adresy IP lub całe zakresy za pomocą notacji CIDR. Połączenia z zablokowanych IP są odrzucane przed dotarciem do kodu aplikacji. |
Lista dozwolonych IP Zdefiniuj listę zaufanych adresów IP. Po włączeniu adresy z białej listy omijają wszystkie inne kontrole bezpieczeństwa — idealne dla usług wewnętrznych i narzędzi monitorowania. |
Ochrona przed atakami brute force Śledź nieudane próby uwierzytelnienia na IP. Automatycznie banuj sprawców po przekroczeniu konfigurowalnego progu w przesuwnym oknie czasowym. |
|
Wykrywanie SQL Injection Skanuj przychodzące wiadomości w poszukiwaniu typowych wzorców SQL injection. Wbudowane wykrywanie wstrzykiwania boolowskiego, UNION SELECT, wstrzykiwania instrukcji i więcej. |
Wykrywanie XSS Wykrywaj ładunki cross-site scripting w wiadomościach. Wychwytuje tagi skryptów, handlery zdarzeń, URI protokołu JavaScript, wstrzykiwanie iframe i wyrażenia CSS. |
Ograniczanie liczby połączeń Ogranicz liczbę jednoczesnych połączeń na adres IP. Zapobiegaj wyczerpaniu zasobów serwera przez pojedynczego klienta. |
|
Ochrona przed zalewaniem wiadomościami Ogranicz liczbę wiadomości, które jeden adres IP może wysyłać na sekundę. Chroni przed zalewaniem wiadomościami i wzorcami ataku odmowy usługi. |
Ograniczanie rozmiaru ładunku Odrzucaj wiadomości przekraczające maksymalny próg rozmiaru. Zapobiega wyczerpaniu pamięci przez zbyt duże ładunki. |
Wykrywanie path traversal Wykrywaj sekwencje przemieszczania się po katalogach w wiadomościach. Blokuje próby dostępu do plików poza zamierzonym zakresem. |
|
Wykrywanie wstrzykiwania poleceń Wykrywaj wzorce wstrzykiwania poleceń systemu operacyjnego w wiadomościach. Blokuje metaznaki powłoki i typowe sekwencje poleceń. |
Filtrowanie krajów GeoIP Zezwalaj lub blokuj połączenia na podstawie geograficznego pochodzenia. Obsługuje tryby listy blokowania i listy dozwolonych z wyszukiwaniem w bazie CSV. |
System scoringu zagrożeń Kumuluj ważone wyniki na IP we wszystkich typach naruszeń. Automatyczny ban po osiągnięciu progu, z automatycznym zmniejszaniem z czasem. |
|
Progresywna eskalacja banów Zwiększaj czas trwania banu przy każdym kolejnym naruszeniu. Eskaluj od krótkich banów do stałych blokad dla powtarzających się sprawców. |
Ochrona WebSocket Weryfikuj origin WebSocket, egzekwuj limity rozmiaru ramek i filtruj subprotokołu. Ochrona na poziomie protokołu wykraczająca poza treść wiadomości. |
Silnik reguł niestandardowych Definiuj własne reguły firewalla z warunkami i akcjami. Twórz progi naruszeń, okna czasowe i automatyczne odpowiedzi. |
Szybki start
Uruchomienie firewalla wymaga tylko trzech kroków: utwórz, skonfiguruj i przypisz.
var
oFirewall: TsgcWSFirewall;
oServer: TsgcWebSocketHTTPServer;
begin
oFirewall := TsgcWSFirewall.Create(nil);
oFirewall.Enabled := True;
// Enable the modules you need
oFirewall.Blacklist.Enabled := True;
oFirewall.Blacklist.IPs.Add('10.0.0.0/8');
oFirewall.RateLimit.Enabled := True;
oFirewall.RateLimit.MaxConnectionsPerIP := 5;
oFirewall.SQLInjection.Enabled := True;
oFirewall.XSS.Enabled := True;
// Assign to any server component
oServer.Firewall := oFirewall;
oServer.Active := True;
end;
Po przypisaniu firewall integruje się automatycznie: połączenia są sprawdzane zanim dotrą do twoich handlerów zdarzeń, wiadomości są skanowane w czasie rzeczywistym, a rozłączeni klienci są wyrejestrowywani ze śledzenia — wszystko bez pisania ani jednej linii kodu obsługi zdarzeń.
Lista blokowanych i dozwolonych IP
Lista blokowanych odrzuca połączenia z określonych IP lub zakresów. Lista dozwolonych robi odwrotność — definiuje zaufany zestaw adresów, które omijają wszystkie inne kontrole, w tym filtrowanie wiadomości.
Obie obsługują dokładne adresy IP oraz notację CIDR dla filtrowania opartego na zakresach:
// Blacklist: block entire subnets and specific IPs
oFirewall.Blacklist.Enabled := True;
oFirewall.Blacklist.IPs.Add('10.0.0.0/8'); // All 10.x.x.x
oFirewall.Blacklist.IPs.Add('172.16.0.0/16'); // All 172.16.x.x
oFirewall.Blacklist.IPs.Add('192.168.1.100'); // Single IP
// Whitelist: trusted IPs bypass everything
oFirewall.Whitelist.Enabled := True;
oFirewall.Whitelist.IPs.Add('192.168.1.1'); // Admin machine
oFirewall.Whitelist.IPs.Add('192.168.1.0/24'); // Internal network
Priorytet. Gdy lista dozwolonych jest włączona, jest sprawdzana jako pierwsza. Jeśli IP pasuje, połączenie jest natychmiast dozwolone — lista blokowanych, bany, limity częstotliwości i filtry wiadomości są pomijane.
Ochrona przed atakami brute force
Moduł brute force śledzi nieudane próby uwierzytelnienia na IP przy użyciu przesuwnego okna czasowego. Gdy IP przekroczy maksymalną liczbę prób w oknie, zostaje automatycznie zbanowany na konfigurowalny czas.
| Właściwość | Domyślnie | Opis |
|---|---|---|
| MaxAttempts | 5 | Nieudane próby przed banem |
| TimeWindowSec | 60 | Przesuwne okno w sekundach do zliczania prób |
| BanDurationSec | 300 | Czas banu w sekundach (0 = trwały) |
// Ban after 3 failed logins within 60 seconds, for 10 minutes
oFirewall.BruteForce.Enabled := True;
oFirewall.BruteForce.MaxAttempts := 3;
oFirewall.BruteForce.TimeWindowSec := 60;
oFirewall.BruteForce.BanDurationSec := 600;
// Register failed attempts from your authentication handler
procedure TForm1.ServerAuthentication(Connection: TsgcWSConnection;
aUser, aPassword: String; var Authenticated: Boolean);
begin
Authenticated := ValidateCredentials(aUser, aPassword);
if not Authenticated then
oFirewall.RegisterFailedAttempt(Connection.IP);
end;
Firewall automatycznie zajmuje się resztą: zlicza próby, sprawdza okno czasowe i banuje IP po osiągnięciu progu. Zbanowane IP są odrzucane na poziomie połączenia przed dalszym przetwarzaniem.
Ręczne zarządzanie banami
Oprócz automatycznych banów możesz zarządzać banami programistycznie w dowolnym momencie:
// Ban an IP for 1 hour
oFirewall.BanIP('203.0.113.50', 3600);
// Permanent ban (duration = 0)
oFirewall.BanIP('198.51.100.10');
// Check ban status
if oFirewall.IsBanned('203.0.113.50') then
WriteLn('IP is banned');
// Remove a specific ban
oFirewall.UnbanIP('203.0.113.50');
// Clear all bans
oFirewall.ClearBans;
Wykrywanie SQL Injection
Moduł SQL injection skanuje każdą przychodzącą wiadomość tekstową w poszukiwaniu typowych wzorców ataków. Po wykryciu dopasowania konfigurowana akcja określa odpowiedź: zablokuj klienta, zaloguj zdarzenie lub zezwól na przejście.
oFirewall.SQLInjection.Enabled := True;
oFirewall.SQLInjection.Action := faDeny; // faDeny, faLog, or faAllow
// Add custom patterns beyond the built-in set
oFirewall.SQLInjection.CustomPatterns.Add('WAITFOR DELAY');
oFirewall.SQLInjection.CustomPatterns.Add('BENCHMARK(');
Wbudowane wzorce
Detektor zawiera sprawdzenia bez rozróżniania wielkości liter dla najczęstszych technik SQL injection:
- ' OR ', ' AND ' — Boolean injection
- UNION SELECT — Wstrzykiwanie oparte na UNION
- '; DROP, '; DELETE, '; INSERT, '; UPDATE — Statement injection
- EXEC(, EXECUTE( — Wykonanie poleceń
- xp_cmdshell — Rozszerzone procedury składowane
- CAST(, CONVERT( — Nadużycie konwersji typów
- 1=1, 1'='1 — Wstrzykiwanie tautologii
Wykrywanie XSS
Moduł XSS wykrywa ładunki cross-site scripting w wiadomościach WebSocket, zanim dotrą do logiki aplikacji lub zostaną przekazane innym klientom.
oFirewall.XSS.Enabled := True;
oFirewall.XSS.Action := faDeny;
Wbudowane wykrywanie obejmuje:
- , <strong style="color:#2c2c2c;">javascript: — Script injection
- onerror=, onload=, onclick=, onmouseover= — Event handler injection
- eval(, document.cookie — JavaScript evaluation and cookie theft
- — Element injection
- , expression( — SVG and CSS expression attacks
Ograniczanie liczby połączeń
Ogranicz liczbę jednoczesnych połączeń, które może utrzymywać pojedynczy adres IP. Zapobiega wyczerpaniu zasobów przez klientów otwierających nadmierne połączenia — czy to złośliwe, czy źle skonfigurowane.
// Allow up to 5 concurrent connections per IP
oFirewall.RateLimit.Enabled := True;
oFirewall.RateLimit.MaxConnectionsPerIP := 5;
oFirewall.RateLimit.TimeWindowSec := 60;
Śledzenie połączeń jest w pełni automatyczne: firewall zwiększa licznik przy połączeniu i zmniejsza przy rozłączeniu. Gdy nowe połączenie przekroczyłoby limit, jest odrzucane zanim wystąpi zdarzenie OnConnect serwera.
Ochrona przed zalewaniem wiadomościami
Ogranicz liczbę wiadomości, które jeden adres IP może wysyłać na sekundę. Chroni to przed wzorcami ataku odmowy usługi, gdzie klient szybko wysyła wiadomości, by przeciążyć serwer lub innych podłączonych klientów.
// Limit to 50 messages per second per IP
oFirewall.FloodProtection.Enabled := True;
oFirewall.FloodProtection.MaxMessagesPerSec := 50;
oFirewall.FloodProtection.Action := faDeny; // Disconnect offender
Ograniczanie rozmiaru ładunku
Egzekwuj maksymalny rozmiar wiadomości, aby zapobiec wysyłaniu przez klientów zbyt dużych ładunków, które mogłyby wyczerpać pamięć serwera. Wiadomości przekraczające próg są odrzucane przed przetworzeniem.
oFirewall.PayloadLimit.Enabled := True;
oFirewall.PayloadLimit.MaxSizeBytes := 65536; // 64 KB max
oFirewall.PayloadLimit.Action := faDeny;
Wykrywanie path traversal
Moduł path traversal skanuje przychodzące wiadomości w poszukiwaniu sekwencji przemieszczania się po katalogach, które próbują uzyskać dostęp do plików poza zamierzonym zakresem. Jest to krytyczne dla aplikacji przetwarzających ścieżki plików lub identyfikatory zasobów z wiadomości klienckich.
Wbudowane wykrywanie obejmuje:
- ../, ..\ — Względne przemieszczanie się po ścieżkach
- %2e%2e, %252e — Przemieszczanie zakodowane URL
- /etc/passwd, /etc/shadow — Dostęp do plików systemowych Unix
- cmd.exe, boot.ini — Dostęp do plików systemowych Windows
oFirewall.PathTraversal.Enabled := True;
oFirewall.PathTraversal.Action := faDeny;
Wykrywanie wstrzykiwania poleceń
Moduł wstrzykiwania poleceń wykrywa wzorce wstrzykiwania poleceń systemu operacyjnego w wiadomościach. Wychwytuje metaznaki powłoki i typowe sekwencje poleceń używane do wykonywania dowolnych poleceń systemowych.
Wbudowane wykrywanie obejmuje:
- ; |, &&, || — Łańcuchowanie poleceń powłoki
- $(command), `command` — Podstawianie poleceń
- wget, curl, nc, netcat — Wywołanie narzędzi sieciowych
- /bin/sh, /bin/bash, cmd /c — Uruchamianie powłoki
oFirewall.CommandInjection.Enabled := True;
oFirewall.CommandInjection.Action := faDeny;
Filtrowanie krajów GeoIP
Filtruj połączenia na podstawie ich geograficznego pochodzenia przy użyciu rozpoznawania IP-kraj. Moduł GeoIP obsługuje dwa tryby: BlockList (blokuj określone kraje, zezwalaj na wszystko inne) i AllowList (zezwalaj tylko na określone kraje, blokuj wszystko inne).
| Właściwość | Opis |
|---|---|
| Mode | gmBlockList or gmAllowList |
| Countries | Kody krajów ISO 3166-1 alpha-2 (np. US, GB, DE) |
| DatabaseFile | Ścieżka do pliku CSV do rozpoznawania IP-kraj |
Blokowanie określonych krajów
oFirewall.GeoIP.Enabled := True;
oFirewall.GeoIP.Mode := gmBlockList;
oFirewall.GeoIP.Countries.Add('CN');
oFirewall.GeoIP.Countries.Add('RU');
oFirewall.LoadGeoIPDatabase('geoip.csv');
Zezwolenie tylko na określone kraje
// Only allow connections from US, UK, and Germany
oFirewall.GeoIP.Enabled := True;
oFirewall.GeoIP.Mode := gmAllowList;
oFirewall.GeoIP.Countries.Add('US');
oFirewall.GeoIP.Countries.Add('GB');
oFirewall.GeoIP.Countries.Add('DE');
oFirewall.LoadGeoIPDatabase('geoip.csv');
Bazy danych GeoIP. Darmowe bazy CSV IP-kraj są dostępne od dostawców takich jak DB-IP i IP2Location. Alternatywnie zaimplementuj zdarzenie OnResolveCountry, aby użyć własnej logiki rozpoznawania.
System scoringu zagrożeń
System scoringu zagrożeń przypisuje ważone punkty do każdego typu naruszenia i kumuluje wynik na adres IP. Gdy wynik przekroczy próg automatycznego banu, IP jest automatycznie banowane. Wyniki zmniejszają się z czasem, więc jednorazowe incydenty nie skutkują stałymi karami.
| Właściwość | Domyślnie | Opis |
|---|---|---|
| AutoBanThreshold | 100 | Wynik, przy którym IP jest automatycznie banowane |
| DecayPerHour | 10 | Punkty odejmowane za każdą godzinę bezczynności |
oFirewall.ThreatScore.Enabled := True;
oFirewall.ThreatScore.AutoBanThreshold := 80;
oFirewall.ThreatScore.DecayPerHour := 5;
Monitorowanie zmian wyników
Użyj zdarzenia OnThreatScoreChanged do monitorowania wyników w czasie rzeczywistym i podejmowania niestandardowych działań przed osiągnięciem progu automatycznego banu.
procedure TForm1.FirewallThreatScoreChanged(Sender: TObject;
const aIP: string; const aOldScore, aNewScore: Integer);
begin
if aNewScore >= 50 then
LogToFile(Format('[%s] Threat score elevated: %d -> %d',
[aIP, aOldScore, aNewScore]));
end;
Progresywna eskalacja banów
Zamiast stałego czasu trwania banu, moduł eskalacji zwiększa długość banu przy każdym kolejnym naruszeniu. Osoby naruszające przepisy po raz pierwszy otrzymują krótki ban; powtarzający się sprawcy są eskalowani aż do stałej blokady.
oFirewall.BanEscalation.Enabled := True;
oFirewall.BanEscalation.Levels.Add('300'); // 5 minutes
oFirewall.BanEscalation.Levels.Add('1800'); // 30 minutes
oFirewall.BanEscalation.Levels.Add('7200'); // 2 hours
oFirewall.BanEscalation.Levels.Add('86400'); // 24 hours
oFirewall.BanEscalation.Levels.Add('0'); // permanent
Wskazówka. Połącz progresywną eskalację z systemem scoringu zagrożeń dla maksymalnej skuteczności. Scoring zagrożeń identyfikuje złośliwych aktorów w wielu typach naruszeń, a eskalacja zapewnia, że powtarzający się sprawcy napotykają coraz poważniejsze konsekwencje.
Ochrona specyficzna dla WebSocket
Oprócz skanowania na poziomie wiadomości, firewall zapewnia ochrony na poziomie protokołu specyficzne dla połączeń WebSocket: walidację origin, egzekwowanie rozmiaru ramek i filtrowanie subprotokołów.
// Validate the Origin header to prevent cross-site hijacking
oFirewall.WebSocket.Enabled := True;
oFirewall.WebSocket.AllowedOrigins.Add('https://www.example.com');
oFirewall.WebSocket.AllowedOrigins.Add('https://app.example.com');
// Enforce maximum frame size (bytes)
oFirewall.WebSocket.MaxFrameSize := 131072; // 128 KB
// Only allow specific subprotocols
oFirewall.WebSocket.AllowedSubProtocols.Add('graphql-ws');
oFirewall.WebSocket.AllowedSubProtocols.Add('mqtt');
Silnik reguł niestandardowych
Silnik reguł niestandardowych pozwala definiować własne reguły firewalla z warunkami i automatycznymi akcjami. Każda reguła określa próg naruszeń w oknie czasowym oraz akcję do wykonania po przekroczeniu progu.
| Właściwość | Opis |
|---|---|
| Name | Opisowa nazwa reguły |
| MinViolations | Liczba naruszeń wymagana do wyzwolenia reguły |
| TimeWindowSec | Przesuwne okno w sekundach do zliczania naruszeń |
| ActionType | Akcja do wykonania: raDeny, raAllow, raBan lub raLog |
| BanDurationSec | Czas banu gdy ActionType to raBan |
Typy akcji:
| Akcja | Zachowanie |
|---|---|
raDeny |
Rozłącz klienta natychmiast |
raAllow |
Brak akcji (reguła jest śledzona, ale nie egzekwowana) |
raBan |
Banuj IP na określony czas |
raLog |
Wyzwól tylko zdarzenie OnViolation |
var
vRule: TsgcFirewallRuleItem;
begin
oFirewall.CustomRules.Enabled := True;
vRule := TsgcFirewallRuleItem(oFirewall.CustomRules.Rules.Add);
vRule.Name := 'Block high-risk IPs';
vRule.MinViolations := 5;
vRule.TimeWindowSec := 300;
vRule.ActionType := raBan;
vRule.BanDurationSec := 3600;
end;
Statystyki w czasie rzeczywistym
Firewall udostępnia obiekt Stats z licznikami w czasie rzeczywistym dla aktywnych połączeń, całkowitej liczby zablokowanych prób i liczby na typ naruszenia. Użyj go do budowania paneli monitorowania lub logowania okresowych podsumowań.
WriteLn('Active: ', oFirewall.Stats.ActiveConnections);
WriteLn('Blocked: ', oFirewall.Stats.TotalBlocked);
WriteLn('SQL Injection: ', oFirewall.Stats.GetViolationCount(fvSQLInjection));
Trwałe bany
Domyślnie bany są przechowywane w pamięci i czyszczone po restarcie. Użyj SaveBansToFile i LoadBansFromFile, aby zachować bany po restartach serwera.
// Save bans before shutdown
oFirewall.SaveBansToFile('bans.dat');
// Restore bans on startup
oFirewall.LoadBansFromFile('bans.dat');
Tryby akcji
Moduły SQL injection, XSS i ochrony przed zalewaniem obsługują trzy konfigurowane akcje po wykryciu naruszenia:
| Akcja | Zachowanie | Przypadek użycia |
|---|---|---|
faDeny |
Zablokuj i rozłącz klienta | Serwery produkcyjne |
faLog |
Wyzwól zdarzenie OnViolation, ale zezwól na połączenie | Monitorowanie, testowanie, stopniowe wdrożenie |
faAllow |
Brak akcji | Tymczasowe wyłączenie modułu bez usuwania konfiguracji |
Wskazówka. Zacznij od faLog w produkcji, aby obserwować, jak firewall reaguje na rzeczywisty ruch, przed przejściem na faDeny. Pozwala to uniknąć blokowania prawdziwych użytkowników podczas początkowego wdrożenia.
Zdarzenia — logowanie i nadpisywanie
Zdarzenia dają ci pełny wgląd w decyzje firewalla oraz możliwość ich nadpisywania w razie potrzeby.
OnViolation — logowanie bezpieczeństwa
Wyzwalane przy każdym wykrytym naruszeniu. Użyj do zapisywania logów bezpieczeństwa, wysyłania alertów lub zasilania panelu monitorowania.
procedure TForm1.FirewallViolation(Sender: TObject;
const aIP: string;
const aViolationType: TsgcFirewallViolationType;
const aDetails: string);
begin
LogToFile(Format('[%s] Firewall: %s - %s',
[aIP, ViolationTypeToStr(aViolationType), aDetails]));
end;
Typy naruszeń obejmują:
| Typ | Wyzwalane gdy |
|---|---|
fvBlacklist |
IP znajduje się na liście blokowanych |
fvBruteForce |
Przekroczono próg nieudanych prób |
fvRateLimit |
Przekroczono limit częstotliwości połączeń |
fvFlood |
Wykryto zalewanie wiadomościami |
fvSQLInjection |
Wykryto wzorzec SQL injection |
fvXSS |
Wykryto wzorzec XSS |
fvGeoIP |
Połączenie zablokowane przez filtr krajów |
fvPathTraversal |
Wykryto wzorzec path traversal |
fvCommandInjection |
Wykryto wzorzec wstrzykiwania poleceń |
fvPayloadSize |
Wiadomość przekracza maksymalny rozmiar ładunku |
fvOrigin |
Origin WebSocket nie ma na liście dozwolonych |
fvFrameSize |
Ramka WebSocket przekracza maksymalny rozmiar |
fvThreatScore |
Wynik zagrożenia przekroczył próg automatycznego banu |
fvCustomRule |
Przekroczono próg reguły niestandardowej |
OnFiltered — nadpisywanie decyzji
Wyzwalane gdy połączenie lub wiadomość ma zostać zablokowane. Parametr Allow pozwala nadpisać decyzję firewalla w czasie wykonywania.
procedure TForm1.FirewallFiltered(Sender: TObject;
const aIP: string; const aReason: string;
var Allow: Boolean);
begin
// Override: always allow the office IP even if rate-limited
if aIP = '203.0.113.10' then
Allow := True;
end;
OnResolveCountry — niestandardowe rozpoznawanie GeoIP
Wyzwalane gdy moduł GeoIP musi rozpoznać adres IP jako kod kraju. Użyj tego, aby zaimplementować własną logikę rozpoznawania zamiast (lub oprócz) wbudowanej bazy CSV.
procedure TForm1.FirewallResolveCountry(Sender: TObject;
const aIP: string; var aCountryCode: string);
begin
aCountryCode := MyGeoIPLookup(aIP);
end;
OnThreatScoreChanged — monitorowanie wyników
Wyzwalane przy każdej zmianie wyniku zagrożenia IP. Użyj tego, aby zaimplementować niestandardowe progi, alerty lub stopniowane odpowiedzi przed osiągnięciem progu automatycznego banu.
procedure TForm1.FirewallThreatScoreChanged(Sender: TObject;
const aIP: string; const aOldScore, aNewScore: Integer);
begin
if aNewScore >= 50 then
SendAlert(Format('IP %s threat score: %d', [aIP, aNewScore]));
end;
Integracja z serwerem
Firewall działa ze wszystkimi trzema komponentami serwera. Jedna instancja firewalla może być nawet współdzielona między wieloma serwerami.
| Komponent | Opis |
|---|---|
TsgcWebSocketHTTPServer |
Serwer WebSocket + HTTP (oparty na Indy) |
TsgcWebSocketServer |
Czysty serwer WebSocket (Indy TCP) |
TsgcWebSocketServer_HTTPAPI |
Serwer WebSocket używający sterownika jądra HTTP.SYS |
Integracja jest automatyczna po przypisaniu. Firewall przechwytuje w trzech punktach:
- Przy nowym połączeniu: Sprawdza listę blokowanych, listę dozwolonych, bany, GeoIP, limity częstotliwości i origin WebSocket. Odrzuca przed zdarzeniem OnConnect jeśli zablokowane.
- Przy odebraniu wiadomości: Sprawdza SQL injection, XSS, wstrzykiwanie poleceń, path traversal, rozmiar ładunku i limity zalewania. Rozłącza klienta przy naruszeniu.
- Przy rozłączeniu: Wyrejestrowuje połączenie z wewnętrznych liczników śledzenia.
Kompletny przykład
W pełni skonfigurowany serwer WebSocket z podstawowymi modułami ochrony i włączonymi nowymi zaawansowanymi funkcjami.
uses
sgcWebSocket_Server, sgcWebSocket_Server_Firewall;
var
oFirewall: TsgcWSFirewall;
oServer: TsgcWebSocketHTTPServer;
begin
oFirewall := TsgcWSFirewall.Create(nil);
oServer := TsgcWebSocketHTTPServer.Create(nil);
Try
// IP filtering
oFirewall.Blacklist.Enabled := True;
oFirewall.Blacklist.IPs.Add('10.0.0.0/8');
oFirewall.Whitelist.Enabled := True;
oFirewall.Whitelist.IPs.Add('192.168.1.0/24');
// Brute force: ban after 3 failures in 60s, for 10 minutes
oFirewall.BruteForce.Enabled := True;
oFirewall.BruteForce.MaxAttempts := 3;
oFirewall.BruteForce.BanDurationSec := 600;
// Message security
oFirewall.SQLInjection.Enabled := True;
oFirewall.XSS.Enabled := True;
// Rate limiting and flood protection
oFirewall.RateLimit.Enabled := True;
oFirewall.RateLimit.MaxConnectionsPerIP := 5;
oFirewall.FloodProtection.Enabled := True;
oFirewall.FloodProtection.MaxMessagesPerSec := 50;
// Payload size limit
oFirewall.PayloadLimit.Enabled := True;
oFirewall.PayloadLimit.MaxSizeBytes := 65536;
// GeoIP: block specific countries
oFirewall.GeoIP.Enabled := True;
oFirewall.GeoIP.Mode := gmBlockList;
oFirewall.GeoIP.Countries.Add('CN');
oFirewall.GeoIP.Countries.Add('RU');
oFirewall.LoadGeoIPDatabase('geoip.csv');
// Threat scoring with auto-ban
oFirewall.ThreatScore.Enabled := True;
oFirewall.ThreatScore.AutoBanThreshold := 80;
oFirewall.ThreatScore.DecayPerHour := 5;
// Progressive ban escalation
oFirewall.BanEscalation.Enabled := True;
oFirewall.BanEscalation.Levels.Add('300');
oFirewall.BanEscalation.Levels.Add('3600');
oFirewall.BanEscalation.Levels.Add('86400');
oFirewall.BanEscalation.Levels.Add('0');
// Restore persistent bans
oFirewall.LoadBansFromFile('bans.dat');
// Events
oFirewall.OnViolation := FirewallViolation;
oFirewall.OnFiltered := FirewallFiltered;
oFirewall.OnThreatScoreChanged := FirewallThreatScoreChanged;
// Assign to server and start
oServer.Port := 443;
oServer.Firewall := oFirewall;
oServer.Active := True;
WriteLn('Server running with firewall protection.');
ReadLn;
// Save bans before shutdown
oFirewall.SaveBansToFile('bans.dat');
Finally
oServer.Active := False;
oServer.Free;
oFirewall.Free;
End;
end;
Bezpieczeństwo wątków
Komponent firewalla jest w pełni bezpieczny wątkowo. Wszystkie metody publiczne używają wewnętrznych sekcji krytycznych do ochrony współbieżnego dostępu do danych śledzenia. Został poddany testom obciążeniowym z 20 jednoczesnymi wątkami wykonującymi 100 000 operacji bez błędów i wycieków pamięci.
Komponent może być bezpiecznie współdzielony między wieloma instancjami serwera i dostępny z dowolnego wątku — handlery zdarzeń serwera, wątki timerów, procesy w tle — bez zewnętrznej synchronizacji.
Ważne uwagi
- Tylko wiadomości tekstowe. Wykrywanie SQL injection i XSS skanuje wiadomości tekstowe. Wiadomości binarne nie są skanowane.
- Trwałe bany. Użyj
SaveBansToFileiLoadBansFromFile, aby zachować bany po restartach serwera. Bez tych wywołań bany są przechowywane tylko w pamięci i czyszczone po restarcie. - Priorytet listy dozwolonych. IP z listy dozwolonych omijają wszystkie kontrole, w tym filtrowanie na poziomie wiadomości. Używaj ostrożnie.
- RegisterFailedAttempt. Moduł brute force wymaga wywołania
RegisterFailedAttemptz twojego handlera uwierzytelniania. Wszystko inne jest automatyczne. - Baza danych GeoIP. Załaduj bazę CSV za pomocą
LoadGeoIPDatabasedo rozpoznawania krajów lub zaimplementuj zdarzenieOnResolveCountrydla niestandardowej logiki wyszukiwania. - Zmniejszanie scoringu zagrożeń. Wyniki zmniejszają się automatycznie z czasem. Dostosuj
DecayPerHourdo wzorców ruchu — serwery o wysokim ruchu mogą korzystać z szybszego zmniejszania, aby uniknąć fałszywych alarmów. - Dostępność edycji. Komponent firewalla jest dostępny w edycjach Professional, Enterprise i All-Access sgcWebSockets.
