HTTP-headerparser

Indsæt en hel HTTP-anmodning eller et helt svar — blokken curl -v udskriver, eller det browserens netværkspanel viser — og hver headerlinje afkodes: navnet, værdien, en sætning på almindeligt sprog om, hvad den gør, og dokumentet, der definerer den. Set-Cookie skilles ad attribut for attribut (Secure, HttpOnly, SameSite, Max-Age, Expires…), Content-Type- og Accept-parametre udvides, og blokken revideres for de klassiske strukturelle problemer: forældede foldede linjer, ulovlige tegn, dubletheadere og headere sendt i den forkerte retning. Alt kører i browseren, og intet uploades.
Automatisk kigger på den første linje: en anmodningslinje (GET /sti HTTP/1.1) betyder anmodning, en statuslinje (HTTP/1.1 200 OK) betyder svar, og alt andet læses som en ren headerblok. De øvrige valg fastlægger retningen, hvilket ændrer, hvilke advarsler der gælder.
Intet parset endnu. Indsæt en anmodnings- eller svarblok ovenfor, og tryk på Parse headere, eller tryk på Eksempel for et gennemarbejdet eksempel.
Hvor man får en blok, der er værd at parse. I en terminal udskriver curl -v https://example.com/ 2>&1 anmodningen og svaret med præfikserne > og < — fjern dem, og indsæt. curl -sI https://example.com/ giver kun svarheaderblokken. I browseren: åbn udviklerværktøjer, fanen Netværk, genindlæs, vælg dokumentanmodningen og brug Kopiér → Kopiér svarheadere; til anmodningssiden brug Kopiér som cURL og læs flagene. En ren blok med Navn: værdi-linjer uden startlinje parses også — retningstjekkene lempes så.
Selvtest
Kører parseren igen mod faste blokke: retningsregistrering, begge eksempelpuljer, hver Set-Cookie-attributregel (SameSite=None uden Secure, en ikke-numerisk Max-Age, en ødelagt Expires, en ukendt attribut, en cookie uden lighedstegn), obs-fold-sammenføjning, ulovlige feltnavne, dubletheadere, retningsmismatch og de negative stier. Intet sendes nogen steder.
Hvad er en HTTP-header?
I én sætning: en HTTP-meddelelse er en startlinje, en blok af Navn: værdi-linjer kaldet headere, en tom linje og et valgfrit body — headerne bærer alt om meddelelsen undtagen selve body'et: hvem der sendte den, hvad den kan acceptere, hvordan den caches, hvordan den autentificeres, og hvad afsenderen ønsker tilbage.
De fire familier
FamilieRejser medEksemplerBesvarer spørgsmålet
Anmodningsheadereklient → serverHost, Accept, Cookie, Referer, Authorizationhvad klienten ønsker, og hvem den hævder at være
Svarheadereserver → klientLocation, Server, Set-Cookie, Retry-Afterhvad serveren gjorde, og hvad den beder om til gengæld
Repræsentationsheaderebegge, om body'etContent-Type, Content-Length, Content-Encoding, ETaghvilket format body'et er i, og hvilken kopi af det dette er
Kontrolheaderebegge, om forbindelsenCache-Control, Connection, Via, Transfer-Encodinghvordan meddelelsen og forbindelsen håndteres undervejs

Nogle headere er fast énretnings: If-None-Match giver kun mening i en anmodning, og Set-Cookie kun i et svar. Parsing i den forkerte retning er en af de klassiske copy-paste-fejlfindingsfejl, og derfor markerer denne side det.

Grammatikken for en headerlinje

RFC 9110 definerer en feltlinje som field-name ":" OWS field-value OWS — et navn bestående udelukkende af token-tegn (bogstaver, cifre og !#$%&'*+-.^_`|~), et kolon med intet mellemrum før det, og en værdi af synlige tegn, mellemrum og tabulatorer. Headernavne er ikke versalfølsomme (content-type er lig med Content-Type); værdier er næsten altid versalfølsomme. En linje, der starter med et mellemrum eller en tabulator, fortsatte tidligere den forrige header — obs-fold, forældet siden 2014: en proxy, der folder den ud, kan ændre headerens betydning, så parseren her samler den, men advarer om, at den findes.

Almindelige fejl
  • At stole på X-Forwarded-For. Den tilføjes af hver proxy på vejen, og en klient kan forfalske det første hop. Den fortæller, hvad en kæde af proxyer hævder, ikke hvem der er forbundet; behandl den som et hint, og foretræk en proxy, man selv kontrollerer, til at overskrive den.
  • Kun at læse svarheaderne. Halvdelen af de interessante fejl (en dobbelt Accept, en manglende Host, en autorisationsheader rettet mod forkert vært) ligger i anmodningen, som browseren skjuler som standard. Brug Kopiér som cURL for at se sin egen.
  • Sammenfletning af Set-Cookie-linjer. De fleste dobbelte headere må kombineres med kommaer — Set-Cookie må ikke, fordi kommaet optræder inde i selve værdien. Browsere behandler hver linje som en separat cookie.
  • At forvente, at Content-Length er den body-størrelse, man skrev. Det er størrelsen efter Content-Encoding er anvendt, og kun når meddelelsen ikke er chunked; et Transfer-Encoding: chunked-svar har ingen meningsfuld enkelt længde.
  • At vurdere headere ud fra deres X--præfiks. Konventionen døde med RFC 6648: X-Forwarded-For og X-Content-Type-Options er permanente de facto-standarder, mens mange ikke-X-headere er eksperimentelle. Vurder efter det definerende dokument, ikke præfikset.
Ofte stillede spørgsmål

Er det sikkert at indsætte headere her? Parsingen sker helt i browseren, og intet uploades. Ikke desto mindre er en kopieret headerblok et fingeraftryk: cookies, autorisationsheadere og den præcise User-Agent kan tilsammen identificere en, så parse kun blokke, som man ikke har noget imod at vise en kollega.

Hvorfor viser browseren headere som :status, som denne side kalder fejl? Det er HTTP/2- og HTTP/3-pseudoheadere — de binære rammelag erstatter startlinjen og Host med pseudofelter. Denne side parser den klassiske HTTP/1.1-wiretekst; pseudoheadere er den samme information, efter protokollen har oversat den.

Hvad skete der med X-XSS-Protection? Den er forældet: auditoren, den drev, forårsagede sine egne sikkerhedsfejl, og browsere har fjernet den. Dens opgave hører til en Content-Security-Policy — byg en på CSP-generatoren, og revider hele sættet på sikkerhedsheader-tjekket.

Hvordan tjekkes en Set-Cookie-attribut? Mod RFC 6265: navne og værdier deles ved det første lighedstegn, attributter efter det første semikolon, Expires skal være en dato i cookie-formatet, Max-Age skal være cifre, og SameSite skal være én af Strict/Lax/None — og None uden Secure afvises af nuværende browsere, så det fremhæves.

Kan jeg parse en liste over headerlinjer alene? Ja — vælg Kun headerblok, og indsæt uden en startlinje. Retningstjek lempes; alt andet (struktur, Set-Cookie, parametre) køres stadig.