0%

Origins und Cross-Site-Anfragen

Senden ist nicht Lesen

Eine Seite kann ein Bild zeigen, das auf irgendeiner anderen Site liegt. Sie kann auf jede andere Site verlinken, und sie kann ein Formular enthalten, das an jede andere Site postet. So wurde das Web gebaut. Jedes davon ist eine Anfrage, die die Seite einer Site startet und der Server einer anderen Site beantwortet.

Dein Modell kann bereits sagen, welche eine solche Anfrage trägt. Diese Lektion handelt von den zwei Entscheidungen rund um diese eine.

Drei Fragen

Für jede Anfrage, die eine Seite startet, beantwortet ein Browser drei Fragen, und er beantwortet sie getrennt.

a page                                                a server
  |
  |   1. Is the request sent?        Almost always.
  |   2. Does the cookie go along?   Host, path, Secure, SameSite.
  |
  | ------------------ the request -------------------> |
  |                                                     |  the server
  |                                                     |  acts
  | <----------------- the response ------------------- |
  |
  |   3. May the page read the response?
  |      Only when it comes from the page's own origin.

Die erste Frage ist, ob die Anfrage überhaupt gesendet wird. Die Antwort ist fast immer ja. Die ist eine Art von Anfrage, die Kapitel 9 behandelt.

Die zweite ist, ob ein Cookie mitgeht. Das ist Lektion 3: der Host, der Pfad, Secure und SameSite, das Sites vergleicht.

Die dritte kommt, nachdem der Server gehandelt und geantwortet hat: Darf die Seite, die die Anfrage gestartet hat, die Antwort lesen? Diese vergleicht .

Die Policy handelt vom Lesen

Die Regel hinter der dritten Frage ist die (same-origin policy): Das Skript einer Seite darf eine Antwort nur lesen, wenn sie von der eigenen Origin der Seite kommt. Es darf die Seite einer anderen Origin, ihr oder ihre Header nicht lesen.

Lies diesen Satz noch einmal und suche das Wort „senden“. Es steht nicht darin. Die Policy sagt, was eine Seite lesen darf. Nichts darin hält die Anfrage davon ab, loszugehen, und nichts darin erwähnt Cookies. Kapitel 9 zeigt, wie ein Server einer anderen Origin die Erlaubnis zum Lesen geben kann.

Die vollständige Policy umfasst mehr als Antworten. Sie hat auch Regeln für Frames, für Daten, die eine Seite im Browser speichert, und für Skripte, die von einer anderen Origin geladen werden. Diese Lektion bleibt bei den Antworten.

Die Falltabelle

Hier sind sechs Anfragen an https://reading.example. In jedem Fall enthält der Speicher Anas Session-Cookie, das SameSite=Lax ist.

Die Seite liegt aufSie startetGesendet?Cookie?Darf die Seite die Antwort lesen?
other.exampleein Bildjaneinnein
other.exampleeinen Formular-POSTjaneinnein
other.exampleeinen angeklickten Linkjajanein
notes.reading.exampleein Bildjajanein
notes.reading.exampleeinen Formular-POSTjajanein
reading.exampleeinen Fetch eines Skriptsjajaja

In der dritten Zeile landet der Leser auf der Leseliste und sieht ihre Seite. Die Seite mit dem Link nicht: Ihr Skript liest nichts.

Der nächste Block gibt dieselbe Tabelle aus. Jede Anfrage wird gesendet, also hat er dafür keine Spalte. Die Cookie-Spalte berechnet eine kurze Kopie der Lax-Regel, die du geschrieben hast, und die letzte Spalte ein Vergleich der Origins. Führe ihn aus. Ändere dann eine Zeile, zum Beispiel die der zweiten auf "GET", und führe ihn noch einmal aus.

Try it

Eine Seite auf https://other.example enthält ein Bild mit der Adresse https://reading.example/me. Was passiert?

Dasselbe Bild steht auf einer Seite von https://notes.reading.example. Was ändert sich?

Was daraus folgt

Sieh dir die fünfte Zeile noch einmal an. Eine Seite auf notes.reading.example postet ein Formular an die Leseliste. Die Anfrage wird gesendet. Anas Cookie geht mit, weil der Nachbar auf derselben Site liegt. Der Server sieht einen POST mit einer gültigen und handelt danach. Die Seite, die das Formular gesendet hat, bekommt die Antwort nie zu lesen.

Diese Seite braucht die Antwort nicht. Wenn das Formular „lösche Buch 1“ sagte, war das Buch weg, bevor es überhaupt eine Antwort gab.

Eine Seite kann die Antwort auf ein Formular, das sie an eine andere Origin gepostet hat, nicht lesen. Warum kann der POST trotzdem Schaden anrichten?

Die Same-Origin-Policy schützt also, was dein Server sagt, und sie schützt nicht, was dein Server tut. Eine Anfrage, die auf dem Cookie von jemandem mitfährt, um eine Änderung vorzunehmen, um die diese Person nie gebeten hat, heißt oder CSRF. Die Antworten in dieser Lektion stammen aus dem Modell, und während du sie gelesen hast, wurde nichts gesendet. In der nächsten Lektion fälschst du eine solche Anfrage gegen deinen eigenen Server.