
HTTP/1.1 서버를 RFC 9110/9112 요구사항, 스머글링 벡터, 잘못된 입력 처리에 대해 검사하는 오픈 테스트 플랫폼입니다. 프레임워크를 추가하면 자동으로 규정 준수 결과를 얻을 수 있습니다.
Http11Probe는 HTTP/1.1 서버를 위한 규정 준수 및 보안 테스트 도구입니다. 원시 TCP 소켓을 통해 서버에 잘못된 형식, 모호한, 또는 지나치게 큰 요청을 보내고, RFC 9110 및 RFC 9112가 실제로 요구하는 대로 응답하는지 확인합니다. 이는 단순 LF 줄 끝, 구식 줄 접기, CL/TE 요청 밀수, 청크 프레임 기술, 지나치게 큰 헤더, NUL 바이트 등 엄격한 파서와 느슨한 파서가 의견을 달리하기 시작하는 까다로운 사례들입니다.
동일한 215개 테스트가 Nginx, Apache, Envoy에서 Kestrel, Gin, Actix, 그리고 Node, Bun, Deno에 내장된 서버에 이르기까지 12개 언어로 작성된 41개의 참조 서버에 대해 실행됩니다. 모든 결과는 사양의 MUST/SHOULD/MAY 표현에 따라 점수가 매겨지며 Pass, Fail, Warn으로 표시됩니다. Warn은 RFC가 엄격한 동작과 느슨한 동작을 모두 허용하므로 어느 쪽도 틀리지 않음을 의미합니다.
전체 문서, RFD 인용이 포함된 테스트별 용어집, 그리고 모든 서버의 실시간 결과 매트릭스는 http-probe.com에서 확인할 수 있습니다.
이 프로브는 대상에 구애받지 않습니다. 이미 --host:--port에서 수신 대기 중인 모든 HTTP/1.1 서버를 테스트하며, 프레임워크를 선택하는 플래그는 없습니다. 먼저 서버를 시작하거나 (또는 probe-local.sh가 자동으로 시작하게 한 다음) 프로브를 해당 서버로 지정하세요.
dotnet run --project src/Http11Probe.Cli -- --host localhost --port 8080
| Flag | 설명 | 기본값 |
|---|
--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 값은 디스플레이 이름(Actix)이 아닌 디렉토리 이름(ActixServer)입니다. Docker 데몬에 root 권한이 필요하면 --docker-sudo를 추가하여 전체 스크립트를 sudo로 실행하지 않아도 됩니다:
scripts/probe-local.sh --server ActixServer --docker-sudo
| Flag | 설명 |
|---|---|
--server <Dir> | src/Servers/ 아래 디렉토리 이름으로 단일 서버 프로빙 (예: NginxServer) |
--all | src/Servers/*/probe.json 아래 모든 서버 프로빙 |
--port <Port> | 대상 포트 (기본값: 8080) |
--skip-build | dotnet build 생략 (Release 빌드가 이미 있다고 가정) |
--verbose | CLI에 --verbose 전달 |
--docker-sudo | Docker 명령어를 sudo로 실행 (스크립트를 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 댓글로 게시합니다.