Origins en cross-site verzoeken · oefening
Welke cookies meegaan
Als Ana inlogt, zet het antwoord de Max-Age afgebroken zodat hij op de pagina past:
set-cookie: __Host-session=<22 characters>; HttpOnly; Max-Age=28800;
Path=/; SameSite=Lax; Secure
{
"name": "__Host-session",
"value": "<22 characters>",
"host": "reading.example",
"path": "/",
"secure": True,
"samesite": "Lax",
}
host is de host die de cookie zette. samesite is "Strict", "Lax", "None", of "" voor een cookie die er geen noemt.
Bij elk verzoek dat een pagina begint, vraagt de browser van elke cookie in de jar: gaat deze mee? Er zijn vier tests, in deze volgorde: host, pad, Secure, SameSite. Een cookie die er één niet doorstaat, blijft thuis. cookies_to_send(jar, url, page_origin, *, method, top_level) is die url is waar het verzoek naartoe gaat, en page_origin is de
Host
De cookie gaat alleen naar de exacte host die hem zette: cookie["host"] moet gelijk zijn aan urlsplit(url).hostname. De sessiecookie noemt geen Domain, dus app.reading.example krijgt hem nooit.
De test vergelijkt hosts, geen origins. Een cookie is niet aan een https://reading.example:8443 draagt de cookies van https://reading.example.
De jar bevat de sessiecookie van reading.example. Een verzoek gaat naar https://reading.example:8443/me vanaf een pagina van de leeslijst. Gaat de cookie mee?
Pad
Een cookie gaat naar zijn eigen pad en naar elk pad daaronder. path_matches(cookie_path, request_path) is in drie gevallen waar:
de twee paden zijn gelijk;
het verzoekpad begint met het cookiepad, en het cookiepad eindigt op
/;het verzoekpad begint met het cookiepad, en het volgende teken is
/.
Dus Path=/books matcht /books/7. Het matcht niet /booksx, dat met dezelfde letters begint en een ander pad is. Path=/ matcht alles. Een https://reading.example, vraagt om /.
Een cookie heeft Path=/books. Welk verzoekpad matcht hij?
Secure
Een Secure-cookie gaat alleen naar een https-URL. Secure weg, omdat de server daar gewoon HTTP sprak. Hoofdstuk 4 zette het aan. Deze test is de regel die de vlag betekenis geeft.
SameSite
Eerst vraagt de browser of het verzoek binnen één site blijft: same_site(page_origin, url), met je
Strict: de cookie blijft thuis.Lax: de cookie gaat alleen mee met een top-level navigatie waarvan deGET of HEAD is. In het model zijn een gevolgde link en een verstuurd formulier top-level navigaties: het antwoord wordt de pagina die de lezer ziet. Een afbeelding en een verzoek dat een script doet, zijn dat niet. Een link is een GET, een formulier kan GET of POST sturen, en geen enkele paginanavigatie gebruikt HEAD. Over sites heen laat Laxde cookie dus meegaan met een gevolgde link of een formulier dat met GET wordt verstuurd, en nooit met een formulier-POST, een afbeelding of het verzoek van een script. Daarom staat les 8 erop dat geen enkele GET iets verandert.None: de cookie gaat altijd mee.Geen attribuut: dit model behandelt de cookie als
Lax, zoals Chromium doet.
samesite_allows(samesite, *, same_site_request, method, top_level) antwoordt voor één cookie. De * maakt de drie namen erna keyword-only. De meegeleverde set LAX_METHODS bevat "GET" en "HEAD". Vier antwoorden in deze tabel zijn voor jou:
SameSite | Het verzoek | Gaat mee? |
|---|---|---|
Strict | binnen de site | ja |
Strict | cross-site link | nee |
Strict | cross-site formulier-POST | nee |
Lax | binnen de site | ja |
Lax | cross-site link | ja |
Lax | cross-site formulier-POST | nee |
Lax | cross-site afbeelding | ? |
None | cross-site formulier-POST | ? |
None | cross-site afbeelding | ja |
| (ontbreekt) | cross-site link | ja |
| (ontbreekt) | cross-site formulier-POST | ? |
| (ontbreekt) | cross-site afbeelding | ? |
Een pagina op https://other.example bevat een formulier dat naar https://reading.example/books/delete post. De sessiecookie is SameSite=Lax. Gaat hij mee?
Wat een browser weigert te bewaren
Sommige cookies bereiken de jar nooit. may_store(cookie, url) geeft voor drie ervan False terug:
een
Secure-cookie die is gezet door een antwoord van eenhttp-URL;een cookie met
SameSite=Noneen zonderSecure;een cookie waarvan de naam met
__Host-begint en die nietSecureis, of waarvan het pad niet/is.
Hoofdstuk 4 koos het voorvoegsel __Host- als belofte. Hier is de code die een server eraan houdt.
Een antwoord zet __Host-session=abc; Path=/; HttpOnly zonder Secure. Wat doet de browser van het model?
Je opdracht
Schrijf in mini_browser.py de vier functies die voor les 3 zijn gemarkeerd, in deze volgorde: path_matches, samesite_allows, may_store, cookies_to_send. De laatste loopt de jar door, past de vier tests toe met continue, en geeft een nieuwe lijst terug met de cookies die meegaan, in de volgorde van de jar. Hij verandert de jar nooit.
Vul elk vraagteken in door het je functie te vragen. Deze regel vraagt naar het eerste:
python -c "import mini_browser; print(mini_browser.samesite_allows('Lax', same_site_request=False, method='GET', top_level=False))"
tests/steps.py bevat de vier pagina-origins als OWN, APP, NOTES en OTHER. Schrijf daarna twee tests in tests/test_browser.py. Elk bouwt een jar met één cookie-dict zoals die bovenaan deze pagina en roept mini_browser.cookies_to_send aan voor een formulier-POST naar steps.OWN + "/books/delete", met method="POST" en top_level=True:
test_lax_cookie_stays_home_on_a_cross_site_post: vanafsteps.OTHERis het resultaat[].test_lax_cookie_travels_within_the_site: vanafsteps.NOTESis het resultaat gelijk aan de jar.
Voer daarna beide uit:
python -m pytest -q tests/test_browser.py
python mini_browser.py
De eerste eindigt op 2 passed. In de tabel van de tweede staat in de laatste kolom nu True, True, True, False: van de vier pagina’s post alleen die op other.example zijn formulier zonder de cookie.
Waar het model en echte browsers in deze les verschillen:
Een ontbrekende
SameSite. Het model behandelt die alsLax, zoals Chromium doet en zoals de huidige draft van de cookiestandaard zegt. Chromium laat zo’n cookie in de eerste twee minuten ook meegaan met een cross-site top-level POST, eendie de draft toestaat. Firefox en Safari behandelen een ontbrekende SameSitealsNone.SameSite=NonezonderSecure. Chromium en Firefox weigeren die te bewaren, zoals het model doet. Safari bewaart hem.Het schema in een site. Chromium telt
http://reading.exampleenhttps://reading.exampleals twee sites, zoals het model doet. Firefox en Safari tellen ze als één wanneer zeSameSitetoepassen.localhost. Chrome en Firefox accepteren eenSecure-cookie vanhttp://localhost, en Safari niet. Het model accepteert er geen.Het voorvoegsel. De draft matcht
__Host-zonder op hoofdletters te letten, en het model matcht het exact.Weggelaten. Het attribuut
Domain, verloop op tijd, het partitioneren van cookies en het blokkeren van cookies die naar een derde partij worden gestuurd.
Klik daarna op Check my work.
Opdracht
Schrijf in mini_browser.py de regels die beslissen welke
Een cookie is een name, value, host, path, secure (True of False) en samesite ("Strict", "Lax", "None", of "" als de cookie er geen noemt). Een jar is een
path_matches(cookie_path, request_path)geeftTrueterug als de paden gelijk zijn, of als het verzoekpad met het cookiepad begint en het cookiepad op/eindigt of het volgende teken van het verzoekpad/is. Anders geeft hijFalseterug.samesite_allows(samesite, *, same_site_request, method, top_level)geeftTrueterug voor"None", en voor elkeals same_site_requestwaar is. Over sites heen krijgt"Strict"de waardeFalse, en krijgen"Lax"en""alleenTruealstop_levelwaar is enmethodinLAX_METHODSzit.may_store(cookie, url)geeftFalseterug voor eenSecure-cookie alsurlgeenhttps-is, voor SameSite=NonezonderSecure, en voor een naam die met__Host-begint als de cookie nietSecureis of zijn pad niet/is. Anders geeft hijTrueterug.cookies_to_send(jar, url, page_origin, *, method, top_level)geeft een nieuwe lijst terug met de cookies uitjardie met het verzoek meegaan, in de volgorde van de jar. Een cookie gaat mee als zijnhostgelijk is aan de host vanurl, zijn pad matcht met het pad vanurl(een leeg pad telt als/), hij nietSecureis ofurleenhttps-URL is, ensamesite_allowsja zegt voorsame_site(page_origin, url). De jar wordt niet veranderd.
Schrijf in tests/test_browser.py, onder het commentaar van hoofdstuk 8, twee tests. Elk roept mini_browser.cookies_to_send aan met een jar die één Lax-cookie van de host reading.example bevat, voor een POST naar steps.OWN + "/books/delete" met top_level=True:
test_lax_cookie_stays_home_on_a_cross_site_post: begonnen door een pagina opsteps.OTHER, is het resultaat[].test_lax_cookie_travels_within_the_site: begonnen door een pagina opsteps.NOTES, is het resultaat gelijk aan de jar.
Voer python -m pytest -q tests/test_browser.py en python mini_browser.py uit.
Klik daarna op Check my work. Die roept de vier path_matches krijgt tien paren paden. samesite_allows krijgt elke waarde van het attribuut met verzoeken binnen de site en over sites heen, met GET, HEAD, POST en DELETE, en met beide waarden van top_level. may_store krijgt tien cookies, waarvan één met __Host- midden in de naam. cookies_to_send krijgt een jar van acht cookies en veertien verzoeken: naar een dieper pad, naar een pad dat alleen met dezelfde letters begint, naar een URL zonder pad, naar een http-URL, naar een andere http-kant van dezelfde host. De jar wordt ervoor en erna vergeleken. Als laatste draait hij je twee tests op naam, één keer: elk moet slagen, en elk moet mini_browser.cookies_to_send via de