Come impedire a IFRAME di reindirizzare la finestra di livello superiore


133

Alcuni siti Web hanno il codice per "rompere" gli IFRAMEallegati, il che significa che se una pagina Aviene caricata come IFRAMEall'interno di una pagina padre, PJavascript Areindirizza la finestra esterna A.

In genere questo Javascript è simile al seguente:

<script type="text/javascript">
  if (top.location.href != self.location.href)
     top.location.href = self.location.href;
</script>

La mia domanda è: in quanto autore della pagina principale Pe non essendo autore della pagina interna A, come posso evitare Adi fare questa rottura?

PS Mi sembra che dovrebbe essere una violazione della sicurezza tra siti, ma non lo è.


Non penso che tu possa fare molto ... se non sei l'autore del contenuto del frame.
scunliffe,

Risposte:


43

Prova a utilizzare la proprietà onbeforeunload, che consentirà all'utente di scegliere se desidera uscire dalla pagina.

Esempio: https://developer.mozilla.org/en-US/docs/Web/API/Window.onbeforeunload

In HTML5 è possibile utilizzare la proprietà sandbox. Di seguito, vedi la risposta di Pankrat. http://www.html5rocks.com/en/tutorials/security/sandboxed-iframes/


1
iFrame fanno consentire la comunicazione tra domini, però, usando postMessage. Questo non è un rischio per la sicurezza, ma a qualcuno potrebbe interessare sapere che questa funzionalità esiste quando vedono il tuo commento. :)
coreyward

Al momento non è stato possibile scrivere questa risposta. Grazie per averlo precisato.
fasih.rana,

@SirDarius potresti per favore mostrare un esempio, molto apprezzato.
user198989

L'utente non saprà perché questa conferma appare e probabilmente selezionerà una risposta casuale. Non consiglio di usarlo. Ci sono altre soluzioni: la sandbox.
Oriadam,

1
@ fasih.rana Il secondo articolo mi ha aiutato molto. Grazie;)
MrD,

127

Con HTML5 è stato aggiunto l'attributo sandbox iframe . Al momento della stesura di questo funziona su Chrome, Safari, Firefox e le versioni recenti di IE e Opera ma fa praticamente quello che vuoi:

<iframe src="url" sandbox="allow-forms allow-scripts"></iframe>

Se si desidera consentire i reindirizzamenti di livello superiore, specificare sandbox="allow-top-navigation".


aspetta cosa? Ti hanno lasciato fare questo? Ho pensato che se un sito Web avesse voluto uscire, tutti i browser lo avrebbero lasciato. In che modo le persone dovrebbero tenere il loro sito Web fuori da iframe con questo in giro? Non mi lamento però, fantastico.
Farzher,


1
@StephenSarcsamKamenar Se vuoi proteggere il tuo sito dalla visualizzazione in iframe, c'è l' intestazione X-Frame-Options disponibile con il valore SAMEORIGIN . La maggior parte dei browser moderni non visualizzerà il sito in iframe con questa intestazione.
Grzegorz,

4
Sfortunatamente sandboxnon consente Flash o qualsiasi altro tipo di oggetto nella cornice sandbox, rendendo la sandboxfunzione inutile in molti casi.
Oriadam,

1
I siti Web non devono "sfuggire" per protestare contro l'inclusione in un iframe. Possono semplicemente mostrare un messaggio o andare in bianco. Sfortunatamente, consentire l'esecuzione degli script nell'iframe ti apre comunque a un iframe non autorizzato mentre while (1) {} e altri cicli infiniti. Vorrei che ogni iframe potesse avere il suo thread.
Gregory Magarshak,

51

Uso sandbox = "..."

  • allow-form consente l'invio di moduli
  • allow-popups consente i popup
  • allow-pointer-lock consente il blocco del puntatore
  • allow-same-origin consente al documento di mantenere la sua origine
  • allow-scripts consente l'esecuzione di JavaScript e consente inoltre alle funzionalità di attivarsi automaticamente
  • allow-top-navigation consente al documento di uscire dal riquadro navigando nella finestra di livello superiore

La navigazione in alto è ciò che vuoi prevenire, quindi lascialo fuori e non sarà permesso. Qualunque cosa lasciata fuori sarà bloccata

ex.

        <iframe sandbox="allow-same-origin allow-scripts allow-popups allow-forms" src="http://www.example.com"</iframe>

3
Nota che anche Flash (e qualsiasi altro oggetto) verrà bloccato, senza possibilità di permetterlo. Questa "funzione di sicurezza" mi impedisce di usare tutti insieme sandbox
oriadam,


4

So che è passato molto tempo dall'ultima domanda, ma qui è la mia versione migliorata che attenderà 500 ms per ogni chiamata successiva solo quando l'iframe viene caricato.

<script type="text/javasript">
var prevent_bust = false ;
    var from_loading_204 = false;
    var frame_loading = false;
    var prevent_bust_timer = 0;
    var  primer = true;
    window.onbeforeunload = function(event) {
        prevent_bust = !from_loading_204 && frame_loading;
        if(from_loading_204)from_loading_204 = false;
        if(prevent_bust){
            prevent_bust_timer=500;
        }
    }
    function frameLoad(){
        if(!primer){
            from_loading_204 = true;
            window.top.location = '/?204';
            prevent_bust = false;
            frame_loading = true;
            prevent_bust_timer=1000;
        }else{
            primer = false;
        }
    }
    setInterval(function() {  
        if (prevent_bust_timer>0) {  
            if(prevent_bust){
                from_loading_204 = true;
                window.top.location = '/?204';
                prevent_bust = false;
            }else if(prevent_bust_timer == 1){
                frame_loading = false;
                prevent_bust = false;
                from_loading_204 = false;
                prevent_bust_timer == 0;
            }



        }
        prevent_bust_timer--;
        if(prevent_bust_timer==-100) {
            prevent_bust_timer = 0;
        }
    }, 1);
</script>

e onload="frameLoad()"e onreadystatechange="frameLoad();"deve essere aggiunto al frame o iframe.



2

Dato che la pagina caricata all'interno dell'iframe può eseguire il codice "breakout" con un setInterval, il caricamento potrebbe non essere così pratico, dal momento che potrebbe confondere l'utente con "Sei sicuro di voler uscire?" le finestre di dialogo.

C'è anche l'attributo di sicurezza iframe che funziona solo su IE & Opera

:(


2

Nel mio caso, desidero che l'utente visiti la pagina interna in modo tale che il server visualizzi il proprio IP come visitatore. Se uso la tecnica del proxy php, penso che la pagina interna vedrà il mio server IP come visitatore, quindi non va bene. L'unica soluzione che ho ottenuto finora è il wilth onbeforeunload. Metti questo sulla tua pagina:

<script type="text/javascript">
    window.onbeforeunload = function () {                       
         return "This will end your session";
    }
</script>

Funziona sia con Firefox che con quello, è quello per cui ho provato. troverai le versioni usando qualcosa come evt.return (qualunque) merda ... che non funziona in Firefox.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.