Eu tenho um site ASP.NET 4.0 IIS7.5 que preciso proteger usando o cabeçalho X-Frame-Options.
Também preciso habilitar as páginas do meu site para serem iframed do meu mesmo domínio, bem como do meu aplicativo do Facebook.
Atualmente tenho meu site configurado com um site dirigido a:
Response.Headers.Add("X-Frame-Options", "ALLOW-FROM SAMEDOMAIN, www.facebook.com/MyFBSite")
Quando eu visualizei minha página do Facebook com Chrome ou Firefox, as páginas de meus sites (sendo iframed com minha página do Facebook) são exibidas ok, mas no IE9, recebo o erro:
"esta página não pode ser exibida ..." (devido à
X-Frame_Options
restrição).
Como configuro o X-Frame-Options: ALLOW-FROM
para suportar mais de um único domínio?
X-FRAME-OPTION
ser um novo recurso parece fundamentalmente falho se apenas um único domínio puder ser definido.
Respostas:
X-Frame-Options
está obsoleto. Do MDN :A alternativa moderna é o
Content-Security-Policy
cabeçalho, que junto com muitas outras políticas pode colocar na lista branca quais URLs têm permissão para hospedar sua página em um quadro, usando aframe-ancestors
diretiva.frame-ancestors
suporta vários domínios e até curingas, por exemplo:Infelizmente, por enquanto, o Internet Explorer não oferece suporte completo à Política de Segurança de Conteúdo .
ATUALIZAÇÃO: MDN removeu seu comentário de descontinuação. Aqui está um comentário semelhante do nível de política de segurança de conteúdo do W3C
fonte
X-Frame-Options
mudou e é menos severo agora. É um bom ponto que é arriscado usar uma especificação que não foi finalizada. Obrigado!X-Frame-Options
não oferece suporte a fontes múltiplas.Do RFC 7034 :
Assim,
Você não pode. Como alternativa, você pode usar URLs diferentes para parceiros diferentes. Para cada URL, você pode usar seu próprio
X-Frame-Options
valor. Por exemplo:Pois
yousite.com
você pode apenas usarX-Frame-Options: deny
.BTW , por enquanto, o Chrome (e todos os navegadores baseados em webkit) não oferece suporte a
ALLOW-FROM
declarações.fonte
ALLOW-FROM
uso do link fornecido.Necromante.
As respostas fornecidas estão incompletas.
Primeiro, como já foi dito, você não pode adicionar vários hosts allow-from, isso não é suportado.
Em segundo lugar, você precisa extrair dinamicamente esse valor do referenciador HTTP, o que significa que você não pode adicionar o valor a Web.config, porque nem sempre é o mesmo valor.
Será necessário fazer a detecção do navegador para evitar adicionar allow-from quando o navegador é Chrome (isso produz um erro no console de depuração, que pode encher rapidamente o console ou tornar o aplicativo lento). Isso também significa que você precisa modificar a detecção do navegador ASP.NET, uma vez que identifica erroneamente o Edge como Chrome.
Isso pode ser feito no ASP.NET escrevendo um módulo HTTP que é executado em cada solicitação, que acrescenta um cabeçalho http para cada resposta, dependendo do referenciador da solicitação. Para o Chrome, é necessário adicionar Content-Security-Policy.
Você precisa registrar a função context_EndRequest na função Init do módulo HTTP.
Em seguida, você precisa adicionar o módulo ao seu aplicativo. Você pode fazer isso programaticamente em Global.asax substituindo a função Init do HttpApplication, como este:
ou você pode adicionar entradas ao Web.config se não possuir o código-fonte do aplicativo:
A entrada em system.webServer é para IIS7 +, a outra em system.web é para IIS 6.
Observe que você precisa definir runAllManagedModulesForAllRequests como true, para que funcione corretamente.
A string em tipo está no formato
"Namespace.Class, Assembly"
. Observe que se você escrever seu assembly em VB.NET em vez de C #, o VB cria um namespace padrão para cada projeto, de modo que sua string será semelhante aSe você quiser evitar esse problema, escreva a DLL em C #.
fonte
Que tal uma abordagem que não apenas permite vários domínios, mas permite domínios dinâmicos.
O caso de uso aqui é com uma parte do aplicativo Sharepoint que carrega nosso site dentro do Sharepoint por meio de um iframe. O problema é que o sharepoint tem subdomínios dinâmicos como https://yoursite.sharepoint.com . Portanto, para o IE, precisamos especificar ALLOW-FROM https: //.sharepoint.com
Negócio complicado, mas podemos realizá-lo sabendo de dois fatos:
Quando um iframe é carregado, ele só valida as Opções do X-Frame na primeira solicitação. Depois que o iframe é carregado, você pode navegar dentro do iframe e o cabeçalho não é verificado nas solicitações subsequentes.
Além disso, quando um iframe é carregado, o referenciador HTTP é o url do iframe pai.
Você pode aproveitar esses dois fatos do lado do servidor. Em ruby, estou usando o seguinte código:
Aqui, podemos permitir domínios dinamicamente com base no domínio pai. Nesse caso, garantimos que o host termina em sharepoint.com, mantendo nosso site protegido contra clickjacking.
Eu adoraria ouvir comentários sobre essa abordagem.
fonte
/\.sharepoint\.com$/
De acordo com as especificações MDN ,
X-Frame-Options: ALLOW-FROM
não é compatível com o Chrome e o suporte é desconhecido no Edge e Opera.Content-Security-Policy: frame-ancestors
substituiX-Frame-Options
(de acordo com esta especificação W3 ), masframe-ancestors
tem compatibilidade limitada. De acordo com essas especificações MDN , não é compatível com IE ou Edge.fonte
O RFC para as opções do X-Frame do campo do cabeçalho HTTP afirma que o campo "ALLOW-FROM" no valor do cabeçalho X-Frame-Options pode conter apenas um domínio. Vários domínios não são permitidos.
O RFC sugere uma solução alternativa para esse problema. A solução é especificar o nome de domínio como um parâmetro de url no url iframe src. O servidor que hospeda o url iframe src pode então verificar o nome de domínio fornecido nos parâmetros do url. Se o nome de domínio corresponder a uma lista de nomes de domínio válidos, o servidor pode enviar o cabeçalho X-Frame-Options com o valor: "ALLOW-FROM domain-name", onde domain name é o nome do domínio que está tentando incorporar o conteúdo remoto. Se o nome de domínio não for fornecido ou não for válido, o cabeçalho X-Frame-Options pode ser enviado com o valor: "deny".
fonte
Estritamente falando, não, você não pode.
No entanto, você pode especificar
X-Frame-Options: mysite.com
e, portanto, permitirsubdomain1.mysite.com
esubdomain2.mysite.com
. Mas sim, ainda é um domínio. Acontece que há alguma solução alternativa para isso, mas acho que é mais fácil ler diretamente nas especificações RFC: https://tools.ietf.org/html/rfc7034Também vale a pena salientar que a
frame-ancestor
diretiva do cabeçalho Content-Security-Policy (CSP) torna as opções X-Frame obsoletas. Leia mais aqui .fonte
Não é exatamente o mesmo, mas pode funcionar em alguns casos: há outra opção
ALLOWALL
que removerá efetivamente a restrição, o que pode ser uma coisa boa para ambientes de teste / pré-produçãofonte
Eu tive que adicionar X-Frame-Options para IE e Content-Security-Policy para outros navegadores. Então eu fiz algo como seguir.
fonte
Uma possível solução alternativa seria usar um script "frame-breaker" conforme descrito aqui
Você só precisa alterar a instrução "if" para verificar seus domínios permitidos.
Essa solução alternativa seria segura, eu acho. porque com o javascript não habilitado, você não terá nenhuma preocupação de segurança sobre um site mal-intencionado enquadrando sua página.
fonte
SIM. Este método permitia múltiplos domínios.
VB.NET
fonte