Http11Probe 是一个针对 HTTP/1.1 服务器的合规性与安全性测试工具。它通过原始 TCP 套接字向服务器发送畸形、歧义和超大请求,并依据 RFC 9110 和 RFC 9112 的实际要求检查服务器的响应。这些都是一些棘手的情况,比如裸 LF 行结尾、过时的行折叠、CL/TE 请求走私、分块框架技巧、超大头部以及 NUL 字节,在这些情况下,严格解析器和宽松解析器开始产生分歧。
同样的 215 项测试针对用 12 种语言编写的 42 个参考服务器运行,从 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) | 全部 |
--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/ 下的某个捆绑服务器,请使用 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
| 标志 | 描述 |
|---|---|
--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 | 显示帮助 |
它会写入 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_dispatch 上运行。它构建每个服务器的 Docker 镜像,探测它,并将比较表作为 PR 评论发布。