2011-11-17 18 views
9

Tengo un widget que creé y lo estoy incorporando en otros sitios web utilizando un iFrame. Lo que quiero hacer es asegurarme de que nadie pueda ver la fuente y copiar el código de iFrame y ponerlo en su propio sitio web.Protección de iFrame: solo permite que funcione en un dominio

Puedo almacenar la URL que se debe permitir en la base de datos. Lo he visto antes, un sitio tenía un código cifrado largo y si no coincidía con el dominio, decía Acceso denegado ...

¿Alguien sabe cómo puedo hacer esto?

Gracias!

+2

muchos tonos de absolutamente imposible. – rook

+0

+1 @Rook. Entablé una conversación con Mech Software para que lo pensara bien pero, por supuesto, tienes toda la razón. :-) – Cheekysoft

Respuesta

10

No, no puedes hacer esto. Lo mejor que puede hacer es la siguiente:

if (window.top.location.host != "hostname") { 
    document.body.innerHTML = "Access Denied"; 
} 

Añadir lo anterior a su JavaScript y luego usar un JavaSript obfuscator

+0

Corregí tu referencia DOM a 'window.top.location.host' - que se referirá al host del marco superior (el sitio que está tratando de incrustar el widget) y no a' window.location.host' que será el host que sirve el widget. – Cheekysoft

+0

@Cheekysoft ohh, me olvidé de eso – noob

+0

Cuando agrego esto a mi código y miro el sitio en el que está incrustado en Firebug, obtengo esto: "Permiso denegado para acceder a la propiedad 'host'" – Drew

4

En el servidor en el código de la página que se muestra en el IFRAME, verifique el valor del encabezado Referer. A menos que este encabezado se haya bloqueado por razones de privacidad, contiene la URL de la página que aloja el IFRAME.

+0

referente puede ser fácilmente falsificado. Nunca confíe en él (ni en ningún otro encabezado HTTP) – Cheekysoft

+6

Ciertamente puede ser, pero algunos navegadores de cliente arbitrarios NO serán falsos. Él no está pidiendo evitar que las personas vean su fuente, solo quiere evitar que las personas pongan el marco en su propio sitio. –

2

Lo que estás pidiendo es casi imposible. Si pone la fuente a disposición en la web, alguien puede copiarla de una forma u otra. Cualquier truco de JavaScript puede ser derrotado utilizando herramientas de bajo nivel como wget o curl.

Así que incluso si lo protege, aún encontrará que alguien podría, en teoría, copiar el código (ya que el navegador lo recibiría) y, si así lo determina, colocarlo en su propio sitio web.

+0

Es * imposible * detener a alguien que vea cómo está incrustado el widget, pero no es imposible evitar que su widget funcione correctamente, si puede determinar si ha sido incluido en un lugar que no desea. – Cheekysoft

+1

@ Cheekysoft Estoy de acuerdo en que puede hacerlo inoperable, pero este tipo de solución no funcionará para los determinados. Esa línea de código podría ejecutarse fácilmente a través de un archivo PHP usando file_get_contents y reemplazar la línea con un valor estático que la derrote por completo. –

+0

Un muy buen punto; Estás absolutamente en lo correcto.Si el widget dependía de la comunicación de regreso a la nave nodriza para funcionar, entonces esto podría remediarse. Ponga parte de la funcionalidad clave en su servidor y llámela con XHR, que deberá confirmar la Política de origen idéntico y, por lo tanto, fallará si alguien altera y republica el código JS. – Cheekysoft

6

Usted no puede evitar que la gente mirando el código HTML, pero hay algunas cabeceras pueden permitir para especificar qué sitios pueden insertar su iframe. Eche un vistazo al encabezado X-Frame-Options y la directiva frame-ancestors de Content-Security-Policy. Los navegadores que lo respeten se negarán a cargar el iframe cuando estén incrustados en el sitio de otra persona.

1

Me enfrenté al mismo problema, pero devuelvo al usuario en una página de inicio. Difundí la decisión.

Tiene que ser colocado donde hay iframe

<script> 
     $(window).load(function() { 
      var timetoEnd = ''; 
      var dstHost = 'YOUR-ALLOW-HOST'; 
      var backToUrl = 'BACK-TO-URL'; 

      function checkHost(){ 
       var win = window.frames.YOUR-IFRAME-NAME; 
       win.postMessage('checkHost', dstHost); 
        console.log('msg Sended'); 
        clearInterval(timetoEnd); 
        timetoEnd = setInterval(function() { 
         window.location.href = backToUrl; 
        }, 5000); 
       } 

       function validHost(event) { 
        if (event.data == 'checkHostTrue') { 
         clearInterval(timetoEnd); 
         console.log('checkHostTrue'); 
        } else { 
         return; 
        } 
       } 

       window.addEventListener("message", validHost, false); 
       checkHost(); 

       setInterval(function() { 
        checkHost(); 
       }, 10000 
       ); 
      }); 
    </script> 

Tiene que ser colocado en su iframe src

<script> 
      function receiveMessage(event) 
      { 
       if(event.data=='checkHost'){ 
        event.source.postMessage("checkHostTrue", 
          event.origin); 
       } else { 
        return; 
       } 
      } 
      window.addEventListener("message", receiveMessage, false); 
</script> 
Cuestiones relacionadas