
Http11ProbeはHTTP/1.1サーバー向けのコンプライアンスおよびセキュリティテスターです。生のTCPソケットを介して、不正な形式、あいまい、または巨大なリクエストをサーバーに送信し、RFC 9110およびRFC 9112が実際に要求する応答をチェックします。これらは、厳格なパーサーと緩和なパーサーが一致しなくなる厄介なケースです。例えば、単純なLF行末、廃止された行折り返し、CL/TEリクエストスマグリング、チャンクフレーミングのトリック、巨大なヘッダー、NULバイトなどがあります。
同じ215のテストが、12の言語で書かれた41のリファレンスサーバー(Nginx、Apache、EnvoyからKestrel、Gin、Actix、そしてNode、Bun、Denoの組み込みサーバーまで)に対して実行されます。各結果は、仕様の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
| Flag | Description | Default |
|---|
--host | 対象のホスト名またはIPアドレス | localhost |
--port | 対象のポート番号 | 8080 |
--category | このカテゴリのテストのみ実行(Compliance、Smuggling、MalformedInput、Normalization、Cookies、Capabilities) | all |
--test | 特定のテストIDのみ実行(大文字小文字を区別せず、繰り返し指定可) | all |
--timeout | テストあたりの接続および読み取りタイムアウト(秒) | 5 |
--output | JSON結果をファイルに書き出す | none |
--verbose, -v | 各テストの生のサーバー応答を表示 | off |
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 で実行し、起動を待ち、プローブし、その後停止します。
# Probe one server by its directory name under src/Servers/, e.g. ActixServer
scripts/probe-local.sh --server ActixServer
# Probe every bundled server
scripts/probe-local.sh --all
--server の値はディレクトリ名(ActixServer)であり、表示名(Actix)ではありません。Dockerデーモンがrootを必要とする場合、スクリプト全体を sudo で実行しなくても済むように --docker-sudo を追加してください:
scripts/probe-local.sh --server ActixServer --docker-sudo
| Flag | Description |
|---|---|
--server <Dir> | src/Servers/ 以下のディレクトリ名で1つのサーバーをプローブする(例:NginxServer) |
--all | src/Servers/*/probe.json のすべてのサーバーをプローブする |
--port <Port> | 対象ポート(デフォルト:8080) |
--skip-build | dotnet build をスキップする(Releaseビルドが既に存在することを前提とする) |
--verbose | CLIに --verbose を渡す |
--docker-sudo | Dockerコマンドを sudo 経由で実行する(スクリプトを 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コメントとして投稿します。