web-dev-qa-db-fra.com

Options X-Frame: ALLOW-FROM dans Firefox et chrome

J'implémente un "pass-through" pour X-Frame-Options laisser un site partenaire envelopper le site de mon employeur dans un iframe, conformément à cet article: http://blogs.msdn.com/b/ieinternals/archive/2010/03/30/combating-clickjacking- avec-x-frame-options.aspx

(fractionner les URL à poster)

En bref, la page de notre partenaire a un iframe avec une URL sur notre domaine. Pour toute page de notre domaine, ils ajouteront un argument url spécial comme &@mykey=topleveldomain.com, nous indiquant le domaine de premier niveau de la page.

Nos filtres extraient le TLD du partenaire, le cas échéant, à partir de l'URL et le valident par rapport à une liste blanche. Si c'est sur la liste, nous expédions le X-Frame-Options en-tête de valeur ALLOW-FROM topleveldomain.com _ (et ajoutez un cookie pour les prochains clics). Si ce n'est pas sur notre liste blanche, nous expédions SAMEORIGIN ou DENY.

Le problème est que cela ressemble à l'envoi de ALLOW-FROM domain résulte dans un ensemble sans issue pour les derniers Firefox et Google Chrome. IE8, du moins, semble implémenter correctement ALLOW-FROM.

Consultez cette page: http://www.enhanceie.com/test/clickjack . Juste après la 5ème (sur 5) boîtes qui "devrait afficher du contenu", est une boîte qui ne devrait PAS afficher du contenu, mais qui le serait. Dans ce cas, la page de l'iframe envoie X-Frame-Options: ALLOW-FROM http://www.debugtheweb.com, un TLD résolument différent de http://www.enhanceie.com. Pourtant, le cadre affiche toujours du contenu.

Toute idée quant à savoir si X-Frame-Options est vraiment implémenté avec ALLOW-FROM sur des navigateurs (de bureau) pertinents? Peut-être que la syntaxe a changé?

Quelques liens d'intérêt:

62
Rob

ALLOW-FROM n’est pas pris en charge par Chrome ou Safari. Voir l’article MDN: https://developer.mozilla.org/fr-doc/Web/HTTP/X- Frame-Options

Vous travaillez déjà pour créer un en-tête personnalisé et l'envoyer avec les données correctes. Ne pouvez-vous pas simplement exclure l'en-tête lorsque vous détectez qu'il provient d'un partenaire valide et ajouter DENY à chaque autre demande? Je ne vois pas l'avantage de AllowFrom lorsque vous construisez déjà de manière dynamique la logique?

37
Kinlan

J'ai posté cette question et je n'ai jamais vu le retour (qui est arrivé plusieurs mois après, semble-t-il :).

Comme Kinlan l'a mentionné, ALLOW-FROM n'est pas pris en charge par tous les navigateurs en tant que valeur X-Frame-Options.

La solution consistait à créer des branches en fonction du type de navigateur. Pour IE, expédier X-Frame-Options . Pour tous les autres, expédiez X-Content-Security-Policy .

J'espère que ça aide, et désolé d'avoir pris autant de temps pour boucler la boucle!

18
Rob

Pour Chrome, au lieu de

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

vous devez ajouter 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);

aux en-têtes de réponse HTTP.
Notez que cela suppose que vous avez vérifié sur le serveur si refAuth est autorisé ou non.
De plus, notez que vous devez effectuer une détection du navigateur afin d'éviter d'ajouter le allow-from en-tête pour Chrome (erreur sur la console).

Pour plus de détails, voir ma réponse ici.

6
Stefan Steiger