2011-11-17 28 views
9

Ho un widget che ho creato e lo sto incorporando su altri siti Web utilizzando un iFrame. Quello che voglio fare è assicurarsi che nessuno possa vedere la fonte e copiare il codice iFrame e inserirlo nel proprio sito web.Protezione di iFrame - Consenti solo di funzionare su un dominio

Posso memorizzare l'URL che dovrebbe essere consentito nel database. Ho visto fare prima, un sito aveva una lunga criptato codice e se non corrisponde al dominio allora ha detto Accesso negato ..

Qualcuno sa come posso fare questo?

Grazie!

+2

molte sfumature di assolutamente impossibile. – rook

+0

+1 @Rook. Ho preso una conversazione con Mech Software per farmi riflettere correttamente ma, ovviamente, hai assolutamente ragione. :-) Il referrer – Cheekysoft

risposta

10

No, non puoi farlo. La cosa migliore che puoi fare è la seguente:

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

Aggiungere quanto sopra per il tuo JavaScript e quindi utilizzare un JavaSript obfuscator

+0

Ho corretto il riferimento DOM a 'window.top.location.host' - che farà riferimento all'host del frame superiore (il sito che sta cercando di incorporare il widget) e non a' window.location.host' che sarà l'host che serve il widget. – Cheekysoft

+0

@Cheekysoft ohh grazie Ho dimenticato che – noob

+0

Quando aggiungo questo al mio codice e guardo il sito in cui è incorporato in Firebug, ottengo questo: "Autorizzazione negata per accedere alla proprietà 'host'" – Drew

4

Sul server nel codice per la pagina visualizzata nell'IFRAME, controllare il valore dell'intestazione Referer. A meno che questa intestazione non sia stata bloccata per motivi di privacy, contiene l'URL della pagina che ospita l'IFRAME.

+0

può essere facilmente falsificato. Mai fare affidamento su di esso (o qualsiasi altra intestazione HTTP) – Cheekysoft

+6

Certo che può essere, ma alcuni browser client arbitrari NON saranno spoofing. Non sta chiedendo di impedire alla gente di vedere la sua fonte, vuole solo impedire alle persone di mettere la cornice sul proprio sito. –

2

Quello che stai chiedendo è praticamente impossibile. Se rendi la fonte disponibile sul Web, qualcuno può copiarla in un modo o nell'altro. Qualsiasi trucco javascript può essere sconfitto utilizzando strumenti di basso livello come wget o curl.

Quindi, anche se lo proteggi, scoprirai comunque che qualcuno potrebbe teoricamente copiare il codice (come il browser lo riceverebbe) e potrebbe, se così determinato, metterlo sul proprio sito web.

+0

È * impossibile impedire a qualcuno di vedere come è incorporato il widget, ma non è impossibile impedire il corretto funzionamento del widget, se è in grado di determinare che è stato inserito in ifram in un punto che non desidera essere. – Cheekysoft

+1

@Cheekysoft Sono d'accordo che tu possa renderlo inutilizzabile ma questo tipo di soluzione non funzionerà per il determinato. Quella riga di codice può essere facilmente eseguita attraverso un file PHP utilizzando file_get_contents e la linea viene sostituita con un valore statico che la sconfigge completamente. –

+0

Un ottimo punto; Hai assolutamente ragione.Se il widget si basava sulla comunicazione di ritorno alla nave madre per funzionare, allora questo potrebbe essere risolto. Metti alcune delle funzionalità chiave sul tuo server e chiamalo con XHR, che dovrà confermare con Same Origin Policy e quindi fallire se qualcuno altera e ripubblica il codice JS. – Cheekysoft

6

non si può impedire alle persone di guardare il codice HTML, ma ci sono alcune intestazioni possono permettere per specificare quali siti possono incorporare l'iframe. Dai un'occhiata all'intestazione X-Frame-Options e alla direttiva frame-ancestors di Content-Security-Policy. I browser che lo rispettano rifiuteranno di caricare l'iframe quando saranno incorporati nel sito di qualcun altro.

1

Ho affrontato lo stesso problema, ma restituisco l'utente su una home page. Ho diffuso la decisione.

deve essere posizionato dove c'è 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> 

Esso deve essere collocato nel vostro iframe src

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