
Http11Probeは、HTTP/1.1サーバー向けのコンプライアンスおよびセキュリティテスターです。生のTCPソケットを介して不正な形式、曖昧、または過大なリクエストをサーバーに送信し、RFC 9110およびRFC 9112が実際に要求する内容に対してどのように応答するかを確認します。これらは、裸のLF改行、廃止された行折り畳み、CL/TEリクエストスマグリング、チャンクフレーミングのトリック、過大なヘッダー、NULバイトなど、厳格なパーサーと寛容なパーサーが意見を異にし始める厄介なケースです。
同じ215のテストが、Nginx、Apache、EnvoyからKestrel、Gin、Actix、そしてNode、Bun、Denoの組み込みサーバーまで、12言語で書かれた42のリファレンスサーバーに対して実行されます。すべての結果は、仕様のMUST/SHOULD/MAYの文言に照らして採点され、Pass、Fail、またはWarnとしてマークされます。Warnは、RFCが厳格な動作と寛容な動作の両方を許可しているため、どちらも間違いではないことを意味するだけです。
完全なドキュメント、RFC引用付きのテストごとの用語集、およびすべてのサーバーのライブ結果マトリックスは、http-probe.comで確認できます。
プローブはターゲット非依存です。--host:--portで既にリッスンしているHTTP/1.1サーバーをテストし、フレームワークを選択するフラグはありません。まずサーバーを起動し(またはprobe-local.shに起動させて)、プローブをそれに向けます。
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080
| フラグ | 説明 | デフォルト |
|---|---|---|
--host | ターゲットのホスト名またはIPアドレス | localhost |
--port | ターゲットのポート番号 | 8080 |
--category | このカテゴリのテストのみを実行(Compliance、Smuggling、MalformedInput、Normalization、Cookies、Capabilities) | すべて |
--test | 特定のテストIDのみを実行、大文字小文字を区別しない(繰り返し可能) | すべて |
--timeout | テストごとの接続および読み取りタイムアウト(秒) | 5 |
--output | JSON結果をファイルに書き込む | なし |
--verbose、-v | 各テストの生のサーバー応答を出力 | オフ |
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080 --output results.json
特定のテストを実行:
dotnet run --project src/Http11Probe.Cli -- --test SMUG-CL-TE-BOTH --test SMUG-DUPLICATE-CL
各テストが完了すると結果がコンソールにストリーミングされ、最後にサマリーが表示されます:
Score: 97/97 19 warnings (146 tests, 35.5s)
プローブはリクエストを送信するだけで、サーバーを起動しません。src/Servers/の下にあるバンドルされたサーバーの1つをプローブするには、scripts/probe-local.shを使用します。これはCIパイプラインと同じことを行います:サーバーのDockerイメージをビルドし、--network hostで実行し、起動を待ち、プローブし、その後削除します。
# src/Servers/ 下のディレクトリ名で1つのサーバーをプローブ、例:ActixServer
scripts/probe-local.sh --server ActixServer
# すべてのバンドルされたサーバーをプローブ
scripts/probe-local.sh --all
--serverの値はディレクトリ名(ActixServer)であり、表示名(Actix)ではありません。Dockerデーモンにrootが必要な場合は、--docker-sudoを追加して、スクリプト全体をsudoで実行する必要がないようにします:
scripts/probe-local.sh --server ActixServer --docker-sudo
| フラグ | 説明 |
|---|---|
--server <Dir> | src/Servers/下のディレクトリ名で単一のサーバーをプローブ(例:NginxServer) |
--all | src/Servers/*/probe.json下のすべてのサーバーをプローブ |
--port <Port> | ターゲットポート(デフォルト:8080) |
--skip-build | dotnet buildをスキップ(Releaseビルドが既に存在することを前提とする) |
--verbose | CLIに--verboseを渡す |
--docker-sudo | sudo経由でDockerコマンドを実行(sudoなしでスクリプトを実行可能) |
-h、--help | ヘルプを表示 |
probe-<ServerDir>.json(サーバーごとに1つ)、およびローカルレンダリング用のprobe-data.jsとdocs/static/probe/data.jsを書き込みます。jq、docker、curl、python3、および.NET 10 SDKが必要です。
probe-local.shは単なる便利なラッパーです。手動で行いたい場合、たとえば複数のプローブ実行にわたってサーバーを起動したままにする場合は、自分でコンテナをビルドして実行し、プローブをそれに向けます。これらはDockerビルドコンテキストであるため、リポジトリルートから実行してください:
docker build -t probe-actix -f src/Servers/ActixServer/Dockerfile .
docker run -d --name probe-target --network host probe-actix
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080
docker rm -f probe-target
既に実行中の任意のHTTP/1.1サーバーにプローブを向けることもできます:
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 9000
.NET 10 SDKが必要です。
dotnet build Http11Probe.slnx
Probeワークフローは、プルリクエストとworkflow_dispatchで実行されます。各サーバーのDockerイメージをビルドし、プローブし、比較表をPRコメントとして投稿します。