
Eine offene Testplattform, die HTTP/1.1-Server auf RFC 9110/9112-Anforderungen, Smuggling Vectors und die Verarbeitung fehlerhafter Eingaben überprüft. Fügen Sie Ihr Framework hinzu und erhalten Sie automatisch Compliance-Ergebnisse.
Http11Probe ist ein Compliance- und Sicherheitstester für HTTP/1.1-Server. Er sendet fehlerhafte, mehrdeutige und übergroße Anfragen über rohe TCP-Sockets an einen Server und prüft, wie dieser darauf antwortet, verglichen mit dem, was RFC 9110 und RFC 9112 tatsächlich vorschreiben. Dabei handelt es sich um die unangenehmen Fälle wie bloße LF-Zeilenenden, veraltete Zeilenfaltung, CL/TE-Request-Smuggling, Chunk-Framing-Tricks, übergroße Header und NUL-Bytes, bei denen ein strikter Parser und ein nachsichtiger Parser beginnen, sich zu widersprechen.
Dieselben 215 Tests laufen gegen 42 Referenzserver, die in 12 Sprachen geschrieben sind, von Nginx, Apache und Envoy bis hin zu Kestrel, Gin, Actix und den integrierten Servern in Node, Bun und Deno. Jedes Ergebnis wird anhand der MUST/SHOULD/MAY-Formulierungen in der Spezifikation bewertet und mit Pass, Fail oder Warn gekennzeichnet. Ein Warn bedeutet lediglich, dass die RFC sowohl das strikte als auch das nachsichtige Verhalten erlaubt, sodass keines von beiden falsch ist.
Die vollständige Dokumentation, ein Glossar pro Test mit RFC-Zitaten und die Live-Ergebnismatrix für jeden Server finden Sie unter http-probe.com.
Die Probe ist zielagnostisch. Sie testet jeden HTTP/1.1-Server, der bereits auf --host:--port lauscht, und es gibt kein Flag zur Auswahl eines Frameworks. Starten Sie zuerst den Server (oder lassen Sie probe-local.sh einen für Sie hochfahren), und richten Sie dann die Probe darauf aus.
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080
| Flag | Beschreibung | Standard |
|---|---|---|
--host | Ziel-Hostname oder IP-Adresse | localhost |
--port | Ziel-Portnummer | 8080 |
--category | Nur Tests in dieser Kategorie ausführen (Compliance, Smuggling, MalformedInput, Normalization, Cookies, Capabilities) | alle |
--test | Nur bestimmte Test-IDs ausführen, Groß-/Kleinschreibung wird nicht beachtet (wiederholbar) | alle |
--timeout | Verbindungs- und Lese-Timeout in Sekunden pro Test | 5 |
--output | JSON-Ergebnisse in Datei schreiben | keine |
--verbose, -v | Die rohe Serverantwort für jeden Test ausgeben | aus |
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080 --output results.json
Bestimmte Tests ausführen:
dotnet run --project src/Http11Probe.Cli -- --test SMUG-CL-TE-BOTH --test SMUG-DUPLICATE-CL
Die Ergebnisse werden während der Ausführung jedes Tests an die Konsole gestreamt, mit einer Zusammenfassung am Ende:
Score: 97/97 19 warnings (146 tests, 35.5s)
Die Probe sendet nur Anfragen, sie startet keine Server. Um einen der mitgelieferten Server unter src/Servers/ zu testen, verwenden Sie scripts/probe-local.sh. Es macht dasselbe wie die CI-Pipeline: das Docker-Image des Servers bauen, es auf --network host ausführen, warten, bis es hochgefahren ist, es testen und dann abbauen.
# Einen Server anhand seines Verzeichnisnamens unter src/Servers/ testen, z. B. ActixServer
scripts/probe-local.sh --server ActixServer
# Jeden mitgelieferten Server testen
scripts/probe-local.sh --all
Der Wert von --server ist der Verzeichnisname (ActixServer), nicht der Anzeigename (Actix). Wenn Ihr Docker-Daemon Root benötigt, fügen Sie --docker-sudo hinzu, damit Sie nicht das gesamte Skript mit sudo ausführen müssen:
scripts/probe-local.sh --server ActixServer --docker-sudo
| Flag | Beschreibung |
|---|---|
--server <Dir> | Einen einzelnen Server anhand seines Verzeichnisnamens unter src/Servers/ testen (z. B. NginxServer) |
--all | Jeden Server unter src/Servers/*/probe.json testen |
--port <Port> | Ziel-Port (Standard: 8080) |
--skip-build | dotnet build überspringen (setzt voraus, dass bereits ein Release-Build existiert) |
--verbose | --verbose an die CLI übergeben |
--docker-sudo | Docker-Befehle über sudo ausführen (ermöglicht das Ausführen des Skripts ohne sudo) |
-h, --help | Hilfe anzeigen |
Es schreibt probe-<ServerDir>.json (eine pro Server), plus probe-data.js und docs/static/probe/data.js für lokales Rendering. Sie benötigen jq, docker, curl, python3 und das .NET 10 SDK.
probe-local.sh ist nur ein Komfort-Wrapper. Wenn Sie es lieber von Hand machen möchten, etwa um einen Server über mehrere Probe-Läufe hinweg aktiv zu halten, bauen und starten Sie den Container selbst und richten dann die Probe darauf aus. Führen Sie diese Befehle vom Repo-Stammverzeichnis aus, da dies der Docker-Build-Kontext ist:
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
Sie können die Probe auch auf jeden HTTP/1.1-Server ausrichten, den Sie bereits laufen haben:
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 9000
Erfordert das .NET 10 SDK.
dotnet build Http11Probe.slnx
Der Probe-Workflow läuft bei Pull Requests und workflow_dispatch. Er baut das Docker-Image jedes Servers, testet es und postet eine Vergleichstabelle als PR-Kommentar.