Ich beschäftige mich eingehender mit der Entwicklung von RESTful-APIs und habe bisher mit einigen verschiedenen Frameworks gearbeitet, um dies zu erreichen. Natürlich bin ich auf die Richtlinie mit demselben Ursprung gestoßen, und jetzt frage ich mich, wie Webserver (und nicht Webbrowser) dies erzwingen. Soweit ich weiß, scheint eine gewisse Durchsetzung am Ende des Browsers zu erfolgen (z. B. das Einhalten eines von einem Server empfangenen Access-Control-Allow-Origin-Headers). Aber was ist mit dem Server?
Angenommen, ein Webserver hostet eine Javascript-Webanwendung, die auf eine API zugreift, die ebenfalls auf diesem Server gehostet wird. Ich gehe davon aus, dass der Server dieselbe Richtlinie erzwingt, sodass nur das auf diesem Server gehostete Javascript auf die API zugreifen kann. Dies würde jemanden davon abhalten, einen Javascript-Client für diese API zu schreiben und auf einer anderen Site zu hosten, oder? Wie kann ein Webserver einen böswilligen Client stoppen, der versucht, AJAX-Anforderungen an seine API-Endpunkte zu senden, während er behauptet, Javascript auszuführen, das von demselben Webserver stammt? Wie schützen die meisten gängigen Server (Apache, Nginx) vor solchen Angriffen? Oder ist mein Verständnis davon irgendwie falsch?
Oder wird die ursprungsübergreifende Richtlinie nur auf Client-Seite durchgesetzt?
Antworten:
Dieselbe Ursprungsrichtlinie ist eine vollständig clientbasierte Einschränkung und dient in erster Linie dem Schutz von Benutzern und nicht von Diensten . Alle oder die meisten Browser enthalten einen Befehlszeilenschalter oder eine Konfigurationsoption zum Deaktivieren. Die SOP ist wie Sicherheitsgurte in einem Auto: Sie schützen den Fahrer im Auto, aber jeder kann frei entscheiden, sie nicht zu benutzen. Erwarten Sie auf keinen Fall, dass der Sicherheitsgurt eine Person davon abhält, aus dem Auto auszusteigen und Sie anzugreifen (oder auf Ihren Webdienst zuzugreifen).
Angenommen, ich schreibe ein Programm, das auf Ihren Webdienst zugreift. Es ist nur ein Programm, das TCP-Nachrichten mit HTTP-Anforderungen sendet. Sie fordern einen serverseitigen Mechanismus, um zwischen Anforderungen meines Programms (das alles senden kann) und Anforderungen eines Browsers mit einer Seite zu unterscheiden, die von einem zulässigen Ursprung geladen wurde. Das geht einfach nicht. Mein Programm kann immer eine Anfrage senden, die mit einer von einer Webseite gebildeten Anfrage identisch ist.
Die Richtlinie mit demselben Ursprung wurde erfunden, weil sie verhindert, dass Code von einer Website auf Inhalte mit eingeschränkten Anmeldeinformationen auf einer anderen Website zugreift . Ajax-Anfragen werden standardmäßig mit allen von der Ziel-Site gewährten Authentifizierungs-Cookies gesendet. Nehmen wir zum Beispiel an, ich lade versehentlich
http://evil.com/
, was eine Anfrage nach sendethttp://mail.google.com/
. Wenn die SOP nicht vorhanden war und ich bei Google Mail angemeldet war, konnte das Skriptevil.com
unter meinen Posteingang sehen. Wenn die Website ohne meine Cookiesevil.com
geladenmail.google.com
werden soll, kann sie nur einen Proxyserver verwenden. Die öffentlichen Inhalte vonmail.google.com
sind kein Geheimnis (aber die Inhalte, auf diemail.google.com
ich mit meinen Cookies zugreife, sind ein Geheimnis).quelle
Die Richtlinie mit demselben Ursprung wird auf der Clientseite durchgesetzt. Wenn der Browser CORS unterstützt , kann der Server Header zurücksenden , die den Browser anweisen , Ausnahmen von der Richtlinie desselben Ursprungs zu machen. Zum Beispiel das Senden des Headers
würde den Browser anweisen, ursprungsübergreifende Anfragen von www.example.com zuzulassen.
Weist den Browser an, alle ursprungsübergreifenden Anforderungen an diese Ressource zuzulassen.
quelle
Webserver verhindern Angriffe dieser Art im Allgemeinen, indem sie die (infamely mispelled)
Referer
Zeile im HTTP-Header überprüfen , um sicherzustellen, dass eine Anforderung von einer Seite auf ihrer eigenen Site stammt. Es gibt keine gute Möglichkeit, sich vor einem böswilligen Client zu schützen, aber so funktionieren XSRF-Angriffe nicht.Der Client ist nicht böswillig. Im Allgemeinen handelt es sich um einen normalen Benutzer, der von einem böswilligen Dritten dazu verleitet wurde, ein Dokument zu öffnen, das eine HTTP-Anfrage unter Verwendung der vom Kunden gespeicherten Cookies im Hintergrund stellt. Wenn der Server also überprüfen kann, ob
Referer
die HTTP-Anforderung von gmail.com und nicht von MyAwesomeWebsite.com stammt, kann er den Angriff beenden.quelle
Referer
Zeile wird vom Webbrowser des Benutzers generiert, und der Benutzer ist hier das Opfer und nicht der Angreifer. Er hat keinen Grund, die zu fälschenReferer
, und der Angreifer hat keine Gelegenheit dazu.Kurz gesagt, sie tun es nicht, wie Apsillers und Dirk betonten .
Ein wichtiger Grund ist, dass der ACAO-Header die Server selbst vor zügellosen DDOS-, Distributed Denial of Service- Angriffen schützt .
Wer:
Das ACAO als HTTP-Antwortheader ist für die Interpretation des Webclients gedacht. Dabei wird davon ausgegangen, dass die Mehrheit der menschlichen Internetnutzer über die wichtigsten Browser-Anbieter im Internet surft, die den vom W3C empfohlenen Entwurf einhalten und implementieren . Schließlich sollten die meisten von ihnen von einem schnellen und zugänglichen Internet profitieren.
Wie:
Andernfalls könnte jeder einfach ein paar Zeilen Javascript-Code kopieren und in eine schädliche Website einfügen, die eine einfache Schleife ausführt, die eine Ajax-GET- oder POST-Anfrage an eine fremde Domain sendet. Ohne Benutzerinteraktion und Multithreading.
Aus diesem Grund müssen Sie sich für den Zugriff auf eine ursprungsübergreifende Site über den ACAO-HTTP-Header anmelden . Sie als Benutzer können jederzeit über eine benutzerfreundliche Interaktion, dh einen Internetlink, auf diese Site zugreifen. Genauso wie Sie benutzerorientierte Inhalte aus oder in Ihre Zwischenablage kopieren oder einfügen können, aber nicht anders - Plugins beiseite.
Zukunft:
Beachten Sie zu diesem Zeitpunkt die folgenden Anweisungen des Webbrowser-Herstellers:
Sicherheitsbeschränkungen können mithilfe einer Kombination aus TSL 2/3, starken Sitzungs-IDs, TANs, Zwei-Faktor-Authentifizierung usw. angemessen festgelegt werden.
"Google" hat dies zu zeigen und über DDOS zu sagen
Schließlich kann jeder beliebige Webinhalte per Proxy übertragen und einen gewünschten ACAO-Header hinzufügen, um auf den Cross-Site- Proxy-Inhalt zuzugreifen. Ebenso ist dieser Proxy dann für einen DDOS-Angriff so offen, wie es die ACAO-Einstellung zulässt. Ich kenne kein einziges kostenloses öffentliches Dienstleistungsangebot. Bitte korrigieren Sie mich, wenn ich falsch liege.
quelle
Wie andere gesagt haben, liegt es am Kunden. Möglicherweise muss der Server jedoch mit XSS umgehen, wodurch die SOP umgangen wird.
Mit Supopse your server können Benutzer Inhalte hochladen, die angezeigt werden, wenn andere Benutzer auf Ihrer Website surfen. Diese Seite ist ein gutes Beispiel - ich habe gerade Inhalte hochgeladen und sie werden Ihnen angezeigt.
Wenn mein Inhalt das
<script>
Tag enthält und der Server es nur in den von ihm generierten HTML-Code kopiert, wird das von mir hochgeladene Skript ausgeführt.Da das Skript in HTML aus Ihrer Datei gefunden wurde, verfügt es über alle Berechtigungen des Skripts Ihrer Site. Es kann zum Beispiel diese Antwort unterstützen. Und deshalb hat diese Antwort so viele positive Stimmen.
Ein guter Webserver (wie der von StackExchange) lässt dies leider nicht zu. Es kann das
<script>
Tag entfernen oder es maskieren, so dass es gesehen, aber nicht ausgeführt wird (Warnung - diese Antwort ist weit von einem zuverlässigen Rezept zur Verhinderung von XSS entfernt).Es ist also die Client-Seite, die SOP erzwingt, aber in einigen Fällen sollte der Server arbeiten, um eine Umgehung zu verhindern.
quelle