Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Ajax] XSS XMLHttpRequest.open
Forum PHP.pl > Forum > XML, AJAX
cioop
Witam,
staram sie zliczac klikniecia na swoich stronach osadzajac sam skrypt js.
Niestety mam problem z XMLHttpRequest.open, ktory mialby otwierac plik z innego serwera.
Kiedy wszystkie pliki sa pod ta sama domena, wszystko dziala. Problem pojawia sie miedzy domenami.
Jak go rozwiazac, zeby dzialalo jak google analytics? Czy w ogole sie da? Jak na razie udaje mi sie wywolac zdalna domene przy uzyciu curl w php, ale wtedy plik php musi sie i tak znajdowac pod ta sama domena co skrypt js, wiec to nie ma sensu.
Z gory dziekuje za pomysly
mrok
jest takie male ograniczenie JS - nazywane "zasada identycznej domeny" - czy jakos tak. ogolnie przez js nie polaczysz sie z plikiem na innej domenie - wzgledy bezpieczenstwa.

Jak to robi google? dodaje na strone maly obrazek (1x1px) ktory pobierany jest z ich serwera. Do adresu obrazka doklejonych jest sporo danych - potem analizuja logi (dlatego min ich statystyki nie sa na biezaco)
AjaxSrajax
Hej,

Można przez JS połączyć się z innym plikiem stosując pewien trik, opisywany np. w książce Kuloodporny Ajax pana Jeremy Keith. Znacznik <script> pozwala na ściągnięcie pliczku tutaj już cytuję ww. pana:

Kod
<script type="text/javascript" src="http://www.google-analytics.com/urchin.js"></script>


Cytat
@Jeremy Keith:
Funkcja jako argument przyjmuje adres URL. Tworzy nowy element script z podanym adresem URL jako atrybut src i dodaje go do elementu head dokumentu:


Kod
function getScript(url){
var scripttag=document.createElement("script");
scripttag.setAttribute("type", "text/javascript");
scripttag.setAttribute("src", url);
document.getElementsByTagName("head")[0].appendChild(scripttag);
}


Może Ci się to przyda, pozdrawiam smile.gif
cioop
nie bardzo rozumiem - czy poprzez wywolanie javascriptu w head'zie zyskuje sie mozliwosc laczenia XmlHttpRequest z inna domena?
AjaxSrajax
XMLHttpRequest nie może łączyć się z inną domeną. To jest pewne. Znacznik script nie ma tych ograniczeń. Za pomocą DOM możesz`pobrać` plik bez przeładowania strony z innej domeny. Jednak musi być to plik JS- np. JSON. Można wygenerować taki plik za pomocą np. PHP. Jeśli nie jest to plik JS, pozostają chyba logi jak pisze kolega wyżej, ale nie bierz tego za pewnik. Niech wypowiedzą się inni:D
pozdrawiam smile.gif
cioop
Dzieki za podpowiedzi, probuje rozwiazania z obrazkiem.

W pliku html, tuz przed body umieszczam odwolanie do skryptu js. w js pobieram potrzebne mi informacje i po kliknieciu wywoluje obrazek:

  1. window.onload = init;
  2.  
  3. function init(){
  4. window.captureEvents(Event.MOUSEDOWN);
  5. window.onmousedown = params;
  6. }
  7.  
  8. function params() {
  9. url = http://adres.pliku.php + "?param1=" + wartosc + "&param2=" + wartosc;
  10. img = "<img style=\"display: none;\" src=\"" + url + "\" />";
  11. document.write(img);
  12. }


Teraz po kliknieciu, wartosci parametrow zapisuja mi sie do bazy, niestety strona zaczyna sie przeladowywac, wyswietla sie pusta, biala strona ... i laduje sie w nieskonczonosc - gdzie popelniam blad?

  1. <?php
  2. $image = imagecreate(1,1);
  3. header ( 'Content-Type: image/jpg' );
  4. imagejpeg ( $image );
  5. $db_connect=mysql_connect(db_host,db_login,db_pass) or die();
  6. @mysql_select_db(db_base,$db_connect) or die();
  7. $insert = "INSERT INTO table (param1, param2) VALUES('".$_GET['param1']."','".$_GET['param1']."')";
  8. $result=mysql_query($insert,$db_connect);
  9. if(!$result){exit(mysql_error($db_connect));}
  10. ImageDestroy($image);
  11.  
  12.  
  13. $href = 'http://adres.pliku.html';
  14.  
  15. //powyzej probuje wpisac adres strony, z ktorej wywolany jest .js,
  16. //ale przekierowanie dziala tylko,
  17. //jesli od razu w przegladarce wpisze sie adres pliku php
  18. //i nie jest to rozwiazanie jakiego szukam
  19.  
  20. header('Content-type: text/html; charset=utf-8');
  21. header('Location:'.$href);
  22.  
  23. exit();
  24. ?>


Jak napisalem wartosci parametrow zapisuja mi sie do bazy poprawnie, wiec problem pojawia sie pewnie dlatego, ze mi czegos brakuje w pliku php, po zapisaniu do bazy. Chcialbym, zeby parametry zapisywaly sie do bazy, ale zeby plik html sie nie przeladowywal - jak to zrobic? Z gory dziekuje za uwagi i pozdrawiam.
mrok
przeladowuje sie dlatego
  1. <?php
  2. header('Location:'.$href);
  3. ?>

tylko to nie tlumaczy dlaczego strona jest pusta ;(

swoja droga w ciekawy sposob rozwiazania tego problemu winksmiley.jpg
cioop
bez headera tez sie przeladowuje i wyswietla pusta strone

sposob ciekawy czy nie, wazne zeby byl skuteczny - probowalem tez dynamicznie tworzyc i wysylac formularz, a takze wywolywac iframe, ale skoro google uzywa obrazka, to moze taki sposob jest najlepszy!?
mrok
faktycznie poprzednie odpowiedz jest trochę mało przemyślana winksmiley.jpg

sprobuj zrobić coś takiego, że na stronce wstawiasz sobie
  1. <div id="cos"></div>

a zamiast
  1. document.write(img);

uzyj
  1. document.getElementById('cos').innerHTML = img;


standardowy text
Cytat
u mnie działa winksmiley.jpg
cioop
dzieki, dziala! opakowalem skrypt divem z id i pozniej w skrypcie wstawiam do tego diva obrazek poprzez innerHtml.
wujek.staszek
Witam. Pisze strone, ktora sciaga wskazany plik xml i parsuje go do htmla. Idealnie nadaje sie do tego AJAX. Jednak mam ten sam problem, bo sciagane pliki sa z innych serwerow ;] Moze jest mozliwe skonfigurowanie serwera zeby to on sciagal zewnetrzne pliki i odsylal je jako wlasne??
W php jest funkcja file_get_contents(), ktora laduje podany plik do zmiennej i moze ona wczytywac zewnetrzny plik JESLI w php.ini jest ustawiona linia allow_url_fopen On.
Wolalbym jednak trzymac sie AJAXa, poniewaz parsowanie xmla jest w nim wbudowane. Prosze o pomoc, pozdrawiam.
paziek
Nie da się. Było w FF3 przez jakiś czas (podczas bety (alfy?) ) ale wyłączyli.
Może wróci przy FF3.1
Nie wiem jak reszta przeglądarek - zdaje się, że IE8 ma/będzie_miało coś takiego, ale wg ich własnego projektu (jak zwykle).
ALE! Specyfikacja (jeśli tak to można nazwać) od W3C mówi, że aby pobrać dane z obcej domeny za pomocą AJAXa, ta domena (serwer w sumie) musi zezwolić na taką akcję. W tej chwili podobnie jest np. przy flashu. Także, jeśli nie kontrolujesz tych serwerów, a właściciel nie udostępni ich zawartości dla AJAXa z obcych domen, to zapomnij w ogóle o AJAXie i rób to po stronie serwera.

Możesz to zrobić przy pomocy Flasha lub JSON'a - jeśli upierasz się aby było po stronie klienta... tyle, że JSON wymaga aby dane były w innym formacie, niż XML, a Flash wymaga 'pozwolenia' od serwera, aby pobrać dane.


PHP ma wbudowane parsowanie XMLa (klasa DOM oraz kilka innych), a allow_url_fopen możesz obejść za pomocą curl'a.
Do tego nic go nie obchodzą jakieś pozwolenia, formaty itp.
Google! smile.gif
wujek.staszek
Mam przebiegly plan ;] Mozna wyslac zapytanie httpRequest o strone posrednik.php?link=link_do_strony_xml. Posrednik.php wyglada tak
  1. <?php
  2.  $link = $_GET['link'];
  3. ?>

Posrednik.php znajduje sie w tej samej domenie wiec httpRequest z ajaxa bedzie dzialac. Jednak dalej na serwerze musi byc allow_url_fopen On. Jak mozna to obejsc za pomoca curla? W php jestem zupelnie zielony.
paziek
  1. <?php
  2. $url = 'http://www.example.com/file.xml';
  3.  
  4. $curl = curl_init();
  5.  
  6. curl_setopt($curl, CURLOPT_URL, $url);
  7. curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  8. curl_setopt($curl, CURLOPT_HEADER, false);
  9.  
  10. $str = curl_exec($curl);
  11.  
  12. curl_close($curl);
  13.  
  14. var_dump($str);
  15. ?>


To powinno zadziałać
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.