Origins en cross-site verzoeken · oefening
Origins en sites
Open mini_browser.py. Bovenaan staan een paar constanten en drie meegeleverde hulpfuncties die hoofdstuk 9 nodig heeft. Daaronder staan de regels, en elk daarvan werpt nog alleen NotImplementedError op. Voer het bestand uit in de
python mini_browser.py
Each page below is compared with https://reading.example.
The last column: does the session cookie go along when the page posts a form to the reading list?
page site same origin same site cookie sent
https://reading.example not written yet not written yet not written yet not written yet
https://app.reading.example not written yet not written yet not written yet not written yet
https://notes.reading.example not written yet not written yet not written yet not written yet
https://other.example not written yet not written yet not written yet not written yet
Eén rij per naam, en er staat nog niets in. Deze les vult drie van de vier kolommen.
De origin als tekst
Les 1 definieerde een origin_of(url) geeft hem als tekst terug, altijd in dezelfde vorm, zodat je twee origins met == kunt vergelijken:
het schema, dan
://, dan de host:https://reading.exampledan
:en de poort, tenzij de poort de standaardpoort van het schema is:http://reading.example:8080
urlsplit(url) geeft je de stukken. parts.scheme en parts.hostname komen terug in kleine letters, dus HTTPS://Reading.Example vraagt geen extra werk. parts.port is een getal, of None als de DEFAULT_PORTS bevat 80 voor "http" en 443 voor "https". Een poort die None is of gelijk aan de standaardpoort, blijft uit de tekst weg. Elke andere poort blijft staan.
Het model kent http- en https-URL’s met een host, en verder niets. Bij ftp://reading.example/x is het schema geen sleutel van DEFAULT_PORTS. Bij een kaal pad zoals /books is parts.hostname gelijk aan None. In beide gevallen werpt origin_of een
same_origin(a, b) neemt twee URL’s en zegt of hun origins gelijk zijn.
Een site is grover
Drie van de vier namen horen bij elkaar: reading.example, app.reading.example en notes.reading.example. De origin laat dat niet zien. Drie hosts zijn drie origins.
SameSite die je in hoofdstuk 4 zette, vergelijkt sites.
Een site is het schema plus het registreerbare domein: het deel van een hostnaam dat iemand heeft geregistreerd, zoals reading.example. Een echte browser vindt dat deel met de public suffix list, omdat sommige namen eindigen op een suffix van meer dan één label. Een label is één stuk van een hostnaam tussen twee punten. co.uk en github.io zijn zulke suffixen, dus het registreerbare domein van shop.example.co.uk is example.co.uk, drie labels lang.
Het model heeft zo’n
site https://reading.example
+----------------------------------------+
| origin https://reading.example |
| origin https://app.reading.example |
| origin https://notes.reading.example |
+----------------------------------------+
site https://other.example
+----------------------------------------+
| origin https://other.example |
+----------------------------------------+
De drie hosts die op reading.example eindigen, zijn drie origins binnen één site, https://reading.example. https://other.example is één origin, en het is een eigen site.
https://reading.example, https://app.reading.example en https://notes.reading.example zijn
Het schema hoort bij een site, zoals het bij een origin hoort. Een pagina die via gewoon http binnenkwam, hoort niet bij de site van de https-pagina’s op dezelfde host. Dat is de regel van de standaard, en Chromium past die toe op cookies. Firefox en Safari behandelen de twee nog als één site wanneer ze beslissen of een SameSite-cookie meegaat. Les 3 noemt dit samen met de andere verschillen.
Zijn http://reading.example en https://reading.example dezelfde site?
Waarom zou de regel van twee labels fout zijn voor shop.example.co.uk?
De regel heeft een tweede grens. Een host die een
Wat een site negeert
Een site heeft geen poort. https://reading.example:8443 en https://reading.example zijn twee origins, omdat de poorten verschillen, en één site. Daarom begint site_of alleen met de hostnaam: splits parts.hostname bij de punten, houd met labels[-2:] de laatste twee labels over en voeg ze weer samen met ".". Zet het schema en :// ervoor.
Wat drukt deze regel af als de vier functies geschreven zijn?
print(site_of("https://app.reading.example:8443/x"), same_site("https://notes.reading.example", "https://reading.example"), same_origin("https://notes.reading.example", "https://reading.example"))
Je opdracht
Schrijf in mini_browser.py de vier # Write this function in Lesson 2.:
origin_of(url)geeft de origin als tekst terug, en werptValueErrorop voor een URL die het model niet kent.same_origin(a, b)vergelijkt de origins van twee URL’s.site_of(url)geeft de site als tekst terug: het schema,://en de laatste twee labels van de host.same_site(a, b)vergelijkt de sites van twee URL’s.
Elke functie houdt haar naam, haar raise door je code. site_of en de twee same_-functies kunnen elk een functie aanroepen die je net daarvoor hebt geschreven.
Voer daarna opnieuw python mini_browser.py uit:
page site same origin same site cookie sent
https://reading.example https://reading.example True True not written yet
https://app.reading.example https://reading.example False True not written yet
https://notes.reading.example https://reading.example False True not written yet
https://other.example https://other.example False False not written yet
Lees de twee middelste kolommen van boven naar beneden. Alleen de leeslijst deelt een origin met zichzelf. Zijn twee buren zijn andere origins op dezelfde site, en other.example is geen van beide. Dat verschil tussen de tweede en de derde kolom is waar de rest van dit hoofdstuk over gaat.
Klik daarna op Check my work. De laatste kolom wacht op les 3, die beslist wanneer een cookie meegaat.
Opdracht
Schrijf de eerste vier regels van het model, in mini_browser.py.
origin_of(url) geeft de ://, de host in kleine letters, en dan : en de http, 443 voor https). Het pad en de query vallen weg.
origin_of("HTTPS://Reading.Example:443/books?x=1")geeft"https://reading.example"terug.origin_of("http://reading.example:8080/a")geeft"http://reading.example:8080"terug.
Hij werpt http- of https-URL met een host is, zoals "ftp://reading.example/x" of "/books".
site_of(url) geeft de site van een URL als tekst terug: het schema, :// en de laatste twee labels van de host. Een site heeft geen poort.
site_of("https://notes.reading.example/page")geeft"https://reading.example"terug.site_of("http://reading.example:8080")geeft"http://reading.example"terug.
same_origin(a, b) en same_site(a, b) nemen elk twee URL’s en geven True of False terug: of de twee dezelfde origin hebben, en of ze dezelfde site hebben.
Voer python mini_browser.py uit en lees de tabel.
Klik daarna op Check my work. Die roept de vier origin_of met ValueError moet weigeren; hosts van twee, drie en vijf labels; en paren die alleen in het schema, alleen in de poort of alleen in één label verschillen. Er wordt nooit een