J'ai un site ASP.NET 4.0 IIS7.5 dont j'ai besoin sécurisé à l'aide de l'en-tête X-Frame-Options.
Je dois également activer les pages de mon site pour être iframées à partir de mon même domaine ainsi que de mon application Facebook.
Actuellement, mon site est configuré avec un site intitulé:
Response.Headers.Add("X-Frame-Options", "ALLOW-FROM SAMEDOMAIN, www.facebook.com/MyFBSite")
Lorsque j'ai consulté ma page Facebook avec Chrome ou Firefox, les pages de mes sites (étant iframées avec ma page facebook) s'affichent correctement, mais sous IE9, j'obtiens l'erreur:
"cette page ne peut pas être affichée…" (à cause de la
X-Frame_Options
restriction).
Comment configurer le X-Frame-Options: ALLOW-FROM
pour qu'il prenne en charge plusieurs domaines?
X-FRAME-OPTION
être une nouvelle fonctionnalité semble fondamentalement défectueuse si un seul domaine peut être défini.
Réponses:
X-Frame-Options
est obsolète. De MDN :L'alternative moderne est l'en-
Content-Security-Policy
tête, qui, avec de nombreuses autres politiques, peut lister quelles URL sont autorisées à héberger votre page dans un cadre, en utilisant laframe-ancestors
directive.frame-ancestors
prend en charge plusieurs domaines et même des caractères génériques, par exemple:Malheureusement, pour l'instant, Internet Explorer ne prend pas entièrement en charge la stratégie de sécurité du contenu .
MISE À JOUR: MDN a supprimé son commentaire d'obsolescence. Voici un commentaire similaire du niveau de politique de sécurité du contenu du W3C
la source
X-Frame-Options
changé et est moins sévère maintenant. C'est un bon point qu'il est risqué d'utiliser une spécification qui n'est pas finalisée. Merci!X-Frame-Options
ne prend pas en charge plusieurs sources.À partir de la RFC 7034 :
Alors,
Vous ne pouvez pas. Pour contourner ce problème, vous pouvez utiliser différentes URL pour différents partenaires. Pour chaque URL, vous pouvez utiliser sa propre
X-Frame-Options
valeur. Par exemple:Car
yousite.com
vous pouvez simplement utiliserX-Frame-Options: deny
.BTW , pour l'instant Chrome (et tous les navigateurs basés sur le Webkit) ne prend pas du tout en charge les
ALLOW-FROM
déclarations.la source
ALLOW-FROM
utilisation du lien que vous avez fourni.Nécromancie.
Les réponses fournies sont incomplètes.
Tout d'abord, comme déjà dit, vous ne pouvez pas ajouter plusieurs hôtes autorisés, ce n'est pas pris en charge.
Deuxièmement, vous devez extraire dynamiquement cette valeur du référent HTTP, ce qui signifie que vous ne pouvez pas ajouter la valeur à Web.config, car ce n'est pas toujours la même valeur.
Il sera nécessaire de faire une détection du navigateur pour éviter d'ajouter une autorisation lorsque le navigateur est Chrome (cela produit une erreur sur la console de débogage, ce qui peut rapidement remplir la console ou ralentir l'application). Cela signifie également que vous devez modifier la détection du navigateur ASP.NET, car il identifie à tort Edge comme Chrome.
Cela peut être fait dans ASP.NET en écrivant un module HTTP qui s'exécute à chaque demande, qui ajoute un en-tête http pour chaque réponse, en fonction du référent de la demande. Pour Chrome, il doit ajouter Content-Security-Policy.
Vous devez enregistrer la fonction context_EndRequest dans la fonction Init du module HTTP.
Ensuite, vous devez ajouter le module à votre application. Vous pouvez le faire soit par programme dans Global.asax en remplaçant la fonction Init de HttpApplication, comme ceci:
ou vous pouvez ajouter des entrées à Web.config si vous ne possédez pas le code source de l'application:
L'entrée dans system.webServer est pour IIS7 +, l'autre dans system.web est pour IIS 6.
Notez que vous devez définir runAllManagedModulesForAllRequests sur true, pour que cela fonctionne correctement.
La chaîne de type est au format
"Namespace.Class, Assembly"
. Notez que si vous écrivez votre assembly dans VB.NET au lieu de C #, VB crée un espace de noms par défaut pour chaque projet, ainsi votre chaîne ressemblera àSi vous souhaitez éviter ce problème, écrivez la DLL en C #.
la source
Que diriez-vous d'une approche qui permet non seulement plusieurs domaines, mais autorise des domaines dynamiques.
Le cas d'utilisation ici est avec une partie d'application Sharepoint qui charge notre site à l'intérieur de Sharepoint via un iframe. Le problème est que sharepoint a des sous-domaines dynamiques tels que https://yoursite.sharepoint.com . Donc, pour IE, nous devons spécifier ALLOW-FROM https: //.sharepoint.com
Une affaire délicate, mais nous pouvons y arriver en sachant deux faits:
Lorsqu'un iframe se charge, il ne valide les options X-Frame qu'à la première requête. Une fois l'iframe chargée, vous pouvez naviguer dans l'iframe et l'en-tête n'est pas vérifié lors des demandes suivantes.
De plus, lorsqu'un iframe est chargé, le référent HTTP est l'url iframe parent.
Vous pouvez tirer parti de ces deux faits côté serveur. Dans ruby, j'utilise le code suivant:
Ici, nous pouvons autoriser dynamiquement des domaines basés sur le domaine parent. Dans ce cas, nous nous assurons que l'hébergeur se termine par sharepoint.com, protégeant notre site contre le détournement de clics.
J'aimerais entendre vos commentaires sur cette approche.
la source
/\.sharepoint\.com$/
Selon les spécifications MDN ,
X-Frame-Options: ALLOW-FROM
n'est pas pris en charge dans Chrome et la prise en charge est inconnue dans Edge et Opera.Content-Security-Policy: frame-ancestors
remplaceX-Frame-Options
(selon cette spécification W3 ), maisframe-ancestors
sa compatibilité est limitée. Conformément à ces spécifications MDN , il n'est pas pris en charge dans IE ou Edge.la source
Le RFC pour le champ d'en-tête HTTP X-Frame-Options indique que le champ "ALLOW-FROM" dans la valeur d'en-tête X-Frame-Options ne peut contenir qu'un seul domaine. Plusieurs domaines ne sont pas autorisés.
La RFC suggère une solution à ce problème. La solution consiste à spécifier le nom de domaine en tant que paramètre d'url dans l'url iframe src. Le serveur qui héberge l'url src iframe peut alors vérifier le nom de domaine donné dans les paramètres d'url. Si le nom de domaine correspond à une liste de noms de domaine valides, le serveur peut envoyer l'en-tête X-Frame-Options avec la valeur: "ALLOW-FROM nom de domaine", où nom de domaine est le nom du domaine qui tente de incorporer le contenu distant. Si le nom de domaine n'est pas donné ou n'est pas valide, alors l'en-tête X-Frame-Options peut être envoyé avec la valeur: "deny".
la source
Strictement non, vous ne pouvez pas.
Vous pouvez cependant spécifier
X-Frame-Options: mysite.com
et donc autorisersubdomain1.mysite.com
etsubdomain2.mysite.com
. Mais oui, c'est encore un domaine. Il se trouve qu'il existe une solution de contournement pour cela, mais je pense qu'il est plus facile de le lire directement dans les spécifications RFC: https://tools.ietf.org/html/rfc7034Il convient également de souligner que la
frame-ancestor
directive d'en-tête Content-Security-Policy (CSP) rend obsolète X-Frame-Options. En savoir plus ici .la source
Pas exactement la même chose, mais pourrait fonctionner dans certains cas: il existe une autre option
ALLOWALL
qui supprimera efficacement la restriction, ce qui pourrait être une bonne chose pour les environnements de test / pré-productionla source
J'ai dû ajouter X-Frame-Options pour IE et Content-Security-Policy pour les autres navigateurs. Alors j'ai fait quelque chose comme suivre.
la source
Une solution de contournement possible consisterait à utiliser un script "frame-breaker" comme décrit ici
Il vous suffit de modifier l'instruction "if" pour vérifier vos domaines autorisés.
Cette solution de contournement serait sûre, je pense. car si javascript n'est pas activé, vous n'aurez aucun problème de sécurité à propos d'un site Web malveillant encadrant votre page.
la source
OUI. Cette méthode autorisait plusieurs domaines.
VB.NET
la source