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_Options
restricción).
¿Cómo configuro el X-Frame-Options: ALLOW-FROM
para 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-Options
es obsoleto. De MDN :La alternativa moderna es el
Content-Security-Policy
encabezado, 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-ancestors
directiva.frame-ancestors
admite 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-Options
cambió y ahora es menos severa. Es un buen punto que es arriesgado usar una especificación que no está finalizada. ¡Gracias!X-Frame-Options
no 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-Options
valor. Por ejemplo:Porque
yousite.com
solo puedes usarX-Frame-Options: deny
.Por cierto , por ahora Chrome (y todos los navegadores basados en webkit) no admite
ALLOW-FROM
declaraciones en absoluto.fuente
ALLOW-FROM
uso 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-FROM
no se admite en Chrome y se desconoce el soporte en Edge y Opera.Content-Security-Policy: frame-ancestors
anulaX-Frame-Options
(según esta especificación W3 ), peroframe-ancestors
tiene 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.com
y, por lo tanto, permitirsubdomain1.mysite.com
ysubdomain2.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-ancestor
directiva 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
ALLOWALL
que 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