Was genau macht der Header Access-Control-Allow-Credentials?

167

Ich versuche zu verstehen, wie man CORS verwendet, und bin verwirrt darüber, was der Access-Control-Allow-CredentialsHeader tut.

Die Dokumentation sagt

Gibt an, ob die Antwort auf die Anforderung verfügbar gemacht werden kann, wenn das Anmeldeinformationsflag wahr ist.

Aber ich verstehe nicht, was die Antwort "ausgesetzt" bedeutet.

Kann jemand erklären, was dieser auf true gesetzte Header (in Verbindung mit dem auf true gesetzten Anmeldeinformationsflag) tatsächlich bewirkt?

Nate
quelle
xhr.withCredential doc auf clientseitiger Entwickler.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/…
Weishi Zeng

Antworten:

264

Standardmäßig enthält CORS keine Cookies für Cross-Origin-Anfragen. Dies unterscheidet sich von anderen originensübergreifenden Techniken wie JSON-P. JSON-P enthält immer Cookies in der Anfrage. Dieses Verhalten kann zu einer Klasse von Sicherheitslücken führen, die als Cross-Site Request Forgery (CSRF) bezeichnet werden.

Um die Wahrscheinlichkeit von CSRF-Schwachstellen in CORS zu verringern, müssen sowohl der Server als auch der Client bestätigen, dass es in Ordnung ist, Cookies in Anfragen aufzunehmen. Dadurch werden Cookies zu einer aktiven Entscheidung und nicht zu einer passiven Entscheidung ohne Kontrolle.

Der Client-Code muss die withCredentialsEigenschaft auf XMLHttpRequestto truesetzen, um die Berechtigung zu erteilen.

Dieser Header allein reicht jedoch nicht aus. Der Server muss mit dem Access-Control-Allow-CredentialsHeader antworten . Wenn Sie mit diesem Header auf antworten, truebedeutet dies, dass der Server das Einfügen von Cookies (oder anderen Benutzeranmeldeinformationen) in Ursprungsanfragen zulässt.

Sie müssen auch sicherstellen, dass Ihr Browser keine Cookies von Drittanbietern blockiert, wenn Sie möchten, dass Anforderungen für Cross-Origin-Anmeldeinformationen funktionieren.

Beachten Sie, dass Sie Ihre Website unabhängig davon, ob Sie Anfragen gleichen oder unterschiedlichen Ursprungs stellen, vor CSRF schützen müssen (insbesondere, wenn Ihre Anfrage Cookies enthält).

Monsur
quelle
1
Ich habe die Antwort klargestellt, um Ihre Frage abzudecken. Grundsätzlich macht JSON-P es falsch und ist weniger sicher.
Monsur
28
Ich möchte nur ein wenig hinzufügen, um die Bedeutung von "ausgesetzt" zu kommentieren. Die Spezifikation erfordert keinen Vorflug (zusätzliche Hin- und Rückfahrt, um zu überprüfen, ob der Server Anmeldeinformationen zulässt) für GET-Anforderungen. Anstelle von Preflighting sendet der Browser nur immer die Anfrage und sendet Cookies withCredentials, wenn diese Option aktiviert ist. Wenn jedoch die Antwort empfangen wird und withCredentials festgelegt wurde, wird das Ergebnis nur dann an das aufrufende Javascript übermittelt, wenn die Antwort über den Zugriff verfügt -Control-Allow-Credentials-Header-Set. Wenn kein Header vorhanden ist, wird die Antwort nicht angezeigt, sodass sie effektiv schwarz durchlöchert wird.
Schwere
4
@ heavyi5ide, Ja, auch wenn der Browser die Antwort auf den Client-Code nicht verfügbar macht, wurde die Anfrage mit Cookie trotzdem gesendet (für nicht vorab geflogene Anfragen). CSRF wäre also noch erledigt.
Pacerier
7
Da dies eine so beliebte Antwort ist, werde ich noch eine wichtige Information hinzufügen: Zusätzlich zur korrekten Konfiguration Ihrer Anforderungs- und Antwortheader müssen Sie auch sicherstellen, dass Ihr Browser keine Cookies von Drittanbietern blockiert, wenn Sie dies tun Ich möchte, dass Anfragen mit Herkunftsnachweis funktionieren. Siehe stackoverflow.com/a/16634887/2970321
alexw
5
Dies ist eine so klare Antwort, dass jeder, der sie zum ersten Mal liest, seinen Code verstehen und korrigieren kann, der mit Cookies nicht gut zu funktionieren scheint. Vielen Dank!
Asgs