iframe java - Superación de "Visualización prohibida por X-Frame-Options"




domains multiple (21)

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 la visualización. Algunas de las páginas que estoy intentando encuadrar prohíben ser enmarcadas y lanzan un "Se niega a mostrar el documento porque la pantalla está prohibida por X-Frame-Options". error en Chrome. Entiendo que esto es una limitación de seguridad (por una buena razón) y no tengo acceso para cambiarla.

¿Hay algún método alternativo de enmarcado o no enmarcado para mostrar páginas dentro de una sola ventana que no se vea afectado por el encabezado de Opciones de X-Frame?


Answers

Tuve este problema y lo resolví editando httd.conf

<IfModule headers_module>
    <IfVersion >= 2.4.7 >
        Header always setifempty X-Frame-Options GOFORIT
    </IfVersion>
    <IfVersion < 2.4.7 >
        Header always merge X-Frame-Options GOFORIT
    </IfVersion>
</IfModule>

Cambié SAMEORIGIN a GOFORIT y reinicié el servidor


target = '_ padre'

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


No estoy seguro de cuán relevante es, pero construí una solución para 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 es vincular el evento de clic del enlace a esta función javascript. Todo lo que hace es hacer una solicitud a un archivo PHP que comprueba los encabezados de las 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("<h3 style='color:480060;'>"+title+"&nbsp;&nbsp;&nbsp;<small>"+link+"</small></h3>");
        $("#linkcontent").attr("src", link);
        $("#myModal").modal("show");
  }
  else{
      window.location.href = link;
      //alert(data);
  }
});


        }

Aquí está el código del archivo PHP que lo verifica:

<?php
$url = rawurldecode($_REQUEST['url']);
$header = get_headers($url, 1);
if(array_key_exists("X-Frame-Options", $header)){
    echo "nein";
}
else{
    echo "ya";
}


?>

Espero que esto ayude.


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

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


La única pregunta que tiene un montón de respuestas. Bienvenido a la guía que desearía tener cuando estaba luchando por hacer esto para que funcionara a las 10:30 de la noche del día de la fecha límite ... FB hace algunas cosas extrañas con las aplicaciones de lienzo, y bueno, has sido advertido. Si todavía estás aquí y tienes una aplicación Rails que aparecerá detrás de un Facebook Canvas, 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 lienzo de Facebook, usé /canvas/ e hice que la ruta fuera al SiteController de 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


&lt% 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;
&lt% end %>

Fuentes

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

Añadiendo un

  target='_top'

a mi enlace en la pestaña de facebook solucioné el problema para mí ...



Estaba usando Tomcat 8.0.30, ninguna de las sugerencias funcionó para mí. Mientras buscamos actualizar X-Frame-Options y establecerlo en ALLOW , aquí está cómo configuré para permitir incrustar iframes:

  • Navegue al directorio conf de Tomcat, edite el archivo web.xml
  • Agregue el siguiente filtro:
<filter>
            <filter-name>httpHeaderSecurity</filter-name>
            <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
                   <init-param>
                           <param-name>hstsEnabled</param-name>
                           <param-value>true</param-value>
                   </init-param>
                   <init-param>
                           <param-name>antiClickJackingEnabled</param-name>
                           <param-value>true</param-value>
                   </init-param>
                   <init-param>
                           <param-name>antiClickJackingOption</param-name>
                           <param-value>ALLOW-FROM</param-value>
                   </init-param>
            <async-supported>true</async-supported>
       </filter>

       <filter-mapping>
                   <filter-name>httpHeaderSecurity</filter-name>
                   <url-pattern>/*</url-pattern>
                   <dispatcher>REQUEST</dispatcher>
       </filter-mapping> 
  • Reinicie el servicio Tomcat
  • Accede a los recursos utilizando un iFrame.

Intente esto, no creo que nadie sugiriera esto en el tema, esto se resolverá como el 70% de su problema, para algunas otras páginas, tiene que descartar, tengo la solución completa pero no para el público,

AGREGUE a continuación a su iframe

sandbox = "allow-same-origin-allow scripts allow-popups allow-forms"


FWIW:

Tuvimos una situación en la que teníamos que matar nuestro iFrame cuando apareció este código de "interruptor". Entonces, usé la function get_headers($url); PHP function get_headers($url); para revisar la URL remota antes de mostrarla en un iFrame . Para un mejor rendimiento, guardé en caché los resultados en un archivo, por lo que no estaba haciendo una conexión HTTP cada vez.


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


La única respuesta real, si no controla los encabezados de su fuente que desea en su iframe, es proxy. Haga que un servidor actúe como un cliente, reciba la fuente, elimine 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 un proxy de este tipo. No es difícil, pero estaba seguro de que alguien tenía que haber hecho esto antes. Era difícil encontrarlo, por alguna razón.

Finalmente encontré algunas fuentes:

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

^ preferido. Si necesitas un uso raro, creo que puedes usar su aplicación heroku. De lo contrario, es el 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 antigua. supuestamente nueva elección en python: https://github.com/Eiledon/alloworigin

Luego está la tercera opción:

http://anyorigin.com/

Lo que parece permitir un poco de uso gratuito, pero lo colocará en una lista pública de vergüenza si no paga y usa una cantidad no especificada, de la cual solo puede ser eliminado si paga la tarifa ...


Parece que X-Frame-Options Allow-From https: // ... se deprecia y se reemplaza (y se ignora) si usa el encabezado Content-Security-Policy en su lugar.

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


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

echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";

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

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

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

Entonces proxy.php se vería algo así como:

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 bien 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 podrían comenzar a cargar páginas web a través de su script proxy.


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);

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

Esto no parece estar documentado en ninguna parte, pero si puede editar las páginas que está tratando de forrame (por ejemplo, son sus propias páginas), simplemente envíe otro encabezado de Opciones de X-Frame con cualquier cadena en todo deshabilitado Los comandos SAMEORIGIN o DENY.

p.ej. para PHP, poniendo

<?php
    header('X-Frame-Options: GOFORIT'); 
?>

en la parte superior de su página hará que los navegadores combinen los dos, lo que resulta en 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ó a nivel de servidor, y le gustaría anularlo en un caso página por página.

¡Todo lo mejor!


Tuve el mismo problema con mediawiki, esto se debió a que el servidor denegó 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.


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



Como dijo pjb3, establece el contexto de jQuery. Si tiene marcos anidados, su código se verá así:

$('*',window.parent.frames[0].frames[0].document).size();

O, mejor aún, crea un atajo:

targetFrame = window.parent.frames[0].frames[0].document;
$('*',targetFrame).size();




iframe frames x-frame-options