
HTTP/1.1 서버를 RFC 9110/9112 요구사항, 스머글링 벡터, 잘못된 입력 처리에 대해 검사하는 오픈 테스트 플랫폼입니다. 프레임워크를 추가하면 자동으로 규정 준수 결과를 얻을 수 있습니다.
Http11Probe는 HTTP/1.1 서버를 위한 규정 준수 및 보안 테스터입니다. 원시 TCP 소켓을 통해 서버에 잘못된 형식의, 모호한, 그리고 과도하게 큰 요청을 보내고, RFC 9110과 RFC 9112가 실제로 요구하는 사항에 비추어 서버가 어떻게 응답하는지 확인합니다. 이는 bare LF 줄 바꿈, 구식 줄 접기(obsolete line folding), CL/TE 요청 스머글링, 청크 프레이밍 트릭, 과도하게 큰 헤더, NUL 바이트와 같이 엄격한 파서와 관대한 파서가 서로 의견을 달리하기 시작하는 까다로운 사례들입니다.
동일한 215개의 테스트가 12개 언어로 작성된 42개의 참조 서버에 대해 실행됩니다. 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
| 플래그 | 설명 | 기본값 |
|---|---|---|
--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에서 실행하고, 서버가 올라올 때까지 기다린 다음, 프로빙하고, 정리합니다.
# src/Servers/ 아래의 디렉터리 이름으로 서버 하나를 프로빙, 예: ActixServer
scripts/probe-local.sh --server ActixServer
# 번들로 제공되는 모든 서버를 프로빙
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 | CLI에 --verbose 전달 |
--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 댓글로 게시합니다.