Come già detto here, non dovresti aspettarti che l'origine del genitore ti venga inviata nel parametro postMessage
. Invece:
Se vi aspettate di ricevere messaggi da altri siti, verificare sempre l'identità del mittente utilizzando il origine e possibilmente fonte proprietà. Qualsiasi finestra (incluso, ad esempio, http://evil.example.com) può inviare un messaggio a a qualsiasi altra finestra e non si garantisce che un mittente sconosciuto non invii messaggi dannosi. Dopo aver verificato l'identità , è comunque necessario verificare sempre la sintassi del messaggio ricevuto . In caso contrario, un buco di sicurezza nel sito di cui ti fidi di per inviare solo messaggi attendibili potrebbe quindi aprire un foro di scripting cross-site nel tuo sito.
E una volta che hai l'URI del frame principale nell'iframe, puoi verificarne l'autorizzazione con una semplice chiamata AJAX al server. Dal mio punto di vista, una chiamata al server è inevitabile e in un modo o nell'altro si farà una tale chiamata.
Ci sono altri modi per sapere chi include l'iframe ma non si affidano a postMessage
. Ad esempio, se stai utilizzando PHP, puoi controllare $_SERVER['HTTP_REFERER']
per vedere chi sta richiedendo il tuo iframe prima ancora che venga inviato al browser. Eppure ci sono modi per referrer spoofing pure.
Se l'applicazione richiede una solida soluzione a prova di proiettile, la comunicazione da server a server è la tua strada. In questo scenario, ogni tuo cliente ha un nome utente e una password e il server web che sta per servire la pagina principale dovrebbe richiedere un token pass one time dal server web che sta servendo l'iframe (questa è una comunicazione server-server). E quindi utilizzare il token nell'URL dell'iframe per essere rispedito al server generato. Ecco un passo per passo di questo scenario:
utente finale chiede l'URL http://customer.com/main.php
.
Mentre main.php
è l'esecuzione e popolare la risposta, anche collega a http://you_website.com/generate_token.php?username=cutomer1&password=123
e ottiene un passaggio volta gettone token1
.
La risposta viene restituita al browser contenente un iframe con URL http://your_website.com/iframe.php?token=token1
.
In iframe.php
di verificare la token1
per vedere se è valida, e , allo stesso tempo, si esegue l'autenticazione del richiedente senza in realtà chiedere per il suo username e/o password (in quanto si sa che hai generato il token per).
Tali token vengono solitamente eliminati una volta utilizzati (un passaggio di tempo) e generalmente vengono forniti con una data di scadenza. Ma dipende da te e dalla tua applicazione.
Credo che tu abbia commesso un errore nel tuo secondo esempio. Penso che volessi dire 'postMessage (" any.domain.com "," domain.b.com ")' nel tuo primo postMessage! – Mehran
Hai ragione ... mi dispiace per quello –
C'è un motivo per cui non fornisci semplicemente il dominio genitore nell'URL caricato all'interno dell'iframe ('