
Une plateforme de test ouverte qui sonde les serveurs HTTP/1.1 par rapport aux exigences des RFC 9110/9112, aux vecteurs de contrebande (smuggling) et à la gestion des entrées malformées. Ajoutez votre framework, obtenez automatiquement des résultats de conformité.
Http11Probe est un testeur de conformité et de sécurité pour les serveurs HTTP/1.1. Il envoie des requêtes malformées, ambiguës et surdimensionnées à un serveur via des sockets TCP brutes et vérifie comment il répond par rapport à ce que les RFC 9110 et RFC 9112 exigent réellement. Ce sont les cas délicats comme les fins de ligne avec un simple LF, le pliage de lignes obsolète, le contournement de requête CL/TE, les astuces de tramage de chunks, les en-têtes surdimensionnés et les octets NUL, où un analyseur strict et un analyseur laxiste commencent à diverger.
Les mêmes 215 tests sont exécutés contre 41 serveurs de référence écrits dans 12 langages, de Nginx, Apache et Envoy à Kestrel, Gin, Actix, et les serveurs intégrés dans Node, Bun et Deno. Chaque résultat est noté en fonction du libellé MUST/SHOULD/MAY de la spécification et marqué Pass, Fail ou Warn. Un Warn signifie simplement que la RFC autorise à la fois le comportement strict et le comportement laxiste, donc aucun des deux n'est erroné.
Vous trouverez la documentation complète, un glossaire par test avec des citations RFC, et la matrice des résultats en direct pour chaque serveur sur http-probe.com.
La sonde est cible-agnostique. Elle teste n'importe quel serveur HTTP/1.1 déjà à l'écoute sur --host:--port, et il n'y a pas de drapeau pour choisir un framework. Démarrez d'abord le serveur (ou laissez probe-local.sh en démarrer un pour vous), puis pointez la sonde dessus.
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080
| Drapeau | Description | Défaut |
|---|---|---|
--host | Nom d'hôte ou adresse IP cible | localhost |
--port | Numéro de port cible | 8080 |
--category | Exécuter uniquement les tests de cette catégorie (Compliance, Smuggling, MalformedInput, Normalization, Cookies, Capabilities) | all |
--test | Exécuter uniquement les ID de test spécifiques, insensible à la casse (répétable) | all |
--timeout | Délai d'attente de connexion et de lecture en secondes par test | 5 |
--output | Écrire les résultats JSON dans un fichier | none |
--verbose, -v | Afficher la réponse brute du serveur pour chaque test | off |
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080 --output results.json
Exécuter des tests spécifiques :
dotnet run --project src/Http11Probe.Cli -- --test SMUG-CL-TE-BOTH --test SMUG-DUPLICATE-CL
Les résultats défilent dans la console au fur et à mesure que chaque test se termine, avec un résumé à la fin :
Score: 97/97 19 warnings (146 tests, 35.5s)
La sonde ne fait qu'envoyer des requêtes, elle ne démarre pas les serveurs. Pour sonder l'un des serveurs fournis dans src/Servers/, utilisez scripts/probe-local.sh. Il fait la même chose que le pipeline CI : construire l'image Docker du serveur, l'exécuter sur --network host, attendre qu'il soit opérationnel, le sonder, puis le démonter.
# 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
La valeur de --server est le nom du répertoire (ActixServer), pas le nom d'affichage (Actix). Si votre démon Docker nécessite les droits root, ajoutez --docker-sudo pour ne pas avoir à exécuter tout le script avec sudo :
scripts/probe-local.sh --server ActixServer --docker-sudo
| Drapeau | Description |
|---|---|
--server <Dir> | Sonder un seul serveur par son nom de répertoire sous src/Servers/ (par ex. NginxServer) |
--all | Sonder tous les serveurs sous src/Servers/*/probe.json |
--port <Port> | Port cible (par défaut : 8080) |
--skip-build | Ignorer dotnet build (suppose qu'une build Release existe déjà) |
--verbose | Passer --verbose à la CLI |
--docker-sudo | Exécuter les commandes Docker via sudo (vous permet d'exécuter le script sans sudo) |
-h, --help | Afficher l'aide |
Il écrit probe-<ServerDir>.json (un par serveur), plus probe-data.js et docs/static/probe/data.js pour le rendu local. Vous aurez besoin de jq, docker, curl, python3 et du SDK .NET 10.
probe-local.sh n'est qu'un wrapper de commodité. Si vous préférez le faire à la main, par exemple pour garder un serveur actif pendant plusieurs exécutions de sondage, construisez et exécutez le conteneur vous-même, puis pointez la sonde dessus. Exécutez ces commandes depuis la racine du dépôt, car c'est le contexte de construction 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
Vous pouvez également pointer la sonde vers n'importe quel serveur HTTP/1.1 déjà en cours d'exécution :
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 9000
Nécessite le SDK .NET 10.
dotnet build Http11Probe.slnx
Le workflow Probe s'exécute sur les pull requests et workflow_dispatch. Il construit l'image Docker de chaque serveur, le sonde, et publie un tableau de comparaison en tant que commentaire de PR.