2010-11-10 11 views
6

chcę zrobić coś takiego:W jaki sposób zasady dotyczące domen w domenie działają dla okien wyskakujących, gdy adres URL jest skonfigurowany do uruchamiania JavaScript?

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

Moje pytanie brzmi, czy żądania Ajax (wykonywany raz nowe okno) uznać wniosek cross-site? Czy zasady tej samej domeny dotyczą pierwotnej domeny, której strona utworzyła okno?

W resposne na niektóre komentarze:

someAjaxFunction() prostu musi złożyć wniosek Ajax i być w stanie pracować na wynik. Rozumiem, że funkcję należy zdefiniować w oknie, które otwieram. Nie ma problemu; Mam minified ajax funkcji, które używam, które mogę wstrzyknąć do adresu URL, jak również. Chodzi o to, aby zobaczyć, jakie są ograniczenia żądania; np. w jakiej domenie będą stosowane zasady tej samej domeny?

+0

Dobre pytanie! Jednak wiesz, że będziesz musiał zaimportować całkiem sporo, aby uruchomić 'someAjaxFunction()', ponieważ nie będziesz miał dostępnych bibliotek okna otwierającego? W każdym razie zakładam, że lokalizacja skryptu dla celów sprawdzania tego samego pochodzenia jest "niezdefiniowana". –

+0

Co to ma znaczyć? Czy chcesz, aby wywołanie AJAX pobierało adres URL dla nowego okna? A może wywołanie AJAX ma na celu pobranie nowej zawartości okna? Jeśli to drugie, to nie ma większego sensu, chyba że to, co robisz, to POST. – Pointy

+0

Należy również zauważyć, że naprawdę ** nie ma takiej rzeczy ** jako adresu URL "javascript:". – Pointy

Odpowiedz

4

Kilka informacji od 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.

informacji od Mozilli

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

Więc odpowiedź brzmi

  1. Więc, jeżeli protokół i nazwa hosta i port mecz dla wszystkich przeglądarek ale IE, to w tej samej domenie
  2. Jeżeli protokół i nazwa hosta mecz dla IE, to ta sama domena

przeciwnym razie są ograniczone.

EDIT - realna odpowiedź

window.open('javascript:doFunction()') nic nie robić oprócz otworzyć nowe puste okno, które nie jest do niczego, bo doFunction nie jest zdefiniowana. Należy go zdefiniować w tym samym oknie.

Sidenote mogę zrobić żądania XHR tego samego pochodzenia przez wstrzykiwanie ajax do adresu URL bezpośrednio, ale nadal jest podatny na politykę tej samej domeny.

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"); '); 

Nie powiedzie się w przeglądarce Firefox. I jeszcze tego nie testowałem w MSIE.Ale

Testy:

(niewydolność) Chrome 7 (konsola) z 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 

(sukces) Chrome 7 (konsola) z http://stackoverflow.com:80

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

(awaria) Firefox 3.6 (konsola) z 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>. 

(sukcesu) Firefox 3.6 (konsoli) z http://stackoverflow.com:80

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

(awarii) Firefox 3.6 (konsoli) z http://stackoverflow.com:80

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

(sukces) Firefox 3.6 (konsola) z http://stackoverflow.com:80

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

Dziękujemy za szczegółową odpowiedź. Byłem świadom zasad gry Same-Origin, ale nie zdawałem sobie sprawy, że "javascript: something()" jest traktowany jako inny protokół. Przypuszczam, że oznacza to, że okno otwierane przez 'somesite.com' nie może w ogóle wykonać żadnego żądania Ajax. Wynika to z tego, że żądanie Ajax zostałoby zainicjowane przy użyciu metody podobnej do tej, na którą patrzyłem, co jest liczone jako używanie innego protokołu, co narusza zasady tego samego pochodzenia. –

+1

Wygląda na to, że Chrome traktuje "javascript:" z początkowego adresu URL. http://medero.org/ajax.html. Firefox na to nie zezwala. –

+1

Interesujące. Oto błąd: http://code.google.com/p/chromium/issues/detail?id=30660 –

0

nowym oknie otwiera jak about: blank, a następnie uruchamia skrypt w kontekście tego okna. Zgłaszanie żądań AJAX z tego okna, zgodnie z komentarzami medera, zakończyłoby się niepowodzeniem, ponieważ protokół nie pasuje, więc nie można było otworzyć się na połączenie z żadnym adresem http: url.

Twoje pytanie można poprawić, jeśli wspomnieć, co naprawdę staramy się robić, zamiast po prostu ciekawy ...

+0

Komentarze Medera są prawdziwe, niezależnie od tego, co próbuję zrobić. –

Powiązane problemy