Warum werden Access-Control-Expose-Header benötigt?

77

Ich habe nach den spezifischen Sicherheitsgründen gesucht, warum dies hinzugefügt wurde. Es war eine Art WTH-Moment, als ich cors implementierte und sah, dass alle Header zurückgegeben wurden, aber ich konnte nicht über Javascript darauf zugreifen.

Blake Niemyjski
quelle

Antworten:

95

CORS ist so implementiert, dass es nicht gegen Annahmen verstößt, die in der Welt vor CORS getroffen wurden, die nur denselben Ursprung hat.

In der Pre-CORS-Welt könnte ein Client eine originensübergreifende Anforderung auslösen (z. B. über ein Skript-Tag), die Antwortheader jedoch nicht lesen.

Um sicherzustellen, dass CORS diese Annahme nicht verletzt, muss der Server gemäß der CORS-Spezifikation dem Client explizite Berechtigungen zum Lesen dieser Header (über den Access-Control-Expose-HeadersHeader) erteilen . Auf diese Weise verhalten sich nicht autorisierte CORS-Anforderungen wie in einer Welt vor CORS.

Monsur
quelle
Ich finde, dieser Link ist ein gutes Beispiel für diese Antwort: fetch.spec.whatwg.org/#example-cors-with-response-header
yusong
4

Das ist eine ziemlich gute Frage. Wenn Sie http://www.w3.org/TR/cors/#simple-response-header durchsehen , ist nicht klar, warum Sie dies tun möchten oder müssen.

Die CORS-Spezifikation legt großen Wert auf die Idee, dass Sie einen Handshake vor der Anforderung benötigen, bei dem der Client nach einer Art von Verbindung fragt und der Server antwortet, dass dies zulässig ist. Dies ist möglicherweise nur ein weiterer Aspekt davon .

Standardmäßig ist die Länge des Inhalts kein zulässiger Header, daher bin ich auf dasselbe Problem gestoßen (später, als ich auf WebDAV zugreifen musste und die zulässigen Parameter ändern musste). CORS macht (für mich) wirklich keinen Sinn ) an erster Stelle, also würde es mich nicht überraschen, wenn Schwaden davon launisch sind.

Synthesizerpatel
quelle
3
CORS fühlt sich gerade deshalb launisch, weil die Autoren der Spezifikation sorgfältig darüber nachgedacht haben. CORS muss Ursprungsübergreifende Anforderungen aktivieren und gleichzeitig die Richtlinie des Browsers für denselben Ursprung schützen. Es ist die Notwendigkeit, diese beiden (manchmal gegensätzlichen) Kräfte auszugleichen, die das Verständnis der CORS-Spezifikation erschwert.
Monsur
Der Link zur Empfehlung ist der hilfreichste Hinweis, den ich diesen Monat und mehr erhalten habe. Ich wusste über Access-Control-Allow-Header Bescheid, hatte aber Access-Control-Expose-Header nicht berücksichtigt und konnte nicht verstehen, warum meine "Links" -Header nicht in meine Backbone-Sammlung gelangten. Erstaunlich.
Mcdave
4

Hier ist der Grund, warum Access-Control-Expose-Header benötigt werden:

Access-Control-Expose-Headers (optional) - Das XMLHttpRequest 2-Objekt verfügt über eine getResponseHeader () -Methode, die den Wert eines bestimmten Antwortheaders zurückgibt. Während einer CORS-Anforderung kann die Methode getResponseHeader () nur auf einfache Antwortheader zugreifen. Einfache Antwortheader sind wie folgt definiert:

  • Cache-Kontrolle
  • Inhaltssprache
  • Inhaltstyp
  • Läuft ab
  • Zuletzt geändert
  • Pragma

Wenn Clients auf andere Header zugreifen können sollen, müssen Sie den Header Access-Control-Expose- Headers verwenden. Der Wert dieses Headers ist eine durch Kommas getrennte Liste von Antwortheadern, die Sie dem Client zur Verfügung stellen möchten.

Weitere Informationen finden Sie unter dem Link https://www.html5rocks.com/en/tutorials/cors/.

Viel Spaß beim Codieren !!

Trilok Pathak
quelle