[AJAX] przekierowania i permission denied

0

Przeglądarka Internet Explorer. Sprawa wygląda następująco.

Sytuacja nr 1.
Na serwerze lokalnym jest plik http://localhost/test.html, który wykorzystuje przy pomocy AJAXa plik http://www.gdziestam.pl/ajax.php - wszystko działa OK.

Sytuacja nr 2.
Ten sam plik odpalony z dysku jako file:///C:/test.html, który wykorzystuje przy pomocy AJAXa plik http://www.gdziestam.pl/ajax.php - wszystko działa OK.

Sytuacja nr 3.
Na serwerze na stronce http://www.gdziestam.pl/link.html jest link po kliknięciu odpalający file:///C:/test.html (nie z localhosta, tylko z dysku lokalnego przez file właśnie). Stronka wchodzi, ale AJAX przestaje działać (permission denied).

Pytanie brzmi: skoro sytuacja 2 działa, a skrypt php znajduje się na tym samym serwerze co link.html, to dlaczego nie działa sytuacja 3, i czy da się to jakoś obejść? Z góry dziękuję za odpowiedzi i sugestie.

0

nie da się. nie możesz z nielokalnej strony odwoływać się do lokalnych plików; w przeciwnym wypadku dowolna strona mogłaby pobierać dowolne dane z twojego dysku.

0
ŁF napisał(a)

nie da się. nie możesz z nielokalnej strony odwoływać się do lokalnych plików; w przeciwnym wypadku dowolna strona mogłaby pobierać dowolne dane z twojego dysku.

Chyba mnie nie zrozumiałeś. Nie chcę odwoływać się do lokalnych plików, tylko do skryptu na serwerze.

Przy odpalonym od razu z kompa pliku: file:///C:/test.html, AJAXowe odwołanie do pliku http://www.gdziestam.pl/ajax.php działa. Natomiast przy przekierowaniu na stronę file:///C:/test.html poprzez kliknięcie w link AJAX już nie działa (a stronka odpala się).
Więc z nielokalnej strony mogę odwołać się do lokalnego pliku poprzez kliknięcie w odnośnik. I dalej chcę, żeby mi ten AJAX działał tak samo, jak to jest przy bezpośrednim odpaleniu pliku z dysku. Przecież tak naprawdę to (prawie) niczym się nie różni ;)

0

A czy działa Ci to w innych przeglądarkach? Firefox? Opera? (szczególnie Opera jest restrykcyjna jeśli chodzi o bezpieczeństwo)

Generalnie jest tak, że XMLHttpRequest (XHR) może odwoływać się jedynie do plików z tej samej domeny, z której pochodzi strona. Skrypty z dysku lokalnego nie pochodzą z www.gdziestam.pl. Jednak jak widać przeglądarki dają skryptom lokalnym inne -- wyższe -- uprawnienia i pozwalają się komunikować ze stronami na zdalnych serwerach.

Podejrzewam, że IE może mieć problem z przechodzeniem z jednej strefy bezpieczeństwa do drugiej. W IE -- choć nie pamiętam na 100% jak to jest w obecnej wersji -- było to tak rozwiązane, że skrypty z niższymi uprawnieniami były odseparowane od tych z wyższymi. Przyznam się jednak, że nie testowałem lokalnego odniesienia się do XHR, więc trochę zgaduję, że tu o to może chodzić. W każdym razie było tak, że jeśli okno przeglądarki miało niższe uprawnienia, to aby odpalić coś z wyższymi trzeba było uruchomić... nowe okno przeglądarki (przynajmniej na Windows Vista). Strzelam trochę w ciemno, że być może ten problem dotyczy właśnie tego. Najpierw masz otwartą stronę na zdalnym serwerze, więc dla IE jest ona "potencjalnie niebezpieczna" i przeglądarka nakłada ograniczenia (na całe okno, czy jedną kartę). Potem przechodzisz do strony lokalnej, ale ograniczenia nałożone są nadal.

Gdy odpalasz od razu stronę lokalną, to IE jest w trybie "czuję się bezpiecznie" i ograniczeń takich nie nakłada.

Rozwiązaniem tego typu problemów z bezpieczeństwem jest oczywiście olanie XHR i wykorzystanie elementów script. Tym sposobem można się komunikować z różnymi domenami i ograniczenia bezpieczeństwa praktycznie nie istnieją, ale oprócz tego metoda ta ma mniejsze możliwości niż XHR. Trudniej odnieść się do treści odpowiedzi. Przesyłać można w zasadzie tylko skrypty. To da się obejść stosując JSON i wywołania zwrotne, ale już np. kombinować z nagłówkami (setRequestHeader) się nie da.

0

Dziękuję za obszerną wypowiedź.

bswierczynski napisał(a)

A czy działa Ci to w innych przeglądarkach? Firefox? Opera? (szczególnie Opera jest restrykcyjna jeśli chodzi o bezpieczeństwo)

Oczywiście nie działa - nawet kliknięcie w odnośnik do lokalnego pliku nie działa (podobno w FF można to jakoś ustawić, ale akurat inne przeglądarki nie mają dla mnie użytku, wykorzystuję IE gdyż potrzebuję zapisywać dane na dysku, a ta przeglądarka jest "dobra", jeśli chodzi o takie sprawy). Witryna jest dodana do zaufanych i poziom bezpieczeństwa jest maksymalnie niski, podobnie intranet.

Generalnie, teraz problem rozszerzył się do tego, że po aktualizacji do IE8, w odpalonym w powyższy sposób pliku lokalnym nie działa już nawet zwykły javascript...
(podobnie jak powyżej, witryna dodana do zaufanych i najniższy poziom bezpieczeństwa - i klops, nie działa nawet zwykły alert)

0

Na prawdę głęboko się zastanowiłeś, co by się stało jakby przeglądarka mogła odpalić dowolny program przez file?

0

Sprawa wyjaśniona - HttpRequest obsługuje tylko protokoły http i https.

0
motylek napisał(a)

Przy odpalonym od razu z kompa pliku: file:///C:/test.html, AJAXowe odwołanie do pliku http://www.gdziestam.pl/ajax.php działa. Natomiast przy przekierowaniu na stronę file:///C:/test.html poprzez kliknięcie w link AJAX już nie działa (a stronka odpala się).

motylek napisał(a)

Sprawa wyjaśniona - HttpRequest obsługuje tylko protokoły http i https.

uzgodniłbyś zeznania z poprzednim motylkiem

0

Gdzie tu jest niezgodność teorii? Przeglądarka nie używa XHR do otwierania każdej strony, on napisał że uruchamia stronę w FF z pliku:

file://C:/test.html
i tam odwołuje się do
http://gdziestam.pl/ajax.php

Gdzie jest w tym przykładzie owe wywołanie file AJAXem?

0

Dokładnie, sprzeczności w tym miejscu nie ma. Ale i tak nie rozumiem uzasadnienia, że to nie działa, bo "XHR obsługuje tylko http(s)". Przecież XHR żądał pliku "http://www.gdziestam.pl/ajax.php", a więc używał w tym momencie protokołu http, który obsługuje (o_O).

1 użytkowników online, w tym zalogowanych: 0, gości: 1