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-Options
Header 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 SAMEORIGIN
oder DENY
.
Das Problem ist, dass es so aussieht, als würde das Senden von ALLOW-FROM domain
Ergebnissen 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.com
eine deutlich andere TLD als http://www.enhanceie.com
. Der Frame zeigt jedoch weiterhin Inhalte an.
Gibt es einen Einblick, ob dies X-Frame-Options
wirklich mit ALLOW-FROM
relevanten (Desktop-) Browsern implementiert ist? Vielleicht hat sich die Syntax geändert?
Einige interessante Links:
- Entwurf eines RFC für X-Frame-Optionen: http://tools.ietf.org/html/draft-gondrom-frame-options-01
- Der Artikel von developer.mozilla beschreibt den Header als Header mit zwei Optionen (sameorigin oder verweigern). https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options
- MSDN-Blog, der das Ganze initiiert hat: http://blogs.msdn.com/b/ie/archive/2009/01/27/ie8-security-part-vii-clickjacking-defenses.aspx
- msdn-Blog, in dem drei Werte behandelt werden: Hinzufügen des zulässigen Ursprungs http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking-with-x-frame-options.aspx
Antworten:
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?
quelle
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!
quelle
X-Content-Security-Policy
kein browserübergreifendes Analogon fürALLOW-FROM
. Firefox unterstütztframe-ancestors
und eine kommende Spezifikation unterstütztframe-options
. Derzeit unterstützt Chrome diese nurframe-ancestors
hinter einem Laufzeitflag.frame-src
ist verfügbar, dies ist jedoch der übergeordnete Frame, der untergeordnete Frames steuert, und nicht der untergeordnete Frame, der die zulässigen übergeordneten Frames angibt.Content-Security-Policy
wird jetzt gut unterstützt .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-from
Headers für Chrome zu vermeiden (Ausgabefehler auf der Konsole).Einzelheiten finden Sie in meiner Antwort hier.
quelle