Ich entwickle eine JSON / REST-Web-API, für die ich speziell möchte, dass Websites von Drittanbietern meinen Dienst über AJAX aufrufen können. Daher sendet mein Dienst den berühmten CORS-Header:
Access-Control-Allow-Origin: *
Dadurch können Websites von Drittanbietern meinen Dienst über AJAX aufrufen. Alles in Ordnung soweit.
Ein Unterabschnitt meiner Web-API ist jedoch nicht öffentlich und erfordert eine Authentifizierung (ziemlich normales Zeug mit OAuth und einem access_token-Cookie). Ist es sicher, CORS auch auf diesem Teil meiner Website zu aktivieren?
Einerseits wäre es cool, wenn Websites von Drittanbietern Ajax-Clients haben könnten, die auch mit diesem Teil meines Dienstes interagieren. Der Grund dafür, dass es in erster Linie dieselbe Ursprungspolitik gibt, ist jedoch, dass dies riskant sein kann. Sie möchten nicht, dass eine Website, die Sie anschließend besuchen, auf Ihre privaten Inhalte zugreifen kann.
Das Szenario, vor dem ich Angst habe, ist, dass sich ein Benutzer in meiner Web-API anmeldet, entweder auf der Website oder über eine Website, der er vertraut, und vergisst, sich abzumelden. Ermöglicht dies jeder anderen Website, die er später besucht, über die vorhandene Sitzung auf seine privaten Inhalte zuzugreifen?
Also meine Fragen:
- Ist es jemals sicher, CORS für nicht öffentliche Inhalte zu aktivieren?
- Wenn ein CORS-fähiger Server ein session_token über ein Cookie setzt, wird dieses Cookie unter der Domäne des CORS-Servers oder des Hauptwebseiten-Servers gespeichert?
quelle
Antworten:
Als Antwort auf Ihre zweite Frage (Wenn ein CORS-fähiger Server ein session_token über ein Cookie setzt ...?) Wird das Cookie unter der Domäne des CORS-Servers gespeichert. Der JS-Code der Hauptwebseite kann auch über nicht auf das Cookie zugreifen
document.cookie
. Das Cookie wird nur an den Server gesendet, wenn die.withCredentials
Eigenschaft festgelegt ist, und selbst dann wird es nur akzeptiert, wenn der Server denAccess-Control-Allow-Credentials
Header festlegt .Ihre erste Frage ist etwas offener. Es ist ziemlich sicher, aber es gibt Möglichkeiten, Dinge zu umgehen. Ein Angreifer könnte beispielsweise eine DNS-Vergiftungstechnik verwenden, um eine Preflight-Anforderung auf den tatsächlichen Server zu übertragen, die tatsächliche CORS-Anforderung jedoch an den nicht autorisierten Server senden. Hier sind einige weitere Ressourcen zur CORS-Sicherheit:
Schließlich geht es Ihnen darum, jeder Website Zugriff auf Ihre CORS-Daten zu gewähren . Um sich davor zu schützen, sollten Sie den
Access-Control-Allow-Origin: *
Header nicht verwenden . Stattdessen sollten Sie den Origin-Wert des Benutzers zurückgeben. Zum Beispiel:Access-Control-Allow-Origin: http://www.example.com
Dieser Header erlaubt nur
http://www.example.com
den Zugriff auf die Antwortdaten.quelle
Die Absicht von CORS ist es, Ursprungsübergreifende Anforderungen für XHR-Anforderungen zuzulassen und dem Server die Berechtigung zu geben, anzugeben, welcher Ursprung Zugriff auf welche Ressource hat. Insbesondere hat CORS das Origin- Headerfeld eingeführt, mit dem der Server reguläre und mögliche XHR-Anforderungen unterscheiden kann. Dieses Header-Feld kann vom Benutzer nicht festgelegt oder geändert werden, wird jedoch vom Browser für XHR-Anforderungen festgelegt.
Wenn Sie also eine API haben, die nur von XHR verwendet werden soll, können (und sollten) Sie verlangen, dass die Anforderung mit CORS übereinstimmt. Insbesondere, wenn die Anforderungen auch den Status auf Ihrem Server ändern können, da Sie sonst für CSRF anfällig wären.
Beachten Sie, dass CSRF-Angriffe unabhängig von CORS mit anderen Methoden zum Fälschen von GET- und POST-Anforderungen möglich sind. CORS ermöglicht nur dann den Zugriff auf die Antwort des Servers auf XHR-Anforderungen mit JavaScript, wenn der Server dies zulässt.
quelle