sgcWebSockets サーバー向けファイアウォール

· コンポーネント

セキュリティはもはやオプションではありません。インターネットに公開されたすべての 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 インジェクション手法に対して大文字小文字を区別しないチェックを含んでいます。

XSS 検知

XSS モジュールは WebSocket メッセージ内のクロスサイトスクリプティングペイロードを、アプリケーションロジックに到達したり他のクライアントに中継されたりする前に検知します。

oFirewall.XSS.Enabled := True;
oFirewall.XSS.Action := faDeny;

バイルトイン検知の対象:

接続レート制限

単一 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;

パストラバーサル検知

パストラバーサルモジュールは、意図したスコープ外のファイルへのアクセスを試みるディレクトリトラバーサルシーケンスを受信メッセージからスキャンします。クライアントメッセージからファイルパスやリソース識別子を処理するアプリケーションに重要です。

バイルトイン検知の対象:

oFirewall.PathTraversal.Enabled := True;
oFirewall.PathTraversal.Action := faDeny;

コマンドインジェクション検知

コマンドインジェクションモジュールはメッセージ内の OS コマンドインジェクションパターンを検知します。任意のシステムコマンドを実行するために使用されるシェルメタキャラクターと一般的なコマンドシーケンスをキャッチします。

バイルトイン検知の対象:

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 実行するアクション: raDenyraAllowraBan、または 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 を永続化するには SaveBansToFileLoadBansFromFile を使用します。

// 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 つのポイントでインターセプトします。

完全な例

コア保護モジュールと新しい高度な機能を有効にした完全に設定された 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 回の操作を行い、エラーゼロ、メモリリークゼロでストレステスト済みです。

コンポーネントは外部同期なしに複数のサーバーインスタンス間で安全に共有でき、任意のスレッド(サーバーイベントハンドラー、タイマースレッド、バックグラウンドワーカー)からアクセスできます。

重要な注意事項