HTTP-otsikkojäsennin — pyynnön ja vastauksen otsikot, purettuna rivi kerrallaan
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.
Syöte
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.
Jäsennysraportti
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.
missä muodossa runko on ja mikä kopio siitä on kyseessä
Ohjausotsikot
molemmat, yhteydestä
Cache-Control, Connection, Via, Transfer-Encoding
miten 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ä.