HTTP-otsakejäsennin

Liitä koko HTTP-pyyntö tai -vastaus — lohko, jonka curl -v tulostaa tai jonka selaimen Verkko-paneeli näyttää — ja jokainen otsikkorivi puretaan: nimi, arvo, selkokielinen lause sen tehtävästä ja dokumentti, joka sen määrittelee. Set-Cookie puretaan attribuutti kerrallaan (Secure, HttpOnly, SameSite, Max-Age, Expires…), Content-Type- ja Accept-parametrit laajennetaan, ja lohko tarkastetaan klassisten rakenneongelmien varalta: vanhentuneet taitetut rivit, kielletyt merkit, kaksoisotsikot ja väärään suuntaan lähetetyt otsikot. Kaikki toimii selaimessa, eikä mitään ladata.
Automaattisesti tarkastelee ensimmäistä riviä: pyyntörivi (GET /path HTTP/1.1) tarkoittaa pyyntöä, tilarivi (HTTP/1.1 200 OK) tarkoittaa vastausta, muu luetaan pelkäksi otsikkolohkoksi. Muut valinnat pakottavat suunnan, mikä muuttaa sitä, mitkä varoitukset pätevät.
Mitään ei ole vielä jäsennetty. Liitä pyyntö- tai vastauslohko yllä ja paina Jäsennä otsikot, tai paina Esimerkki, jolloin näkyy malliesimerkki.
Mistä saa jäsennyskelpoisen lohkon. Päätteessä curl -v https://example.com/ 2>&1 tulostaa pyynnön ja vastauksen >- ja <-etuliitteillä — poista ne ja liitä. curl -sI https://example.com/ antaa pelkän vastausotsikkolohkon. Selaimessa avaa kehittäjätyökalut, Verkko-välilehti, lataa uudelleen, valitse dokumenttipyyntö ja käytä Kopioi → Kopioi vastauksen otsikot; pyyntöpuolelle käytä Kopioi cURL-muodossa ja lue liput. Pelkkä Nimi: arvo -rivien lohko ilman aloitusriviä jäsentyy myös — suuntatarkistukset ovat silloin löysemmät.
Itsetesti
Ajaa jäsentimen uudelleen kiinteitä lohkoja vastaan: suunnan tunnistus, molemmat näytejoukot, jokainen Set-Cookie-attribuuttisääntö (SameSite=None ilman Secure-attribuuttia, ei-numeerinen Max-Age, rikki Expires, tuntematon attribuutti, eväste ilman yhtäsuuruusmerkkiä), obs-fold-yhdistäminen, kielletyt kenttänimet, kaksoisotsikot, suuntaristiriidat ja negatiiviset polut. Mitään ei lähetetä minnekään.
Mikä on HTTP-otsikko?
Yhdellä lauseella: HTTP-viesti on aloitusrivi, lohko Nimi: arvo -rivejä, joita kutsutaan otsikoiksi, tyhjä rivi ja valinnainen runko — otsikot kantavat kaiken viestiin liittyvän paitsi itse rungon: kuka sen lähetti, mitä se hyväksyy, miten se välimuistitetaan, miten se todennetaan ja mitä lähettäjä haluaa takaisin.
Neljä perhettä
PerheKulkeeEsimerkitVastaa kysymykseen
Pyynnön otsikotasiakas → palvelinHost, Accept, Cookie, Referer, Authorizationmitä asiakas haluaa ja kenen se väittää olevansa
Vastauksen otsikotpalvelin → asiakasLocation, Server, Set-Cookie, Retry-Aftermitä palvelin teki ja mitä se pyytää vastineeksi
Esitysotsikotmolemmat, rungostaContent-Type, Content-Length, Content-Encoding, ETagmissä muodossa runko on ja mikä kopio siitä on kyseessä
Ohjausotsikotmolemmat, yhteydestäCache-Control, Connection, Via, Transfer-Encodingmiten viesti ja yhteys käsitellään matkalla

Jotkin otsikot ovat ehdottomasti yksisuuntaisia: If-None-Match on järkevä vain pyynnössä ja Set-Cookie vain vastauksessa. Jäsentäminen väärään suuntaan on yksi klassisista kopioi-liitä-vianetsintävirheistä, minkä vuoksi tämä sivu merkitsee sen.

Otsikkorivin kielioppi

RFC 9110 määrittelee kenttärivin muotoon field-name ":" OWS field-value OWS — nimi, joka koostuu vain token-merkeistä (kirjaimet, numerot ja !#$%&'*+-.^_`|~), kaksoispiste, jonka edessä ei ole välilyöntiä, sekä arvo, jossa on näkyviä merkkejä, välilyöntejä ja sarkaimia. Otsikoiden nimet eivät ole kirjainkokoherkkiä (content-type vastaa Content-Typea); arvot ovat lähes aina kirjainkokoherkkiä. Välilyönnillä tai sarkaimella alkava rivi jatkoi aiemmin edellistä otsikkoa — obs-fold, vanhentunut vuodesta 2014: välityspalvelin, joka purkaa taitoksen, voi muuttaa otsikon merkitystä, joten tämä jäsennin yhdistää rivin mutta varoittaa siitä.

Yleisiä virheitä
  • Luottaminen X-Forwarded-For-otsikkoon. Jokainen välityspalvelin lisää sen polulla, ja asiakas voi väärentää ensimmäisen hypyn. Se kertoo, mitä välityspalvelinketju väittää, ei sitä, kuka on yhteydessä; käsittele sitä vihjeenä ja suosi välityspalvelinta, joka ylikirjoittaa sen itse hallitsemallasi tavalla.
  • Vain vastausotsikoiden lukeminen. Puolet mielenkiintoisista virheistä (kaksoiskappale Accept-otsikosta, puuttuva Host, väärälle isännälle osoitettu valtuutusotsikko) asuu pyynnössä, jonka selain piilottaa oletuksena. Kopioi pyyntö cURL-muodossa, jolloin oma pyyntö näkyy.
  • Set-Cookie-rivien yhdistäminen. Useimmat kaksoisotsikot voi yhdistää pilkuilla — Set-Cookie-otsikkoa ei saa, koska pilkku esiintyy itse arvossa. Selaimet käsittelevät jokaisen rivin erillisenä evästeenä.
  • Odotus, että Content-Length on kirjoittamasi rungon koko. Se on koko Content-Encoding-koodauksen jälkeen, ja vain silloin, kun viesti ei ole pilkottu; Transfer-Encoding: chunked -vastauksella ei ole mielekästä yksittäistä pituutta.
  • Otsikoiden arviointi X--etuliitteen perusteella. Käytäntö kuoli RFC 6648:ssa: X-Forwarded-For ja X-Content-Type-Options ovat pysyviä de facto -standardeja, kun taas monet muut kuin X-otsikot ovat kokeellisia. Arvioi määrittelevän dokumentin perusteella, älä etuliitteen.
UKK

Onko otsikoiden liittäminen tähän turvallista? Jäsentäminen tapahtuu kokonaan selaimessa, eikä mitään ladata. Silti kopioitu otsikkolohko on sormenjälki: evästeet, valtuutusotsikot ja tarkka User-Agent yhdessä voivat tunnistaa käyttäjän, joten jäsennä lohkoja, joita ei haittaa näyttää työkaverille.

Miksi selaimessa näkyy otsikoita kuten :status, joita tämä sivu pitää virheinä? Ne ovat HTTP/2- ja HTTP/3-pseudo-otsikoita — binäärikehystyskerrokset korvaavat aloitusrivin ja Host-otsikon pseudo-kentillä. Tämä sivu jäsentää klassisen HTTP/1.1-tekstin; pseudo-otsikot ovat sama tieto sen jälkeen, kun protokolla on muuntanut sen.

Mitä X-XSS-Protectionille tapahtui? Se on vanhentunut: sen ohjaama tarkastaja aiheutti omia tietoturvavirheitään, ja selaimet poistivat sen. Sen tehtävä kuuluu Content-Security-Policylle — rakenna se CSP-generaattorilla ja tarkasta koko kokonaisuus tietoturvaotsikkotarkistimella.

Miten Set-Cookie-attribuutti tarkistetaan? RFC 6265:tä vastaan: nimet ja arvot erotetaan ensimmäisestä yhtäsuuruusmerkistä, attribuutit ensimmäisen puolipisteen jälkeen, Expires on oltava päivämäärä evästemuodossa, Max-Age on numeroita, SameSite on yksi arvoista Strict/Lax/None — ja None ilman Secure-attribuuttia hylätään nykyisissä selaimissa, joten siitä huomautetaan.

Voiko pelkän luettelon otsikkoriveistä jäsentää? Kyllä — valitse Vain otsikkolohko ja liitä ilman aloitusriviä. Suuntatarkistukset ovat löysemmät; kaikki muu (rakenne, Set-Cookie, parametrit) toimii yhä.