Tengo un sitio ASP.NET 4.0 IIS7.5 que necesito asegurar usando el encabezado X-Frame-Options.
También necesito permitir que las páginas de mi sitio sean iframed desde mi mismo dominio, así como desde mi aplicación de Facebook.
Actualmente tengo mi sitio configurado con un sitio encabezado por:
Response.Headers.Add("X-Frame-Options", "ALLOW-FROM SAMEDOMAIN, www.facebook.com/MyFBSite")
Cuando vi mi página de Facebook con Chrome o Firefox, las páginas de mi sitio (que están enmarcadas con mi página de Facebook) se muestran bien, pero en IE9, aparece el error:
"esta página no se puede mostrar ..." (debido a la
X-Frame_Optionsrestricción).
¿Cómo configuro el X-Frame-Options: ALLOW-FROMpara admitir más de un dominio?
X-FRAME-OPTION ser una característica nueva parece fundamentalmente defectuoso si solo se puede definir un dominio.

Respuestas:
X-Frame-Optionses obsoleto. De MDN :La alternativa moderna es el
Content-Security-Policyencabezado, que junto con muchas otras políticas puede incluir en una lista blanca las URL que pueden albergar su página en un marco, utilizando laframe-ancestorsdirectiva.frame-ancestorsadmite varios dominios e incluso comodines, por ejemplo:Desafortunadamente, por ahora, Internet Explorer no es totalmente compatible con Content-Security-Policy .
ACTUALIZACIÓN: MDN ha eliminado su comentario de obsolescencia. Aquí hay un comentario similar del nivel de política de seguridad de contenido del W3C
fuente
X-Frame-Optionscambió y ahora es menos severa. Es un buen punto que es arriesgado usar una especificación que no está finalizada. ¡Gracias!X-Frame-Optionsno admite múltiples fuentes.Desde el RFC 7034 :
Entonces,
No puedes. Como solución alternativa, puede utilizar diferentes URL para diferentes socios. Para cada URL puede usar su propio
X-Frame-Optionsvalor. Por ejemplo:Porque
yousite.comsolo puedes usarX-Frame-Options: deny.Por cierto , por ahora Chrome (y todos los navegadores basados en webkit) no admite
ALLOW-FROMdeclaraciones en absoluto.fuente
ALLOW-FROMuso del enlace que proporcionó.Nigromante.
Las respuestas proporcionadas están incompletas.
Primero, como ya se dijo, no puede agregar múltiples hosts de permiso, eso no es compatible.
En segundo lugar, debe extraer dinámicamente ese valor de la referencia HTTP, lo que significa que no puede agregar el valor a Web.config, porque no siempre es el mismo valor.
Será necesario realizar una detección del navegador para evitar agregar permisos cuando el navegador sea Chrome (produce un error en la consola de depuración, que puede llenar rápidamente la consola o hacer que la aplicación sea lenta). Eso también significa que debe modificar la detección del navegador ASP.NET, ya que identifica erróneamente a Edge como Chrome.
Esto se puede hacer en ASP.NET escribiendo un módulo HTTP que se ejecuta en cada solicitud, que agrega un encabezado http para cada respuesta, dependiendo de la referencia de la solicitud. Para Chrome, debe agregar Content-Security-Policy.
Debe registrar la función context_EndRequest en la función de inicio del módulo HTTP.
A continuación, debe agregar el módulo a su aplicación. Puede hacer esto programáticamente en Global.asax anulando la función Init de HttpApplication, así:
o puede agregar entradas a Web.config si no posee el código fuente de la aplicación:
La entrada en system.webServer es para IIS7 +, la otra en system.web es para IIS 6.
Tenga en cuenta que debe establecer runAllManagedModulesForAllRequests en true, para que funcione correctamente.
La cadena de tipo tiene el formato
"Namespace.Class, Assembly". Tenga en cuenta que si escribe su ensamblado en VB.NET en lugar de C #, VB crea un espacio de nombres predeterminado para cada proyecto, por lo que su cadena se verá comoSi desea evitar este problema, escriba la DLL en C #.
fuente
¿Qué tal un enfoque que no solo permita múltiples dominios, sino que también permita dominios dinámicos?
El caso de uso aquí es con una parte de la aplicación Sharepoint que carga nuestro sitio dentro de Sharepoint a través de un iframe. El problema es que sharepoint tiene subdominios dinámicos como https://yoursite.sharepoint.com . Entonces, para IE, necesitamos especificar ALLOW-FROM https: //.sharepoint.com
Es un asunto complicado, pero podemos hacerlo sabiendo dos hechos:
Cuando se carga un iframe, solo valida las opciones de X-Frame en la primera solicitud. Una vez que se carga el iframe, puede navegar dentro del iframe y el encabezado no se verifica en solicitudes posteriores.
Además, cuando se carga un iframe, el referente HTTP es la URL del iframe principal.
Puede aprovechar estos dos hechos del lado del servidor. En ruby, estoy usando el siguiente código:
Aquí podemos permitir dinámicamente dominios basados en el dominio principal. En este caso, nos aseguramos de que el host termine en sharepoint.com manteniendo nuestro sitio a salvo de clickjacking.
Me encantaría escuchar comentarios sobre este enfoque.
fuente
/\.sharepoint\.com$/Según las especificaciones de MDN ,
X-Frame-Options: ALLOW-FROMno se admite en Chrome y se desconoce el soporte en Edge y Opera.Content-Security-Policy: frame-ancestorsanulaX-Frame-Options(según esta especificación W3 ), peroframe-ancestorstiene compatibilidad limitada. Según estas especificaciones de MDN , no es compatible con IE o Edge.fuente
El RFC para el campo de encabezado HTTP X-Frame-Options establece que el campo "ALLOW-FROM" en el valor del encabezado X-Frame-Options solo puede contener un dominio. No se permiten varios dominios.
El RFC sugiere una solución para este problema. La solución es especificar el nombre de dominio como un parámetro de url en el iframe src url. El servidor que aloja la url iframe src puede verificar el nombre de dominio dado en los parámetros de la url. Si el nombre de dominio coincide con una lista de nombres de dominio válidos, el servidor puede enviar el encabezado X-Frame-Options con el valor: "ALLOW-FROM domain-name", donde el nombre de dominio es el nombre del dominio que está intentando incrustar el contenido remoto. Si el nombre de dominio no se proporciona o no es válido, entonces el encabezado X-Frame-Options se puede enviar con el valor: "deny".
fuente
Estrictamente hablando, no, no puedes.
Sin embargo, puede especificar
X-Frame-Options: mysite.comy, por lo tanto, permitirsubdomain1.mysite.comysubdomain2.mysite.com. Pero sí, sigue siendo un dominio. Resulta que hay una solución para esto, pero creo que es más fácil leerlo directamente en las especificaciones de RFC: https://tools.ietf.org/html/rfc7034También vale la pena señalar que la
frame-ancestordirectiva del encabezado Content-Security-Policy (CSP) hace obsoleto X-Frame-Options. Leer más aquí .fuente
No es exactamente lo mismo, pero podría funcionar en algunos casos: hay otra opción
ALLOWALLque eliminará la restricción de manera efectiva, lo que podría ser bueno para entornos de prueba / preproducción.fuente
Tuve que agregar X-Frame-Options para IE y Content-Security-Policy para otros navegadores. Así que hice algo como seguir.
fuente
Una posible solución alternativa sería utilizar un script "frame-breaker" como se describe aquí
Solo necesita modificar la declaración "si" para verificar sus dominios permitidos.
Esta solución alternativa sería segura, creo. porque con javascript no habilitado, no tendrá ningún problema de seguridad sobre un sitio web malicioso que enmarque su página.
fuente
SI. Este método permitió múltiples dominios.
VB.NET
fuente