Superando “Visualización prohibida por X-Frame-Options”

Estoy escribiendo una pequeña página web cuyo propósito es enmarcar algunas otras páginas, simplemente para consolidarlas en una sola ventana del navegador para facilitar su visualización. Algunas de las páginas que trato de enmarcar prohíben que me enmarquen y lanzo un documento que dice “Se negó a mostrarlo porque la visualización está prohibida por X-Frame-Options”. error en Chrome. Entiendo que esta es una limitación de seguridad (por una buena razón) y no tengo acceso para cambiarla.

¿Hay algún método alternativo de encuadre o sin encuadre para mostrar páginas dentro de una sola ventana que no se dispare con el encabezado X-Frame-Options?

Tuve un problema similar, cuando intentaba mostrar contenido de nuestro propio sitio en un iframe (como un cuadro de diálogo de caja de luz con Colorbox ), y donde teníamos un encabezado de “X-Frame-Options SAMEORIGIN” en todo el servidor en el servidor de origen evitando que se cargue en nuestro servidor de prueba.

Esto no parece estar documentado en ninguna parte, pero si puede editar las páginas que intenta copiar (por ejemplo, son sus propias páginas), simplemente el envío de otro encabezado X-Frame-Options con cualquier cadena deshabilita los comandos SAMEORIGIN o DENY.

p.ej. para PHP, poniendo

 

en la parte superior de la página, los navegadores combinarán los dos, lo que da como resultado un encabezado de

 X-Frame-Options SAMEORIGIN, GOFORIT 

… y le permite cargar la página en un iframe. Esto parece funcionar cuando el comando SAMEORIGIN inicial se configuró en un nivel de servidor, y desea sobrescribirlo en un caso página por página.

¡Todo lo mejor!

Si obtiene este error para un video de YouTube, en lugar de usar la URL completa, use la URL insertada de las opciones de compartir. Se verá como http://www.youtube.com/embed/eCfDxZxTBW4

También puede reemplazar watch?v= with embed/ so http://www.youtube.com/watch?v=eCfDxZxTBW4 convierte en http://www.youtube.com/embed/eCfDxZxTBW4

Si obtiene este error al intentar insertar un mapa de Google en un iframe , debe agregar &output=embed al enlace de origen.

Puede omitir X-Frame-Options en un utilizando solo JavaScript y YQL del lado del cliente . Aquí hay una prueba de concepto: Hacker News en un . (Probado en Chrome y Firefox; si no funciona, intente actualizar la página).

El proceso es el siguiente:

  1. Solicite una URL iframe de YQL (función loadURL ),
  2. Obtenga una información HTML de YQL (función getData ),
  3. Agregue un y un cargando enlaces en un iframe usando YQL también,
  4. Inyecte este HTML en un vacío (función loadHTML ).

El código JS de muestra:

 var iframe = document.getElementsByTagName('iframe')[0]; var url = iframe.src; var getData = function (data) { if (data && data.query && data.query.results && data.query.results.resources && data.query.results.resources.content && data.query.results.resources.status == 200) loadHTML(data.query.results.resources.content); else if (data && data.error && data.error.description) loadHTML(data.error.description); else loadHTML('Error: Cannot load ' + url); }; var loadURL = function (src) { url = src; var script = document.createElement('script'); script.src = 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20data.headers%20where%20url%3D%22' + encodeURIComponent(url) + '%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=getData'; document.body.appendChild(script); }; var loadHTML = function (html) { iframe.src = 'about:blank'; iframe.contentWindow.document.open(); iframe.contentWindow.document.write(html.replace(//i, 'document.addEventListener("click", function(e) { if(e.target && e.target.nodeName == "A") { e.preventDefault(); parent.loadURL(e.target.href); } });')); iframe.contentWindow.document.close(); } loadURL(iframe.src); 

Agregar un

  target='_top' 

a mi enlace en la pestaña facebook solucionó el problema para mí …

Si obtiene este error al intentar incrustar contenido de Vimeo, cambie el src del iframe,

desde: https://vimeo.com/63534746
a: http://player.vimeo.com/video/63534746

Hay un complemento para Chrome, que elimina esa entrada de encabezado (solo para uso personal):

https://chrome.google.com/webstore/detail/ignore-x-frame-headers/gleekbfjekiniecknbkamfmkohkpodhe/reviews

Tuve el mismo problema cuando intenté incrustar moodle 2 en iframe, la solución es Site administration ► Security ► HTTP security y marcar Allow frame embedding

Esta es la solución chicos !!

 FB.Event.subscribe('edge.create', function(response) { window.top.location.href = 'url'; }); 

¡Lo único que funcionó para las aplicaciones de Facebook!

Intenté casi todas las sugerencias. Sin embargo, lo único que realmente resolvió el problema fue:

  1. Cree un .htaccess en la misma carpeta donde se encuentra su archivo PHP.

  2. Agregue esta línea al htaccess:

    Header always unset X-Frame-Options

Incrustar el PHP por un iframe de otro dominio debería funcionar luego.

Además, puede agregar al comienzo de su archivo PHP:

 header('X-Frame-Options: ALLOW'); 

Lo cual fue, sin embargo, innecesario en mi caso.

Parece que X-Frame-Options Allow-From https: // … se depreció y se reemplazó (y se ignora) si utiliza el encabezado Content-Security-Policy en su lugar.

Aquí está la referencia completa: https://content-security-policy.com/

Tuve el mismo problema con mediawiki, esto fue porque el servidor negó la incrustación de la página en un iframe por razones de seguridad.

Lo resolví escribiendo

 $wgEditPageFrameOptions = "SAMEORIGIN"; 

en el archivo de configuración php de mediawiki.

Espero eso ayude.

Solución para cargar un sitio web externo en un iFrame, incluso si la opción x-frame está configurada para denegar en el sitio web externo.

Si desea cargar otro sitio web en un iFrame y aparece el mensaje ” Display forbidden by X-Frame-Options” , puede solucionarlo creando un script proxy del lado del servidor.

El atributo src del iFrame podría tener una URL con el siguiente aspecto: /proxy.php?url=https://www.example.com/page&key=somekey

Entonces proxy.php se vería así:

 if (isValidRequest()) { echo file_get_contents($_GET['url']); } function isValidRequest() { return $_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['key']) && $_GET['key'] === 'somekey'; } 

Esto pasa el bloque, porque es solo una solicitud GET que podría haber sido una visita ordinaria a la página del navegador.

Tenga en cuenta: es posible que desee mejorar la seguridad en este script. Porque los hackers pueden comenzar a cargar en las páginas web a través de su secuencia de comandos proxy.

La única pregunta que tiene un montón de respuestas. Bienvenido a la guía que desearía haber tenido cuando estaba luchando por esto para que funcione a las 10:30 de la noche del día límite … FB hace algunas cosas raras con aplicaciones de canvas, y bueno, ya lo han advertido. Si aún estás aquí y tienes una aplicación de Rails que aparecerá detrás de un canvas de Facebook, necesitarás:

Gemfile:

 gem "rack-facebook-signed-request", :git => 'git://github.com/cmer/rack-facebook-signed-request.git' 

config / facebook.yml

 facebook: key: "123123123123" secret: "123123123123123123secret12312" 

config / application.rb

 config.middleware.use Rack::Facebook::SignedRequest, app_id: "123123123123", secret: "123123123123123123secret12312", inject_facebook: false 

config / initializers / omniauth.rb

 OmniAuth.config.logger = Rails.logger SERVICES = YAML.load(File.open("#{::Rails.root}/config/oauth.yml").read) Rails.application.config.middleware.use OmniAuth::Builder do provider :facebook, SERVICES['facebook']['key'], SERVICES['facebook']['secret'], iframe: true end 

application_controller.rb

 before_filter :add_xframe def add_xframe headers['X-Frame-Options'] = 'GOFORIT' end 

Necesitas un controlador para llamar desde la configuración del canvas de Facebook, utilicé /canvas/ e hice que la ruta fuera el SiteController principal para esta aplicación:

 class SiteController < ApplicationController def index @user = User.new end def canvas redirect_to '/auth/failure' if request.params['error'] == 'access_denied' url = params['code'] ? "/auth/facebook?signed_request=#{params['signed_request']}&state=canvas" : "/login" redirect_to url end def login end end 

login.html.erb

<% content_for :javascript do %> var oauth_url = 'https://www.facebook.com/dialog/oauth/'; oauth_url += '?client_id=471466299609256'; oauth_url += '&redirect_uri=' + encodeURIComponent('https://apps.facebook.com/wellbeingtracker/'); oauth_url += '&scope=email,status_update,publish_stream'; console.log(oauth_url); top.location.href = oauth_url; <% end %> 

Fuentes

  • La configuración creo que vino del ejemplo de omniauth.
  • El archivo gem (¡¡que es la clave !!!) vino de: slideshare cosas que aprendí ...
  • Esta pregunta de stack tenía todo el ángulo de Xframe, por lo que obtendrás un espacio en blanco, si no colocas este encabezado en el controlador de la aplicación.
  • Y mi hombre @rafmagana escribió esta guía heroku , que ahora puedes adoptar para barandillas con esta respuesta y los hombros de los gigantes con los que caminas.

target = ‘_ parent’

Utilizando la idea de Kevin Vella, intenté agregar ese atributo para formar elementos creados por el generador de botones de PayPal. Trabajé para que Paypal no se abra en una nueva ventana / pestaña del navegador.

FWIW:

Tuvimos una situación en la que necesitábamos matar nuestro iFrame cuando apareció este código “breaker”. Entonces, utilicé la function get_headers($url); PHP function get_headers($url); para verificar la URL remota antes de mostrarla en un iFrame . Para un mejor rendimiento, guardé en caché los resultados en un archivo, así que no estaba haciendo una conexión HTTP cada vez.

Estaba usando Tomcat 8.0.30, ninguna de las sugerencias funcionó para mí. Como estamos buscando actualizar las X-Frame-Options y configurarlo en ALLOW , aquí es cómo lo configuré para permitir incrustaciones iframes:

  • Navegue al directorio conf de Tomcat, edite el archivo web.xml
  • Agregue el filtro a continuación:
  httpHeaderSecurity org.apache.catalina.filters.HttpHeaderSecurityFilter  hstsEnabled true   antiClickJackingEnabled true   antiClickJackingOption ALLOW-FROM  true   httpHeaderSecurity /* REQUEST  
  • Reinicie el servicio Tomcat
  • Acceda a los recursos usando un iFrame.

No estoy seguro de cuán relevante es, pero construí una solución a esto. En mi sitio, quería mostrar el enlace en una ventana modal que contenía un iframe que carga la URL.

Lo que hice fue vincular el evento click del enlace a esta función de JavaScript. Todo lo que hace es realizar una solicitud a un archivo PHP que verifica los encabezados de URL para X-FRAME-Options antes de decidir si cargar la URL dentro de la ventana modal o redirigir.

Aquí está la función:

  function opentheater(link, title){ $.get( "url_origin_helper.php?url="+encodeURIComponent(link), function( data ) { if(data == "ya"){ $(".modal-title").html("

"+title+"   "+link+"

"); $("#linkcontent").attr("src", link); $("#myModal").modal("show"); } else{ window.location.href = link; //alert(data); } }); }

Aquí está el código de archivo PHP que lo busca:

  

Espero que esto ayude.

Me encontré con este problema al ejecutar un sitio web de wordpress. Probé todo tipo de cosas para solucionarlo y no estaba seguro de cómo, en última instancia, el problema se debía a que estaba utilizando el reenvío de DNS con enmascaramiento, y los enlaces a sitios externos no se estaban abordando correctamente. es decir, mi sitio se alojó en http: //123.456.789/index.html pero se enmascaró para ejecutarse en http://somewebSite.com/index.html . Cuando ingresé http: //123.456.789/index.html en el navegador, al hacer clic en esos mismos enlaces, no surgieron problemas con X-frame-orígenes en la consola JS, pero la ejecución de http://somewebSite.com/index.html sí . Para enmascarar correctamente debe agregar los servidores de nombres DNS de su servidor a su servicio de dominio, es decir, godaddy.com debe tener servidores de nombres de ejemplo, ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com, si usted fuera usando digitalocean.com como su servicio de alojamiento.

Es sorprendente que nadie haya mencionado alguna vez que la configuración del servidor Apache (archivos *.conf ) o el archivo .htaccess sean la causa de este error. Busque en .htaccess o en Apache archivos de configuración de Apache , asegurándose de que no tenga el siguiente conjunto de DENY :

Header always set X-Frame-Options DENY

SAMEORIGIN a SAMEORIGIN , hace que las cosas funcionen como se esperaba:

Header always set X-Frame-Options SAMEORIGIN

La única respuesta real, si no controla los encabezados de su fuente que desea en su iframe, es la de proxy. Haga que un servidor actúe como cliente, reciba la fuente, quite los encabezados problemáticos, agregue CORS si es necesario y luego haga ping a su propio servidor.

Hay otra respuesta que explica cómo escribir dicho proxy. No es difícil, pero estaba seguro de que alguien tenía que haber hecho esto antes. Simplemente fue difícil encontrarlo, por alguna razón.

Finalmente encontré algunas fonts:

https://github.com/Rob–W/cors-anywhere/#documentation

^ preferido Si necesita un uso poco frecuente, creo que puede usar su aplicación heroku. De lo contrario, es un código para ejecutarlo usted mismo en su propio servidor. Tenga en cuenta cuáles son los límites.

whateverorigin.org

^ segunda opción, pero bastante viejo. supuestamente nueva opción en Python: https://github.com/Eiledon/alloworigin

luego está la tercera opción:

http://anyorigin.com/

Lo cual parece permitir un poco de uso gratuito, pero te pondrá en una lista de vergüenza pública si no pagas y usas una cantidad no especificada, de la que solo puedes ser eliminado si pagas la tarifa …

No se menciona, pero puede ayudar en algunos casos:

 var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState !== 4) return; if (xhr.status === 200) { var doc = iframe.contentWindow.document; doc.open(); doc.write(xhr.responseText); doc.close(); } } xhr.open('GET', url, true); xhr.send(null); 

Utilice esta línea dada a continuación en lugar de la función de header() .

 echo ""; 

tuve este problema y lo resolví editando httd.conf

  = 2.4.7 > Header always setifempty X-Frame-Options GOFORIT   Header always merge X-Frame-Options GOFORIT   

cambié SAMEORIGIN a GOFORIT y reinicié el servidor

Prueba esto, no creo que nadie haya sugerido esto en el Tema, esto se resolverá como el 70% de tu problema, para algunas otras páginas, tienes que eliminar, tengo la solución completa pero no para público,

AÑADIR debajo de su iframe

sandbox = “allow-same-origin allow-scripts allow-popups allow-forms”

Intereting Posts