2012-05-18 16 views
50

Ich bin die Umsetzung eines "Pass-Through" für X-Frame-Options eine Partnerseite meines Arbeitgebers wickelt Website in einem Iframe zu lassen, gemäß diesem Artikel: http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspxX-Frame-Options: allow-FROM in Firefox und Chrome

(Aufteilen der URLs zum Posten)

Kurz gesagt, die Seite unseres Partners hat einen iframe mit einer URL für unsere Domain. Für jede Seite in unserer Domain fügen sie ein spezielles URL-Argument wie &@mykey=topleveldomain.com hinzu und sagen uns, was die Top-Level-Domain der Seite ist.

Unsere Filter holen die Partner-TLD, falls vorhanden, von der URL ab und validieren sie gegen eine Whitelist. Wenn es in der Liste ist, versenden wir die X-Frame-Options Kopfzeile mit dem Wert ALLOW-FROM topleveldomain.com (und fügen ein Cookie für zukünftige Klicks hinzu). Wenn es nicht auf unserer Whitelist ist, versenden wir SAMEORIGIN oder DENY.

Das Problem ist, es sieht aus wie Senden ALLOW-FROM domain Ergebnisse in einem No-Op-Overall für den neuesten Firefox und Google Chrome. Zumindest scheint IE8 ALLOW-FROM korrekt zu implementieren.

Schauen Sie sich diese Seite an: http://www.enhanceie.com/test/clickjack. Unmittelbar nach der 5. (von 5) Boxen, die "Inhalt zeigen soll", ist eine Box, die Inhalt nicht zeigen sollte, aber das ist. In diesem Fall sendet die Seite im Iframe X-Frame-Options: ALLOW-FROM http://www.debugtheweb.com, eine deutlich andere TLD als http://www.enhanceie.com. Der Rahmen zeigt jedoch immer noch Inhalt an.

Gibt es einen Einblick, ob X-Frame-Options wirklich mit ALLOW-FROM über relevante (Desktop-) Browser implementiert ist? Vielleicht hat sich die Syntax geändert?

Einige Links von Interesse:

+0

Wenn Sie etwas mehr auf eigene Faust Figur dann fühlen sich frei, Ihre eigene Antwort zu schreiben. Du bekommst eine Erwähnung von mir! – Prestaul

+0

Ein Patch wurde gestern für Firefox hinzugefügt: https://bugzilla.mozilla.org/show_bug.cgi?id=690168 Wir werden sehen, ob es die Überprüfung durchmacht und bald auf einen Browser in Ihrer Nähe ... – Prestaul

+0

Old quesiton , aber für die Nachwelt - die Methode, die Sie beschrieben haben (die TLD als Argument an den iframe übergeben), würde sehr leicht von jedem besiegt werden, der Ihre Inhalte einbetten möchte. Sie würden nur die Quelle anzeigen, sehen, was Sie tun, und kopieren/einfügen. Da ALLOW-FROM noch nicht zuverlässig ist, könnten Sie einen gemeinsamen geheimen Schlüssel verwenden, der mit der aktuellen Uhrzeit (innerhalb eines Fensters) verschlüsselt und in die iframe-URL aufgenommen wird. Überprüfen Sie auf der Iframe-Seite das Hashed Shared Secret. Content-Diebe könnten diesen Hash stehlen, aber es würde nur für ein kurzes Fenster funktionieren und effektiv nicht autorisierte Einbettungen blockieren. – Mark

Antwort

30

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

Sie sind bereits dabei, einen benutzerdefinierten Header zu erstellen und senden Sie es mit den richtigen Daten, können Sie nicht nur die Kopfzeile auszuschließen, wenn Sie es von einem gültigen Partner erkennen und DENY zu jedem anderen hinzufügen anfordern? Ich sehe den Vorteil von AllowFrom nicht, wenn Sie die Logik bereits dynamisch aufbauen?

+0

Er implementiert die 4-Stufen-Sicherheit unter der Tokens-Überschrift auf der verlinkten msdn-Seite, die leider nicht in Chrome und Safari funktionieren wird. – rbrc

+0

Ja, ich weiß, weshalb ich vorgeschlagen habe, es umgekehrt zu machen. – Kinlan

+4

Er würde dann auf den Referer Header schauen, was eine gute Möglichkeit ist, es zu tun, obwohl Referer Spoofing am Leben und gesund ist. Es ist wesentlich schwieriger zu tun, wenn alle betroffenen Seiten HTTPS sind. AllowFrom wäre definitiv vorzuziehen. – rbrc

16

Ich postete diese Frage und sah nie das Feedback (das in einigen Monaten kam, scheint es :).

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

Die Lösung war, basierend auf Browser-Typ zu verzweigen. Für IE, Schiff X-Frame-Options. Für alle anderen versenden Sie X-Content-Security-Policy.

Hoffe, das hilft, und Entschuldigung, dass Sie so lange brauchen, um die Schleife zu schließen!

+5

In seiner aktuellen Form bietet 'X-Content-Security-Policy' kein browserübergreifendes Analog für' ALLOW-FROM'. Firefox unterstützt 'frame-awesome' und eine kommende Spezifikation unterstützt' frame-options'. Momentan unterstützt Chrome nur diese 'Frame-Vorfahren' hinter einem Laufzeit-Flag. 'frame-src' ist verfügbar, aber dies ist der übergeordnete Rahmen, der untergeordnete Rahmen steuert, und nicht der untergeordnete Rahmen, der seine erlaubten Eltern angibt. –

3

Für Chrome statt

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

benötigen Sie 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); 

auf die HTTP-Response-Header hinzuzufügen.
Beachten Sie, dass davon ausgegangen wird, dass Sie auf dem Server überprüft haben, ob refAuth zulässig ist oder nicht.
Und beachten Sie, dass Sie Browser-Erkennung durchführen müssen, um die allow-from Header für Chrome (Ausgaben Fehler auf der Konsole) zu vermeiden.

Weitere Informationen finden Sie my answer here.

+0

Wenn Sie Clickjacking vermeiden möchten, kann Content-Security-Policy verwendet werden, aber definitiv nicht, indem Sie das Attribut 'default-src' hinzufügen, da dies völlig unterschiedliche Auswirkungen hat. Sie werden die 'Frame-Vorfahren' verwenden wollen. Das ist ähnlich wie bei den X-Frame-Optionen, und es ist etwas flexibler, da Sie damit mehrere Domains angeben können. Siehe: https://martijnvanlambalgen.wordpress.com/2015/06/28/clickjacking/ – Myrddin81