Ich habe eine ASP.NET 4.0 IIS7.5-Site, die ich mit dem X-Frame-Options-Header sichern muss.
Ich muss auch aktivieren, dass meine Seiten von meiner Domain sowie von meiner Facebook-App aus iframed werden.
Derzeit habe ich meine Site mit einer Site mit der Überschrift konfiguriert:
Response.Headers.Add("X-Frame-Options", "ALLOW-FROM SAMEDOMAIN, www.facebook.com/MyFBSite")
Wenn ich meine Facebook-Seite mit Chrome oder Firefox angesehen habe, werden die Seiten meiner Websites (die mit meiner Facebook-Seite versehen sind) in Ordnung angezeigt, aber unter IE9 wird folgende Fehlermeldung angezeigt:
"Diese Seite kann nicht angezeigt werden ..." (aufgrund der
X-Frame_Options
Einschränkung).
Wie stelle ich ein X-Frame-Options: ALLOW-FROM
, dass mehr als eine einzelne Domain unterstützt wird?
X-FRAME-OPTION
Eine neue Funktion zu sein, scheint grundlegend fehlerhaft zu sein, wenn nur eine einzige Domäne definiert werden kann.
Antworten:
X-Frame-Options
ist veraltet. Von MDN :Die moderne Alternative ist der
Content-Security-Policy
Header, der zusammen mit vielen anderen Richtlinien mithilfe derframe-ancestors
Direktive auflisten kann, welche URLs Ihre Seite in einem Frame in einem Frame hosten dürfen .frame-ancestors
unterstützt mehrere Domänen und sogar Platzhalter, zum Beispiel:Leider unterstützt Internet Explorer die Content-Security-Policy derzeit nicht vollständig .
UPDATE: MDN hat den Verfallskommentar entfernt. Hier ist ein ähnlicher Kommentar von W3Cs Content Security Policy Level
quelle
X-Frame-Options
geändert und ist jetzt weniger streng. Es ist ein guter Punkt, dass es riskant ist, eine Spezifikation zu verwenden, die nicht finalisiert ist. Vielen Dank!X-Frame-Options
nicht mehrere Quellen unterstützt.Aus RFC 7034 :
So,
Das kannst du nicht. Um dieses Problem zu umgehen, können Sie verschiedene URLs für verschiedene Partner verwenden. Für jede URL können Sie einen eigenen
X-Frame-Options
Wert verwenden. Beispielsweise:Denn
yousite.com
du kannst es einfach benutzenX-Frame-Options: deny
.BTW , denn jetzt Chrome (und alle Webkit-basierten Browsern) unterstützt keine
ALLOW-FROM
Aussagen überhaupt.quelle
ALLOW-FROM
Verwendung des von Ihnen angegebenen Links unterstützt .Nekromantie.
Die angegebenen Antworten sind unvollständig.
Erstens können Sie, wie bereits gesagt, nicht mehrere zulässige Hosts hinzufügen, was nicht unterstützt wird.
Zweitens müssen Sie diesen Wert dynamisch aus dem HTTP-Referrer extrahieren. Dies bedeutet, dass Sie den Wert nicht zu Web.config hinzufügen können, da er nicht immer der gleiche Wert ist.
Es ist erforderlich, eine Browsererkennung durchzuführen, um zu vermeiden, dass bei Chrome ein Browser hinzugefügt wird (dies führt zu einem Fehler in der Debug-Konsole, der die Konsole schnell füllen oder die Anwendung verlangsamen kann). Dies bedeutet auch, dass Sie die ASP.NET-Browsererkennung ändern müssen, da Edge fälschlicherweise als Chrome identifiziert wird.
Dies kann in ASP.NET durch Schreiben eines HTTP-Moduls erfolgen, das bei jeder Anforderung ausgeführt wird und das abhängig vom Referrer der Anforderung für jede Antwort einen http-Header anfügt. Für Chrome muss eine Inhaltssicherheitsrichtlinie hinzugefügt werden.
Sie müssen die Funktion context_EndRequest in der Init-Funktion des HTTP-Moduls registrieren.
Als nächstes müssen Sie das Modul zu Ihrer Anwendung hinzufügen. Sie können dies entweder programmgesteuert in Global.asax tun, indem Sie die Init-Funktion der HttpApplication wie folgt überschreiben:
oder Sie können Einträge zu Web.config hinzufügen, wenn Sie den Quellcode der Anwendung nicht besitzen:
Der Eintrag in system.webServer ist für IIS7 +, der andere in system.web ist für IIS 6.
Beachten Sie, dass Sie runAllManagedModulesForAllRequests auf true setzen müssen, damit es ordnungsgemäß funktioniert.
Die Zeichenfolge vom Typ hat das Format
"Namespace.Class, Assembly"
. Beachten Sie, dass VB, wenn Sie Ihre Assembly in VB.NET anstelle von C # schreiben, für jedes Projekt einen Standard-Namespace erstellt, sodass Ihre Zeichenfolge wie folgt aussiehtWenn Sie dieses Problem vermeiden möchten, schreiben Sie die DLL in C #.
quelle
Wie wäre es mit einem Ansatz, der nicht nur mehrere Domänen zulässt, sondern auch dynamische Domänen.
Der Anwendungsfall hier ist ein Sharepoint-App-Teil, der unsere Site innerhalb von Sharepoint über einen Iframe lädt. Das Problem ist, dass Sharepoint über dynamische Subdomains wie https://yoursite.sharepoint.com verfügt . Für IE müssen wir also ALLOW-FROM https: //.sharepoint.com angeben
Kniffliges Geschäft, aber wir können es schaffen, wenn wir zwei Fakten kennen:
Wenn ein Iframe geladen wird, werden die X-Frame-Optionen nur bei der ersten Anforderung überprüft. Sobald der Iframe geladen ist, können Sie innerhalb des Iframes navigieren und der Header wird bei nachfolgenden Anforderungen nicht überprüft.
Wenn ein Iframe geladen wird, ist der HTTP-Referer die übergeordnete Iframe-URL.
Sie können diese beiden Fakten serverseitig nutzen. In Ruby verwende ich den folgenden Code:
Hier können wir Domänen basierend auf der übergeordneten Domäne dynamisch zulassen. In diesem Fall stellen wir sicher, dass der Host auf sharepoint.com endet und unsere Website vor Clickjacking geschützt ist.
Ich würde gerne Feedback zu diesem Ansatz hören.
quelle
/\.sharepoint\.com$/
Gemäß den MDN Spezifikationen ,
X-Frame-Options: ALLOW-FROM
in Chrome und Unterstützung ist nicht unbekannt in Rand- und Opera unterstützt.Content-Security-Policy: frame-ancestors
überschreibtX-Frame-Options
(gemäß dieser W3-Spezifikation ), ist jedochframe-ancestors
nur eingeschränkt kompatibel. Gemäß diesen MDN-Spezifikationen wird es in IE oder Edge nicht unterstützt.quelle
Der RFC für das HTTP-Headerfeld X-Frame-Options besagt, dass das Feld "ALLOW-FROM" im Headerwert X-Frame-Options nur eine Domäne enthalten darf. Mehrere Domains sind nicht erlaubt.
Der RFC schlägt eine Problemumgehung für dieses Problem vor. Die Lösung besteht darin, den Domänennamen als URL-Parameter in der iframe src-URL anzugeben. Der Server, der die iframe src-URL hostet, kann dann den in den URL-Parametern angegebenen Domänennamen überprüfen. Wenn der Domänenname mit einer Liste gültiger Domänennamen übereinstimmt, kann der Server den X-Frame-Options-Header mit dem Wert "ALLOW-FROM-Domänenname" senden, wobei der Domänenname der Name der Domäne ist, die dies versucht Betten Sie den Remote-Inhalt ein. Wenn der Domainname nicht angegeben oder ungültig ist, kann der X-Frame-Options-Header mit dem Wert "verweigern" gesendet werden.
quelle
Genau genommen nein, du kannst nicht.
Sie können jedoch angeben
X-Frame-Options: mysite.com
und daher zulassensubdomain1.mysite.com
undsubdomain2.mysite.com
. Aber ja, das ist immer noch eine Domain. Es gibt zwar eine Problemumgehung, aber ich denke, es ist am einfachsten, dies direkt in den RFC-Spezifikationen zu lesen: https://tools.ietf.org/html/rfc7034Es ist auch erwähnenswert, dass die
frame-ancestor
Direktive des Content-Security-Policy (CSP) -Headers die X-Frame-Optionen überholt. Lesen Sie hier mehr .quelle
Nicht genau das Gleiche, könnte aber in einigen Fällen funktionieren: Es gibt eine andere Option, mit
ALLOWALL
der die Einschränkung effektiv aufgehoben wird. Dies ist möglicherweise eine gute Sache für Test- / Vorproduktionsumgebungenquelle
Ich musste X-Frame-Optionen für IE und Content-Security-Policy für andere Browser hinzufügen. Also habe ich so etwas wie verfolgt.
quelle
Eine mögliche Problemumgehung wäre die Verwendung eines "Frame-Breaker" -Skripts, wie hier beschrieben
Sie müssen nur die "if" -Anweisung ändern, um nach Ihren zulässigen Domains zu suchen.
Diese Problemumgehung wäre sicher, denke ich. Wenn Javascript nicht aktiviert ist, haben Sie keine Sicherheitsbedenken hinsichtlich einer schädlichen Website, die Ihre Seite umrahmt.
quelle
JA. Diese Methode erlaubte mehrere Domänen.
VB.NET
quelle