Domainübergreifendes POSTing

145

Ich habe überall Artikel und Beiträge (einschließlich SO) zu diesem Thema gesehen, und der vorherrschende Kommentar lautet, dass die Richtlinie mit demselben Ursprung ein Formular POST über Domänen hinweg verhindert. Der einzige Ort, an dem ich jemanden gesehen habe, der vorschlägt, dass die Richtlinie mit demselben Ursprung nicht für die Erstellung von Posts gilt, ist hier .

Ich hätte gerne eine Antwort von einer "offiziellen" oder formelleren Quelle. Kennt jemand beispielsweise den RFC, der angibt, wie sich derselbe Ursprung auf einen Formular-POST auswirkt oder nicht?

Klarstellung : Ich frage nicht, ob ein GET oder POST erstellt und an eine Domain gesendet werden kann. Ich frage:

  1. Wenn Chrome, IE oder Firefox es Inhalten aus der Domäne "Y" erlauben, einen POST an die Domäne "X" zu senden.
  2. Wenn der Server, der den POST empfängt, tatsächlich überhaupt keine Formularwerte sieht. Ich sage dies, weil die Mehrheit der Online-Diskussionstester Tester aufzeichnet, die sagten, der Server habe den Beitrag erhalten, aber die Formularwerte waren alle leer / entfernt.
  3. In welchem ​​offiziellen Dokument (dh RFC) wird das erwartete Verhalten erläutert (unabhängig davon, was die Browser derzeit implementiert haben).

Im Übrigen macht es etwas offensichtlicher, warum Anti-Fälschungs-Token notwendig sind, wenn derselbe Ursprung keine Auswirkungen auf Form-POSTs hat. Ich sage "etwas", weil es zu leicht zu glauben scheint, dass ein Angreifer einfach ein HTTP-GET ausgeben könnte, um ein Formular abzurufen, das das Anti-Fälschungs-Token enthält, und dann einen illegalen POST zu erstellen, der dasselbe Token enthält. Bemerkungen?

Brent Arien
quelle
Ja, ein Angreifer könnte das tun ... mit einem normalen Webbrowser.
Michael Hampton
Vielleicht gibt es aus dem gleichen Grund keine RFCs, warum es keine RFCs gibt, die sagen: "Veröffentlichen Sie Ihr Passwort nicht auf Ihrer Website". Webstandards sind nur erforderlich, wenn mehrere Parteien zusammenarbeiten müssen, um etwas zu erreichen: Dieselbe Ursprungsrichtlinie ist eher ein komplexer Satz von "Best Practices für die Sicherheit", die verhindern, dass Benutzer gehackt werden.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
@Ciro Bitte explizit sagen. Die Regeln für das Cross-Posting auf andere Websites wirken sich nicht auf mehrere Parteien aus. Keine Notwendigkeit für die neblige Sprache.
Little Alien

Antworten:

175

Die gleiche Ursprungsrichtlinie gilt nur für browser-seitige Programmiersprachen. Wenn Sie also versuchen, mit JavaScript auf einem anderen Server als dem Ursprungsserver zu posten, kommt dieselbe Ursprungsrichtlinie ins Spiel, aber wenn Sie direkt aus dem Formular posten, dh die Aktion zeigt auf einen anderen Server wie:

<form action="http://someotherserver.com">

Wenn beim Versenden des Formulars kein Javascript erforderlich ist, gilt dieselbe Ursprungsrichtlinie nicht.

Weitere Informationen finden Sie in Wikipedia

Suresh Kumar
quelle
18
Es tut uns leid, eine alte Frage hochzuziehen. Was würde passieren, wenn die Aktion mit JS geändert würde, das Formular dann aber über eine Schaltfläche veröffentlicht würde? Würde dies einen erfolgreichen domänenübergreifenden Beitrag ermöglichen?
Chris
AFAIK es sollte kein Problem sein, aber ich habe es nicht selbst versucht. Wäre interessant herauszufinden.
Suresh Kumar
2
Ich bin der gleiche Gedanke. Ich hatte tatsächlich Bedenken hinsichtlich der Sicherheit, einige JS / Viren von Drittanbietern änderten die Aktion, um das Formular an einem böswilligen Ort zu veröffentlichen, stellten jedoch fest, dass dies für jede Zahlung möglich war, die ein Formular domänenübergreifend erhielt oder nicht, und das Ergebnis wäre dasselbe. Lektion hier wirklich: Überprüfen Sie alle JS-Dateien von Drittanbietern;)
Chris
20
Kurz gesagt: JA, domänenübergreifendes POSTing ist zulässig.
Christian Davén
17
-1 für: Dieselbe Ursprungsrichtlinie hat nichts mit dem Senden einer Anfrage an eine andere URL (anderes Protokoll oder eine andere Domäne oder einen anderen Port) zu tun. Es geht darum, den Zugriff auf (Lesen) von Antwortdaten von einer anderen URL zu beschränken (und dadurch zu verhindern, dass Javascript das Dokument aktualisiert Formulare mit Sicherheitstoken von anderen URLs).
Mohsenme
43

Es ist möglich, eine beliebige GET- oder POST-Anforderung zu erstellen und an jeden Server zu senden, auf den ein Opferbrowser zugreifen kann. Dies schließt Geräte in Ihrem lokalen Netzwerk ein, z. B. Drucker und Router.

Es gibt viele Möglichkeiten, einen CSRF-Exploit zu erstellen. Ein einfacher POST-basierter CSRF-Angriff kann mithilfe der .submit()Methode gesendet werden . Komplexere Angriffe, wie z. B. standortübergreifende CSRF-Angriffe zum Hochladen von Dateien, nutzen die CORS-Verwendung des Verhaltens xhr.withCredentals aus .

CSRF verstößt nicht gegen die Same-Origin-Richtlinie für JavaScrip t, da in der SOP JavaScript die Antwort des Servers auf eine Clientanforderung liest . CSRF-Angriffe kümmern sich nicht um die Antwort, sondern um einen Nebeneffekt oder eine Statusänderung, die durch die Anforderung hervorgerufen wird, z. B. das Hinzufügen eines Administratorbenutzers oder das Ausführen von beliebigem Code auf dem Server.

Stellen Sie sicher, dass Ihre Anforderungen mit einer der im OWASP CSRF Prevention Cheat Sheet beschriebenen Methoden geschützt sind . Weitere Informationen zu CSRF finden Sie auf der OWASP-Seite zu CSRF .

Mikey
quelle
Ich habe meine Frage zur Klärung aktualisiert. Außerdem enthält der von Ihnen angegebene WordPress-Link Exploits, die von X mit demselben Ursprung initiiert wurden, anstatt von domänenübergreifendem Y initiiert zu werden. Aus meiner Sicht ist dies also nicht das richtige Szenario.
Brent Arias
@Brent Arias Ja, was Sie in 1 und 2 beschreiben, entspricht genau der Leistung eines CSRF-Angriffs. Vielleicht sollten Sie versuchen, einen der bereitgestellten CSRF-Exploits auszuführen und den Datenverkehr zu überwachen. Ich habe meinen Beitrag aktualisiert. Sie sollten jeden bereitgestellten Link lesen, da er diese Fragen genau beantwortet. Der Punkt eines CSRF-Angriffs (Cross-Site Request Forgery) ist, dass die Anfrage von einer anderen Domäne stammt. Alle bereitgestellten Exploits erfüllen diese grundlegende Anforderung vollständig.
Mikey
16

Dieselbe Ursprungsrichtlinie hat nichts mit dem Senden einer Anfrage an eine andere URL (anderes Protokoll oder Domäne oder Port) zu tun.

Es geht darum, den Zugriff auf (Lesen) von Antwortdaten von einer anderen URL zu beschränken. So kann JavaScript-Code innerhalb einer Seite an eine beliebige Domain gesendet oder Formulare innerhalb dieser Seite an eine beliebige Stelle gesendet werden (es sei denn, das Formular befindet sich in einem Iframe mit einer anderen URL).

Was diese POST-Anforderungen jedoch ineffizient macht, ist, dass diesen Anforderungen Antiforgery-Token fehlen und daher von der anderen URL ignoriert werden. Wenn das JavaScript versucht, diese Sicherheitstoken abzurufen, indem es eine AJAX-Anfrage an die URL des Opfers sendet, wird der Zugriff auf diese Daten durch die Same Origin-Richtlinie verhindert.

Ein gutes Beispiel: hier

Und eine gute Dokumentation von Mozilla: hier

Mohsenme
quelle