2010-11-10 10 views
6

voglio fare qualcosa di simile:Come funziona la politica dello stesso dominio per le finestre popup quando l'URL è impostato per l'esecuzione di JavaScript?

var w = window.open("javascript: makeAnAjaxRequest();"); 

La mia domanda è, sarebbe la richiesta Ajax (eseguito una volta che la nuova finestra si apre) essere considerato una richiesta di cross-site? La politica dello stesso dominio si applica al dominio originale la cui pagina ha creato la finestra?

In resposne ad alcuni dei vostri commenti:

someAjaxFunction() deve solo fare una richiesta Ajax e in grado di operare sul risultato. Capisco che la funzione deve essere definita nella finestra che sto aprendo. Nessun problema; Ho una funzione ajax minificata che sto usando che posso iniettare anche nell'URL. Il punto è vedere quali sono i limiti della richiesta; vale a dire, in quale dominio verrà applicata la politica dello stesso dominio?

+0

Bella domanda! Tuttavia, sei consapevole che dovrai importare parecchio per eseguire 'someAjaxFunction()', dato che non avrai a disposizione le librerie della finestra di apertura? Comunque, la mia scommessa è che la posizione della sceneggiatura ai fini del controllo della stessa origine è 'indefinita'. –

+0

Cosa significa questo? Vuoi che la chiamata AJAX recuperi l'URL per la nuova finestra? O la chiamata AJAX dovrebbe recuperare i nuovi contenuti della finestra? In quest'ultimo caso, non ha molto senso a meno che quello che stai facendo sia un POST. – Pointy

+0

Nota anche che non esiste davvero ** niente di simile ** come un URL "javascript:". – Pointy

risposta

4

alcune informazioni da Google: http://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_DOM_access

With no additional qualifiers, the term "same-origin policy" most commonly refers to a mechanism that governs the ability for JavaScript and other scripting languages to access DOM properties and methods across domains (reference). In essence, the model boils down to this three-step decision process:

If protocol, host name, and - for browsers other than Microsoft Internet Explorer - port number for two interacting pages match, access is granted with no further checks. Any page may set document.domain parameter to a right-hand, fully-qualified fragment of its current host name (e.g., foo.bar.example.com may set it to example.com, but not ample.com). If two pages explicitly and mutually set their respective document.domain parameters to the same value, and the remaining same-origin checks are satisfied, access is granted. If neither of the above conditions is satisfied, access is denied.

informazioni da Mozilla

I can not access the properties of the new secondary window. I always get an error in the javascript console saying "Error: uncaught exception: Permission denied to get property . Why is that?

It is because of the cross-domain script security restriction (also referred as the "Same Origin Policy"). A script loaded in a window (or frame) from a distinct origin (domain name) cannot get nor set properties of another window (or frame) or the properties of any of its HTML objects coming from another distinct origin (domain name). Therefore, before executing a script targeting a secondary window, the browser in the main window will verify that the secondary window has the same domain name. More reading on the cross-domain script security restriction: http://www.mozilla.org/projects/secu...me-origin.html

Quindi la tua risposta è

  1. Quindi, se il protocollo e l'hostname e la porta può competere con tutti i browser, ma IE, è lo stesso dominio
  2. Se la partita protocollo e l'hostname per IE, è lo stesso dominio

In caso contrario, si sono limitati.

EDIT - vera risposta

window.open('javascript:doFunction()') non avrebbe fatto altro che aprire una nuova finestra vuota, che non riesce a fare nulla perché doFunction non è definito. Deve essere definito nella stessa finestra.

Sidenote Posso fare la stessa richiesta xhr di origine iniettando direttamente l'ajax nell'url, ma è comunque suscettibile al criterio dello stesso dominio.

x = window.open('javascript:x = new XMLHttpRequest; x.open("GET", "http://medero.org", false); x.onreadystatechange = function(){ if (x.readyState != 4) { return; }; alert(x); alert(x.responseText);}; try {x.send(null); } catch (e) { alert(e)}; alert("ok"); '); 

Fallisce in Firefox. E non l'ho ancora testato in MSIE.Ma

Test:

(guasto) Chrome 7 (console) dal http://stackoverflow.com:80

>>> x = window.open('http://google.com', 'fds', 'width=200, height=300') 
>>> x.document.body.innerHTML='test'; 
TypeError: Cannot read property 'body' of undefined 

(successo) Chrome 7 (console) dal http://stackoverflow.com:80

>>> x = window.open('http://stackoverflow.com', 'fds', 'width=200, height=300') 
>>> x.document.body.innerHTML='test'; 
"test" 

(fallimento) Firefox 3.6 (console) dal http://stackoverflow.com:80

>>> x = window.open('http://google.com', 'fds', 'width=200, height=300') 
>>> x.document.body.innerHTML='test'; 
Permission denied for <http://stackoverflow.com> to get property Window.document from <http://www.google.com>. 

(successo) Firefox 3.6 (console) dal http://stackoverflow.com:80

>>> x = window.open('http://stackoverflow.com', 'fds', 'width=200, height=300') 
>>> x.document.body.innerHTML='test'; 
"test" 

(fallimento) Firefox 3.6 (console) da http://stackoverflow.com:80

$.ajax({ 
    url:'http://bing.com', 
    success:function(data) { 
     alert(data) // blank alert 
    } 
}) 
.210

(successo) Firefox 3.6 (console) dal http://stackoverflow.com:80

$.ajax({ 
    url:'http://stackoverflow.com', 
    success:function(data) { 
     alert(data) // success 
    } 
}) 
+0

Grazie per la tua risposta dettagliata. Ero a conoscenza delle regole di Same-Origin, ma non ero a conoscenza del fatto che "javascript: something()" contasse come se usassi un protocollo diverso. Suppongo che questo significhi che la finestra che si apre 'somesite.com' non possa eseguire alcuna richiesta Ajax. Ciò è dovuto al fatto che la richiesta Ajax sarebbe stata avviata utilizzando un metodo simile a quello che stavo esaminando, che conta come se si utilizzasse un protocollo diverso, violando così la politica della stessa origine. –

+1

In realtà sembra che Chrome tratti 'javascript:' dall'URL iniziale. http://medero.org/ajax.html. Firefox non lo consente. –

+1

Interessante. Ecco il bug: http://code.google.com/p/chromium/issues/detail?id=30660 –

0

La nuova finestra si apre come about: blank e quindi esegue il codice JavaScript nel contesto di quella finestra. Fare richieste AJAX da quella finestra, in base ai commenti del meder, fallirebbe perché il protocollo non corrisponde, quindi non saresti in grado di aprire per connetterti a qualsiasi http: url.

La tua domanda potrebbe essere migliorata se si parla ciò che realmente sta cercando di fare, piuttosto che essere curiosi ...

+0

I commenti di Meder sono vere, qualunque cosa stia cercando di fare. –

Problemi correlati