JavaScript non sicuro tenta di accedere al frame con URL


112

Ricevo l'errore seguente quando provo a impostare un valore hash sull'URL principale da iframe che contiene un altro URL di dominio:

JavaScript non sicuro tenta di accedere al frame con URL "URL1" dal frame con URL "URL2". Domini, protocolli e porte devono corrispondere.

Come posso risolvere questo problema?


3
Per favore aggiungi maggiori dettagli, frammenti di codice, messaggio di errore, framework che usi .. Più verbosità, più dettagli ..
fifigyuri

5
Che cosa succede quando si implementano plug-in social g + 1, facebook like o shre e twitter che vengono caricati in iframe e generano lo stesso errore?

La domanda è PERCHÉ gli script di Facebook e Google stanno anche cercando di accedere agli elementi del mio sito web.
sergio

Risposte:


124

Da un documento figlio di diversa origine non è consentito l'accesso alla location.hashproprietà della finestra superiore , ma è consentito impostare la locationproprietà stessa.

Ciò significa che, dato che la posizione in alto delle finestre è http://example.com/page/, invece di fare

parent.location.hash = "#foobar";

devi conoscere la posizione dei genitori e farlo

parent.location = "http://example.com/page/#foobar";

Poiché la risorsa non viene esplorata, funzionerà come previsto, cambiando solo la parte hash dell'URL.

Se lo stai utilizzando per la comunicazione tra domini, ti consiglio invece di utilizzare easyXDM .


13
Nessuno l'ha contrassegnata come risposta e tuttavia ha 60 voti positivi. Dovrebbe esserci un badge per questo.
zachzurn

35
Come si chiamerebbe il badge? "
Ha

1
Ehi @atul, sii gentile e contrassegna questa risposta come la migliore. Sii rispettoso delle convenzioni che consentono a tutti noi di beneficiare della conoscenza degli altri ...
Clint Eastwood

13

Il Crossframe-Scripting non è possibile quando i due frame hanno domini diversi -> Sicurezza.

Vedi questo: http://javascript.about.com/od/reference/a/frame3.htm

Ora, per rispondere alla tua domanda: non c'è soluzione o aggiramento, dovresti semplicemente controllare il design del tuo sito web perché devono esserci due frame di domini diversi che cambiano l'URL dell'altro.


82
Questo è un requisito frequente quando si integra un'applicazione di terze parti nel proprio sito Web, soprattutto quando i servizi Web e simili non sono un'opzione.
Jacques

9

Ricevo lo stesso messaggio di errore quando ho provato a modificare il dominio per iframe.src.

Per me, la risposta è stata cambiare iframe.src in un URL sullo STESSO dominio, ma che in realtà era una pagina di reindirizzamento html al dominio desiderato. L'altro dominio è quindi apparso nel mio iframe senza errori.

Ha funzionato come un fascino. :)


potresti approfondire di più esattamente quello che hai fatto qui?
Devin G Rhode

sarebbe davvero utile se potesse spiegare brevemente.
Madhusudhan

2
Non funziona nell'ultima versione di Chrome: non controlla il parametro src, ma l'URL effettivo caricato. Quindi il trucco del reindirizzamento purtroppo non aiuta in alcun modo :-(
lucaferrario

3
Credo che Tommy si riferisca a un proxy lato server. Vedi ad esempio benalman.com/projects/php-simple-proxy o developer.yahoo.com/javascript/howto-proxy.html o google.com/… o la soluzione di René de Kat su stackoverflow.com/a/11224975/27938
Oskar Austegard

È pulito. Ma illustra solo quanto sia generalmente banale aggirare questo problema. Ok, supponiamo che io sia un malvagio hacker dannoso e voglio eseguire attacchi di cross domain scripting. È probabile che conoscerò questi strumenti e li utilizzerò. Per quanto riguarda le correzioni di sicurezza del browser, questo è facilmente ritardato in quanto IE non ti consente di eseguire Javascript localmente senza preavviso. Non risolve alcun problema. Crea un sacco di nuovi.
Yitzhak

6

Una soluzione potrebbe essere quella di utilizzare un file locale che recupera il contenuto remoto

remoteInclude.php

<?php
$url = $_GET['url'];
$contents = file_get_contents($url);
echo $contents;

Il codice HTML

<iframe frameborder="1" id="frametest" src="/remoteInclude.php?url=REMOTE_URL_HERE"></iframe>
<script>
    $("#frametest").load(function (){       
    var contents =$("#frametest").contents();
});


1
Questo apre la porta a vulnerabilità di scripting cross-site. Un esempio di un possibile attacco: 1. Creo una pagina su myevilserver.com che assomiglia proprio al tuo sito, incluso un modulo di accesso che invia a myevilserver.com 2. Mando una falsa newsletter ai tuoi utenti con un link a https: // yoursite.com/remoteInclude.php?url=myevilserver.com 3. Sul tuo sito vedono un modulo di accesso che acquisisco sul mio server.
EricP

2
Una possibile soluzione è fare in modo che remoteInclude.php controlli tutti gli URL rispetto a un elenco di domini pre-approvato.
EricP

Questo non risolve i problemi di vulnerabilità di cross site scripting. Non c'è assolutamente nulla che io possa fare con Javascript su un sito web esterno che non possa fare dal lato server. Tutto ciò ostacola il browser stesso e rende le app Web meno utili introducendo un passaggio aggiuntivo. Puoi ancora fare tutte queste cose se carichi tramite ajax, riscrivi i link e rispondi. Se non funziona, rpc remoto tramite php o qualsiasi altro linguaggio. È assurdo che questo sia un problema anche per il programmatore medio.
Yitzhak

3

Ho scoperto che l'utilizzo della versione XFBML del pulsante Mi piace di Facebook invece della versione HTML5 ha risolto questo problema. Aggiungi il codice seguente nel punto in cui desideri che appaia il pulsante:

<div id="fb-root"></div>
<script>(function (d, s, id) {
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) return;
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

<fb:like send="true" layout="button_count" width="50" show_faces="false" font="arial"></fb:like>

Quindi aggiungi questo al tuo tag HTML:

 xmlns:fb="http://ogp.me/ns/fb#"

2
Cosa c'entra Facebook con questa domanda?
Kukks

16
Perché ricevi questo errore anche sui pulsanti Mi piace di Facebook e ho trovato questa pagina durante la ricerca di una risposta, quindi ho pensato che altri potessero aver bisogno della risposta.
Luke Alderton

1

Il problema è che anche se crei un proxy o carichi il contenuto e lo inietti come se fosse locale, qualsiasi script definito da quel contenuto verrà caricato dall'altro dominio e causerà problemi tra domini.

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.