0%

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 in woorden: schema, host en . 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.example

  • dan : 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 geen poort noemt. De meegeleverde 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 op.

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.

zijn ouder dan de bescherming van origins, en ze richten zich naar een grovere eenheid. De vlag 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 niet, en zijn regel is een modelregel: elke naam in deze cursus eindigt op een suffix van één label, dus de site is het schema plus de laatste twee labels van de host.

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 is, of uit één label bestaat, heeft geen registreerbaar domein, en de regel van twee labels geeft er een fout antwoord voor. Geef het model nooit zo’n host. Check my work doet dat ook niet.

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 met het commentaar # Write this function in Lesson 2.:

  1. origin_of(url) geeft de origin als tekst terug, en werpt ValueError op voor een URL die het model niet kent.

  2. same_origin(a, b) vergelijkt de origins van twee URL’s.

  3. site_of(url) geeft de site als tekst terug: het schema, :// en de laatste twee labels van de host.

  4. same_site(a, b) vergelijkt de sites van twee URL’s.

Elke functie houdt haar naam, haar en haar docstring. Vervang het commentaar en de regel met 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 van een als tekst terug: het schema, ://, de host in kleine letters, en dan : en de , tenzij de poort de standaardpoort van het schema is (80 voor 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 op voor alles wat geen 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 aan met URL’s die je nog niet hebt gezien: URL’s met een pad en een query, met hoofdletters in het schema en de host, met de standaardpoort uitgeschreven en met andere poorten; drie URL’s die 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 of een host van één label meegegeven. Niets uit je wordt beoordeeld.