Http11Probe 是一个用于 HTTP/1.1 服务器的合规性和安全性测试工具。它通过原始 TCP 套接字向服务器发送畸形、歧义和超大的请求,并根据 RFC 9110 和 RFC 9112 的实际要求检查服务器的响应。这些是严格的解析器和宽松的解析器开始产生分歧的棘手情况,如裸换行符、过时的行折叠、CL/TE 请求走私、分块帧技巧、超大头部和 NUL 字节。
同样的 215 项测试针对用 12 种语言编写的 41 个参考服务器运行,从 Nginx、Apache、Envoy 到 Kestrel、Gin、Actix,以及 Node、Bun 和 Deno 中的内置服务器。每个结果根据规范中的 MUST/SHOULD/MAY 措辞进行评分,并标记为 Pass、Fail 或 Warn。Warn 仅表示 RFC 允许严格和宽松的行为,因此两者都不算错误。
您可以在 http-probe.com 找到完整的文档、包含 RFC 引用的每项测试词汇表以及每个服务器的实时结果矩阵。
该探测器与目标无关。它会测试已在 --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) | 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/ 下的一个捆绑服务器,请使用 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 权限,请添加 --docker-sudo,这样您就不必使用 sudo 运行整个脚本:
scripts/probe-local.sh --server ActixServer --docker-sudo
它会写入 probe-<ServerDir>.json(每个服务器一个),以及 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 在拉取请求和 workflow_dispatch 上运行。它会构建每个服务器的 Docker 镜像,探测它,并以 PR 评论的形式发布比较表格。
| 标志 | 描述 |
|---|
--server <Dir> | 通过目录名探测单个服务器,位于 src/Servers/ 下(例如 NginxServer) |
--all | 探测 src/Servers/*/probe.json 下的每个服务器 |
--port <Port> | 目标端口(默认:8080) |
--skip-build | 跳过 dotnet build(假设已存在 Release 构建) |
--verbose | 将 --verbose 传递给 CLI |
--docker-sudo | 通过 sudo 运行 Docker 命令(允许你在不使用 sudo 的情况下运行脚本) |
-h, --help | 显示帮助 |