セキュリティはもはやオプションではありません。インターネットに公開されたすべての WebSocket サーバーは、ブルートフォース攻撃、インジェクション試行、接続フラッディング、自動化された悪用の標的になります。これらの脅威に対処するには通常、外部ミドルウェアの追加、カスタムフィルタリングロジックの記述、または別のリバースプロキシのデプロイが必要で、いずれも複雑さを増し開発を遅らせます。
sgcWebSockets 2026.4.0 では TsgcWSFirewall を導入します。これは WebSocket サーバーに直接組み込める専用ファイアウォールコンポーネントであり、GeoIP 国フィルタリング、適応型脅威スコアリング、プログレッシブ BAN エスカレーション、カスタムルールエンジンなど 15 の保護モジュールを備えています。コンポーネントをドロップして必要な保護モジュールを設定し、サーバーに割り当てるだけでアプリケーションが保護されます。外部依存なし、ミドルウェアなし、一般的なケースではカスタムコード不要です。
この記事では完全な機能セットを説明し、Delphi で各保護モジュールを設定する方法を示します。
15 の保護モジュール、1 つのコンポーネント
The firewall provides fifteen independent protection modules. Enable only what you need — each module works on its own or in combination with the others.
|
IP ブラックリスト 特定の IP アドレスまたは CIDR 表記の範囲全体をブロックします。ブラックリスト登録された IP からの接続はアプリケーションコードに到達する前に拒否されます。 |
IP ホワイトリスト 信頼できる IP のリストを定義します。有効にすると、ホワイトリスト登録されたアドレスは他のすべてのセキュリティチェックをバイパスします。内部サービスや監視ツールに最適です。 |
ブルートフォース保護 IP ごとの認証失敗試行を追跡します。スライディングタイムウィンドウ内で設定可能なしきい値を超えた違反者を自動的に BAN します。 |
|
SQL インジェクション検知 受信メッセージの一般的な SQL インジェクションパターンをスキャンします。ブール値インジェクション、UNION SELECT、ステートメントインジェクションなどの組み込み検知機能を備えています。 |
XSS 検知 メッセージ内のクロスサイトスクリプティングペイロードを検知します。スクリプトタグ、イベントハンドラー、JavaScript プロトコル URI、iframe インジェクション、CSS 式をキャッチします。 |
接続レート制限 IP アドレスごとの同時接続数を制限します。単一クライアントがサーバーリソースを枯渇させるのを防ぎます。 |
|
メッセージフラッド保護 単一 IP が 1 秒間に送信できるメッセージ数を制限します。メッセージフラッディングとサービス拒否パターンから保護します。 |
ペイロードサイズ制限 最大サイズしきい値を超えるメッセージを拒否します。過大なペイロードによるメモリ枯渇を防ぎます。 |
パストラバーサル検知 メッセージ内のディレクトリトラバーサルシーケンスを検知します。意図したスコープ外のファイルへのアクセス試行をブロックします。 |
|
コマンドインジェクション検知 メッセージ内の OS コマンドインジェクションパターンを検知します。シェルメタキャラクターと一般的なコマンドシーケンスをブロックします。 |
GeoIP 国フィルタリング 地理的な発信元に基づいて接続を許可またはブロックします。CSV データベース検索によるブロックリストおよびアローリストモードをサポートします。 |
脅威スコアシステム すべての違反タイプにわたって IP ごとに重み付きスコアを累積します。しきい値に達すると自動 BAN し、時間とともに自動的に減衰します。 |
|
プログレッシブ BAN エスカレーション 繰り返しの違反ごとに BAN 期間を延長します。短期 BAN から執拗な違反者への永久ブロックまでエスカレートします。 |
WebSocket 保護 WebSocket オリジンを検証し、フレームサイズ制限を適用し、サブプロトコルをフィルタリングします。メッセージコンテンツを超えたプロトコルレベルの保護を提供します。 |
カスタムルールエンジン 条件とアクションを持つ独自のファイアウォールルールを定義します。違反しきい値、タイムウィンドウ、自動応答を作成できます。 |
クイックスタート
ファイアウォールの起動と実行に必要なのはわずか 3 ステップです。作成、設定、割り当てです。
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;
割り当て後、ファイアウォールは自動的に統合されます。接続はイベントハンドラーに到達する前にチェックされ、メッセージはリアルタイムでスキャンされ、切断されたクライアントはトラッキングから登録解除されます。イベント処理コードを 1 行も書く必要はありません。
IP ブラックリスト & ホワイトリスト
ブラックリストは特定の IP または範囲からの接続を拒否します。ホワイトリストはその逆で、メッセージフィルタリングを含むすべての他のチェックをバイパスする信頼済みアドレスセットを定義します。
両方とも正確な IP アドレスと範囲ベースのフィルタリング用の CIDR 表記をサポートします。
// 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
優先順位。ホワイトリストが有効な場合、最初にチェックされます。IP が一致すると、接続は即座に許可され、ブラックリスト、BAN、レート制限、メッセージフィルターはすべてスキップされます。
ブルートフォース保護
ブルートフォースモジュールは、スライディングタイムウィンドウを使用して IP ごとの認証失敗試行を追跡します。IP がウィンドウ内で最大試行回数を超えると、設定可能な期間だけ自動的に BAN されます。
| プロパティ | デフォルト | 説明 |
|---|---|---|
| MaxAttempts | 5 | BAN 前の失敗試行回数 |
| TimeWindowSec | 60 | 試行カウント用のスライディングウィンドウ(秒) |
| BanDurationSec | 300 | BAN 期間(秒)。0 は永久 BAN |
// 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;
ファイアウォールが残りを自動的に処理します。試行をカウントし、タイムウィンドウをチェックし、しきい値に達すると IP を BAN します。BAN された IP はそれ以上の処理の前に接続レベルで拒否されます。
手動 BAN 管理
自動 BAN に加えて、いつでもプログラムで BAN を管理できます。
// 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;
SQL インジェクション検知
SQL インジェクションモジュールは受信するすべてのテキストメッセージに対して一般的な攻撃パターンをスキャンします。一致が検知されると、設定可能なアクションが応答を決定します。クライアントをブロック、イベントをログ、または通過させます。
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(');
組み込みパターン
検知器は最も一般的な SQL インジェクション手法に対して大文字小文字を区別しないチェックを含んでいます。
- ' OR '、' AND ' — ブール値インジェクション
- UNION SELECT — ユニオンベースのインジェクション
- '; DROP、'; DELETE、'; INSERT、'; UPDATE — ステートメントインジェクション
- EXEC(、EXECUTE( — コマンド実行
- xp_cmdshell — 拡張ストアドプロシージャ
- CAST(、CONVERT( — 型変換の悪用
- 1=1、1'='1 — 恒真式インジェクション
XSS 検知
XSS モジュールは WebSocket メッセージ内のクロスサイトスクリプティングペイロードを、アプリケーションロジックに到達したり他のクライアントに中継されたりする前に検知します。
oFirewall.XSS.Enabled := True;
oFirewall.XSS.Action := faDeny;
バイルトイン検知の対象:
- <script>、javascript: — スクリプトインジェクション
- onerror=、onload=、onclick=、onmouseover= — イベントハンドラーインジェクション
- eval(、document.cookie — JavaScript 評価と Cookie 盗取
- <iframe> — 要素インジェクション
- <svg>、expression( — SVG と CSS 式攻撃
接続レート制限
単一 IP アドレスが保持できる同時接続数を制限します。悪意あるものか設定ミスかを問わず、過度な接続を開くクライアントによるリソース枯渇を防ぎます。
// Allow up to 5 concurrent connections per IP
oFirewall.RateLimit.Enabled := True;
oFirewall.RateLimit.MaxConnectionsPerIP := 5;
oFirewall.RateLimit.TimeWindowSec := 60;
接続トラッキングは完全に自動です。ファイアウォールは接続時にカウンターをインクリメントし、切断時にデクリメントします。新しい接続が制限を超える場合、サーバーの OnConnect イベントが発火する前に拒否されます。
メッセージフラッド保護
単一 IP が 1 秒間に送信できるメッセージ数を制限します。クライアントがサーバーや他の接続クライアントを圧倒するために素早くメッセージを送信するサービス拒否パターンから保護します。
// Limit to 50 messages per second per IP
oFirewall.FloodProtection.Enabled := True;
oFirewall.FloodProtection.MaxMessagesPerSec := 50;
oFirewall.FloodProtection.Action := faDeny; // Disconnect offender
ペイロードサイズ制限
サーバーメモリを枯渇させる可能性のある過大なペイロードをクライアントが送信するのを防ぐため、最大メッセージサイズを適用します。しきい値を超えるメッセージは処理前に拒否されます。
oFirewall.PayloadLimit.Enabled := True;
oFirewall.PayloadLimit.MaxSizeBytes := 65536; // 64 KB max
oFirewall.PayloadLimit.Action := faDeny;
パストラバーサル検知
パストラバーサルモジュールは、意図したスコープ外のファイルへのアクセスを試みるディレクトリトラバーサルシーケンスを受信メッセージからスキャンします。クライアントメッセージからファイルパスやリソース識別子を処理するアプリケーションに重要です。
バイルトイン検知の対象:
- ../、..\ — 相対パストラバーサル
- %2e%2e、%252e — URL エンコードされたトラバーサル
- /etc/passwd、/etc/shadow — Unix システムファイルアクセス
- cmd.exe、boot.ini — Windows システムファイルアクセス
oFirewall.PathTraversal.Enabled := True;
oFirewall.PathTraversal.Action := faDeny;
コマンドインジェクション検知
コマンドインジェクションモジュールはメッセージ内の OS コマンドインジェクションパターンを検知します。任意のシステムコマンドを実行するために使用されるシェルメタキャラクターと一般的なコマンドシーケンスをキャッチします。
バイルトイン検知の対象:
- ; |、&&、|| — シェルコマンドチェーニング
- $(command)、`command` — コマンド置換
- wget、curl、nc、netcat — ネットワークユーティリティ呼び出し
- /bin/sh、/bin/bash、cmd /c — シェルスポーニング
oFirewall.CommandInjection.Enabled := True;
oFirewall.CommandInjection.Action := faDeny;
GeoIP 国フィルタリング
IP から国への解決を使用して、地理的な発信元に基づいて接続をフィルタリングします。GeoIP モジュールは 2 つのモードをサポートします。BlockList(特定の国をブロックし、それ以外を許可)と AllowList(特定の国のみ許可し、それ以外をブロック)です。
| プロパティ | 説明 |
|---|---|
| Mode | gmBlockList または gmAllowList |
| Countries | ISO 3166-1 alpha-2 国コード(例:US、GB、DE) |
| DatabaseFile | IP から国への解決用 CSV ファイルのパス |
特定の国をブロック
oFirewall.GeoIP.Enabled := True;
oFirewall.GeoIP.Mode := gmBlockList;
oFirewall.GeoIP.Countries.Add('CN');
oFirewall.GeoIP.Countries.Add('RU');
oFirewall.LoadGeoIPDatabase('geoip.csv');
特定の国のみ許可
// 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');
GeoIP データベース。DB-IP や IP2Location などのプロバイダーから無料の IP 対国 CSV データベースを入手できます。あるいは OnResolveCountry イベントを実装して独自の解決ロジックを使用することもできます。
脅威スコアシステム
脅威スコアシステムは各違反タイプに重み付きポイントを割り当て、IP アドレスごとにスコアを累積します。スコアが自動 BAN しきい値を超えると、IP は自動的に BAN されます。スコアは時間とともに減衰するため、一度きりの出来事で永久ペナルティにはなりません。
| プロパティ | デフォルト | 説明 |
|---|---|---|
| AutoBanThreshold | 100 | IP が自動 BAN されるスコア |
| DecayPerHour | 10 | 非アクティブ 1 時間あたりの減算ポイント |
oFirewall.ThreatScore.Enabled := True;
oFirewall.ThreatScore.AutoBanThreshold := 80;
oFirewall.ThreatScore.DecayPerHour := 5;
スコア変更の監視
OnThreatScoreChanged イベントを使用してスコアをリアルタイムで監視し、自動 BAN しきい値に達する前にカスタムアクションを実行します。
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;
プログレッシブ BAN エスカレーション
固定された BAN 期間の代わりに、エスカレーションモジュールは繰り返しの違反ごとに BAN 期間を延長します。初回違反者は短期 BAN を受け、執拗な違反者は永久ブロックまでエスカレートされます。
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
ヒント。最大の効果を得るためにプログレッシブエスカレーションと脅威スコアシステムを組み合わせます。脅威スコアは複数の違反タイプにわたる悪意ある行為者を特定し、エスカレーションにより繰り返し違反者が次第に厳しい結果に直面することを確保します。
WebSocket 固有の保護
メッセージレベルのスキャンに加えて、ファイアウォールは WebSocket 接続に固有のプロトコルレベルの保護を提供します。オリジン検証、フレームサイズ適用、サブプロトコルフィルタリングです。
// 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');
カスタムルールエンジン
カスタムルールエンジンを使用すると、条件と自動アクションを持つ独自のファイアウォールルールを定義できます。各ルールはタイムウィンドウ内の違反しきい値と、しきい値を超えたときに実行するアクションを指定します。
| プロパティ | 説明 |
|---|---|
| Name | ルールの説明的な名前 |
| MinViolations | ルールをトリガーするために必要な違反数 |
| TimeWindowSec | 違反カウント用のスライディングウィンドウ(秒) |
| ActionType | 実行するアクション: raDeny、raAllow、raBan、または raLog |
| BanDurationSec | ActionType が raBan の場合の BAN 期間 |
アクションタイプ:
| アクション | 動作 |
|---|---|
raDeny |
クライアントを即座に切断します |
raAllow |
アクションなし(ルールは追跡されますが適用されません) |
raBan |
指定された期間だけ IP を BAN します |
raLog |
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;
リアルタイム統計
ファイアウォールはアクティブ接続、ブロックされた試行の合計、違反タイプ別カウントのリアルタイムカウンターを持つ Stats オブジェクトを公開します。監視ダッシュボードの構築や定期的なサマリーのログに使用できます。
WriteLn('Active: ', oFirewall.Stats.ActiveConnections);
WriteLn('Blocked: ', oFirewall.Stats.TotalBlocked);
WriteLn('SQL Injection: ', oFirewall.Stats.GetViolationCount(fvSQLInjection));
BAN の永続化
デフォルトでは、BAN はメモリに保存され、再起動時にクリアされます。サーバー再起動後も BAN を永続化するには SaveBansToFile と LoadBansFromFile を使用します。
// Save bans before shutdown
oFirewall.SaveBansToFile('bans.dat');
// Restore bans on startup
oFirewall.LoadBansFromFile('bans.dat');
アクションモード
SQL インジェクション、XSS、フラッド保護モジュールは違反が検知されたときの 3 つの設定可能なアクションをサポートします。
| アクション | 動作 | ユースケース |
|---|---|---|
faDeny |
クライアントをブロックして切断します | 本番サーバー |
faLog |
OnViolation イベントを発火しますが接続は許可します | 監視、テスト、段階的なロールアウト |
faAllow |
アクションなし | 設定を削除せずにモジュールを一時的に無効化 |
ヒント。本番環境では最初に faLog を使用して faDeny に切り替える前に実際のトラフィックに対するファイアウォールの反応を観察します。これにより初期デプロイメント中に正規ユーザーをブロックするのを防ぎます。
イベント — ログ & オーバーライド
イベントによりファイアウォールの判定を完全に可視化し、必要に応じてオーバーライドできます。
OnViolation — セキュリティログ
違反が検知されるたびに発火します。セキュリティログの書き込み、アラートの送信、監視ダッシュボードへのフィードに使用します。
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;
違反タイプには以下が含まれます。
| タイプ | 発火条件 |
|---|---|
fvBlacklist |
IP がブラックリストにある |
fvBruteForce |
失敗試行しきい値を超過 |
fvRateLimit |
接続レート制限を超過 |
fvFlood |
メッセージフラッドを検知 |
fvSQLInjection |
SQL インジェクションパターンを検知 |
fvXSS |
XSS パターンを検知 |
fvGeoIP |
国フィルターにより接続をブロック |
fvPathTraversal |
パストラバーサルパターンを検知 |
fvCommandInjection |
コマンドインジェクションパターンを検知 |
fvPayloadSize |
メッセージが最大ペイロードサイズを超過 |
fvOrigin |
WebSocket オリジンが許可リストにない |
fvFrameSize |
WebSocket フレームが最大サイズを超過 |
fvThreatScore |
脅威スコアが自動 BAN しきい値を超過 |
fvCustomRule |
カスタムルールしきい値を超過 |
OnFiltered — 判定のオーバーライド
接続またはメッセージがブロックされようとしているときに発火します。Allow パラメーターにより実行時にファイアウォールの判定をオーバーライドできます。
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 — カスタム GeoIP 解決
GeoIP モジュールが IP アドレスを国コードに解決する必要があるときに発火します。組み込み CSV データベースの代わりに(またはそれに加えて)独自の解決ロジックを実装するために使用します。
procedure TForm1.FirewallResolveCountry(Sender: TObject;
const aIP: string; var aCountryCode: string);
begin
aCountryCode := MyGeoIPLookup(aIP);
end;
OnThreatScoreChanged — スコア監視
IP の脅威スコアが変化するたびに発火します。自動 BAN しきい値に達する前にカスタムしきい値、アラート、段階的な応答を実装するために使用します。
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;
サーバー統合
ファイアウォールはすべての 3 つのサーバーコンポーネントで動作します。単一のファイアウォールインスタンスを複数のサーバーで共有することもできます。
| コンポーネント | 説明 |
|---|---|
TsgcWebSocketHTTPServer |
WebSocket + HTTP サーバー(Indy ベース) |
TsgcWebSocketServer |
純粋な WebSocket サーバー(Indy TCP) |
TsgcWebSocketServer_HTTPAPI |
HTTP.SYS カーネルドライバーを使用する WebSocket サーバー |
割り当て後、統合は自動的に行われます。ファイアウォールは 3 つのポイントでインターセプトします。
- 新規接続時: ブラックリスト、ホワイトリスト、BAN、GeoIP、レート制限、WebSocket オリジンをチェックします。ブロックされた場合は OnConnect イベントの前に拒否します。
- メッセージ受信時: SQL インジェクション、XSS、コマンドインジェクション、パストラバーサル、ペイロードサイズ、フラッド制限をチェックします。違反時はクライアントを切断します。
- 切断時: 内部トラッキングカウンターから接続を登録解除します。
完全な例
コア保護モジュールと新しい高度な機能を有効にした完全に設定された WebSocket サーバーです。
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;
スレッドセーフ
ファイアウォールコンポーネントは完全にスレッドセーフです。すべてのパブリックメソッドは内部クリティカルセクションを使用してトラッキングデータへの同時アクセスを保護します。20 の並行スレッドで 100,000 回の操作を行い、エラーゼロ、メモリリークゼロでストレステスト済みです。
コンポーネントは外部同期なしに複数のサーバーインスタンス間で安全に共有でき、任意のスレッド(サーバーイベントハンドラー、タイマースレッド、バックグラウンドワーカー)からアクセスできます。
重要な注意事項
- テキストメッセージのみ。SQL インジェクションと XSS 検知はテキストメッセージをスキャンします。バイナリメッセージはスキャンされません。
- 永続 BAN。サーバー再起動後も BAN を永続化するには
SaveBansToFileとLoadBansFromFileを使用します。これらの呼び出しがない場合、BAN はメモリにのみ保存され、再起動時にクリアされます。 - ホワイトリスト優先。ホワイトリスト登録された IP は、メッセージレベルのフィルタリングを含むすべてのチェックをバイパスします。慎重に使用してください。
- RegisterFailedAttempt。ブルートフォースモジュールでは認証ハンドラーから
RegisterFailedAttemptを呼び出す必要があります。それ以外はすべて自動です。 - GeoIP データベース。国解決のために
LoadGeoIPDatabaseで CSV データベースを読み込むか、カスタム検索ロジックのためにOnResolveCountryイベントを実装します。 - 脅威スコア減衰。スコアは時間とともに自動的に減少します。トラフィックパターンに合わせて
DecayPerHourを調整します。高トラフィックサーバーでは誤検知を避けるために速い減衰が有効な場合があります。 - エディション対応。ファイアウォールコンポーネントは sgcWebSockets の Professional、Enterprise、All-Access エディションで利用可能です。
