X-Frame-Optionen: ALLOW-FROM in Firefox und Chrome

74

Ich implementiere ein "Pass-Through" X-Frame-Options, damit eine Partner-Site die Site meines Arbeitgebers in einen Iframe einschließt, wie in diesem Artikel beschrieben: http://blogs.msdn.com/b/ieinternals/archive/2010/03/30 /combating-clickjacking-with-x-frame-options.aspx

(Aufteilen von URLs zum Posten)

Kurz gesagt, die Seite unseres Partners enthält einen Iframe mit einer URL für unsere Domain. Für jede Seite in unserer Domain wird ein spezielles URL-Argument hinzugefügt &@mykey=topleveldomain.com, das uns die Top-Level-Domain der Seite angibt.

Unsere Filter nehmen die Partner-TLD, falls angegeben, von der URL auf und validieren sie anhand einer Whitelist. Wenn es auf der Liste steht, versenden wir den X-Frame-OptionsHeader mit Wert ALLOW-FROM topleveldomain.com(und fügen ein Cookie für zukünftige Klicks hinzu). Wenn es nicht auf unserer Whitelist steht, versenden wir SAMEORIGINoder DENY.

Das Problem ist, dass es so aussieht, als würde das Senden von ALLOW-FROM domainErgebnissen für die neuesten Versionen von Firefox und Google Chrome insgesamt zu einem No-Op führen. Zumindest IE8 scheint korrekt implementiert zu sein ALLOW-FROM.

Schauen Sie sich diese Seite an: http://www.enhanceie.com/test/clickjack . Direkt nach dem 5. (von 5) Feld, in dem "Inhalt angezeigt werden soll", befindet sich ein Feld, in dem KEIN Inhalt angezeigt werden soll, das jedoch vorhanden ist. In diesem Fall sendet die Seite im Iframe X-Frame-Options: ALLOW-FROM http://www.debugtheweb.comeine deutlich andere TLD als http://www.enhanceie.com. Der Frame zeigt jedoch weiterhin Inhalte an.

Gibt es einen Einblick, ob dies X-Frame-Optionswirklich mit ALLOW-FROMrelevanten (Desktop-) Browsern implementiert ist? Vielleicht hat sich die Syntax geändert?

Einige interessante Links:

rauben
quelle
Wenn Sie selbst etwas mehr herausfinden, können Sie gerne Ihre eigene Antwort posten. Du wirst eine positive Bewertung von mir bekommen!
Prestaul
Ein Patch für Firefox wurde gestern hinzugefügt: bugzilla.mozilla.org/show_bug.cgi?id=690168 Wir werden sehen, ob es bald durch die Überprüfung und in einen Browser in Ihrer Nähe kommt ...
Prestaul
Alte Frage, aber für die Nachwelt - die von Ihnen beschriebene Methode (Übergabe der TLD als Argument an den Iframe) kann von jedem, der Ihre Inhalte einbetten möchte, sehr leicht besiegt werden. Sie würden nur die Quelle anzeigen, sehen, was Sie tun, und kopieren / einfügen. Da ALLOW-FROM noch nicht zuverlässig ist, können Sie ein gemeinsames Geheimnis verwenden, das mit der aktuellen Zeit (innerhalb eines Fensters) kryptografisch gehasht und in die iframe-URL aufgenommen wird. Überprüfen Sie auf der Iframe-Seite das gemeinsame Hash-Geheimnis. Inhaltsdiebe könnten diesen Hash stehlen, aber es würde nur für ein kurzes Fenster funktionieren und nicht autorisierte Einbettungen effektiv blockieren.
Mark

Antworten:

41

ALLOW-FROM wird in Chrome oder Safari nicht unterstützt. Siehe MDN-Artikel: https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options

Sie arbeiten bereits daran, einen benutzerdefinierten Header zu erstellen und ihn mit den richtigen Daten zu senden. Können Sie den Header nicht einfach ausschließen, wenn Sie feststellen, dass er von einem gültigen Partner stammt, und jeder anderen Anforderung DENY hinzufügen? Ich sehe den Vorteil von AllowFrom nicht, wenn Sie die Logik bereits dynamisch aufbauen?

Kinlan
quelle
Er implementiert die 4-Stufen-Sicherheit unter der Überschrift Tokens auf der verlinkten MSDN-Seite, die in Chrome und Safari leider nicht funktioniert.
rbrc
Ja, ich weiß, deshalb habe ich vorgeschlagen, es umgekehrt zu machen.
Kinlan
4
Er würde sich dann den Referer-Header ansehen, was eine anständige Methode ist, obwohl Referer-Spoofing lebendig und gut ist. Dies ist erheblich schwieriger, wenn alle fraglichen Seiten HTTPS sind. AllowFrom wäre definitiv vorzuziehen.
rbrc
Danke für die Antwort und den Vorschlag!
Rob
3
Entschuldigung, Änderungen haben meine Erklärung abgeschnitten! Wir haben entschieden, dass HTTP_REFERER, das vom Client stammt, ein unzuverlässiger Mechanismus ist, um die Entscheidung zu steuern. Außerdem haben wir festgestellt, dass einige Browser (ich glaube insbesondere an den Internet Explorer) HTTP_REFERER nicht von der iframe-haltigen Seite der obersten Ebene weitergeben. Wir konnten also nicht zuverlässig feststellen, wer uns vom Server aus umrahmt hat.
Rob
23

Ich habe diese Frage gestellt und das Feedback nie gesehen (das anscheinend einige Monate später eingegangen ist :).

Wie Kinlan erwähnt hat, wird ALLOW-FROM nicht in allen Browsern als X-Frame-Options-Wert unterstützt.

Die Lösung bestand darin, basierend auf dem Browsertyp zu verzweigen. Versenden Sie für IE X-Frame-Optionen . Versenden Sie für alle anderen X-Content-Security-Policy .

Ich hoffe, das hilft und tut mir leid, dass ich so lange gebraucht habe, um den Kreis zu schließen!

rauben
quelle
7
Bietet in seiner aktuellen Form X-Content-Security-Policykein browserübergreifendes Analogon für ALLOW-FROM. Firefox unterstützt frame-ancestorsund eine kommende Spezifikation unterstützt frame-options. Derzeit unterstützt Chrome diese nur frame-ancestorshinter einem Laufzeitflag. frame-srcist verfügbar, dies ist jedoch der übergeordnete Frame, der untergeordnete Frames steuert, und nicht der untergeordnete Frame, der die zulässigen übergeordneten Frames angibt.
JT.
9

Für Chrome anstelle von

response.AppendHeader("X-Frame-Options", "ALLOW-FROM " + host);

Sie müssen hinzufügen Content-Security-Policy

string selfAuth = System.Web.HttpContext.Current.Request.Url.Authority;
string refAuth = System.Web.HttpContext.Current.Request.UrlReferrer.Authority;
response.AppendHeader("Content-Security-Policy", "default-src 'self' 'unsafe-inline' 'unsafe-eval' data: *.msecnd.net vortex.data.microsoft.com " + selfAuth + " " + refAuth);

zu den HTTP-Antwortheadern.
Beachten Sie, dass dies voraussetzt, dass Sie auf dem Server überprüft haben, ob refAuth zulässig ist oder nicht.
Beachten Sie außerdem, dass Sie eine Browsererkennung durchführen müssen, um das Hinzufügen des allow-fromHeaders für Chrome zu vermeiden (Ausgabefehler auf der Konsole).

Einzelheiten finden Sie in meiner Antwort hier.

Stefan Steiger
quelle
7
Wenn Sie Clickjacking vermeiden möchten, kann Content-Security-Policy verwendet werden, aber definitiv nicht durch Hinzufügen des Attributs 'default-src', da dies völlig andere Auswirkungen hat. Sie sollten die "Frame-Vorfahren" verwenden. Das ähnelt den X-Frame-Optionen und ist etwas flexibler, da Sie mehrere Domänen angeben können. Siehe: martijnvanlambalgen.wordpress.com/2015/06/28/clickjacking
Myrddin81