Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: PHP i cURL - co może być nie tak.
Forum PHP.pl > Forum > PHP
Grzesiek23
Potrzebuję napisać skrypt, który będzie się logować do określonej strony.

Strona to: http://www.erepublik.com/en/login smile.gif

Kiedyś napisałem coś takiego w VB, jednak administracja pokombinowała i skrypt nie działa.
W VB brakło mi pomysłów, więc może ktoś w PHP coś pomoże.

Sprawa wygląda tak - wchodząc pierwszy raz na stronę pobierane jest ciastko "erpk". Ciastko to musi zostać wysłane przy logowaniu, a także takie dane jak token (ukryte w formularzu) i oczywiście login i hasło.


Poniżej mój kod:


  1. <?php
  2.  
  3. // This page will set some cookies and we will use them for Posting in Form data.
  4.  
  5. $cookie_file_path = "cookie.txt"; // Please set your Cookie File path
  6.  
  7. $LOGINURL = "http://www.erepublik.com/en/login";
  8. $agent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; pl; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6";
  9. $ch = curl_init();
  10. curl_setopt($ch, CURLOPT_URL,$LOGINURL);
  11. curl_setopt($ch, CURLOPT_USERAGENT, $agent);
  12. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  13. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  14. curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
  15. curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
  16. curl_setopt($ch, CURLOPT_ENCODING, '');
  17. $headers = array('Accept-Language: pl,en-us;q=0.7,en;q=0.3',
  18. 'Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7',
  19. 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
  20. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  21.  
  22. $result = curl_exec ($ch);
  23. curl_close ($ch);
  24.  
  25. // 2- Post Login Data to Page http://signin.ebay.com/aw-cgi/eBayISAPI.dll
  26.  
  27. $LOGINURL = "http://www.erepublik.com/en/login";
  28. $POSTFIELDS = "_token=6ca821b0c2630712028e90060e2b80c9&citizen_name=username&citizen_password=password&commit=Login";
  29.  
  30. $reffer = "http://www.erepublik.com/en";
  31.  
  32. $ch = curl_init();
  33. curl_setopt($ch, CURLOPT_URL,$LOGINURL);
  34. curl_setopt($ch, CURLOPT_USERAGENT, $agent);
  35. curl_setopt($ch, CURLOPT_POST, 1);
  36. curl_setopt($ch, CURLOPT_POSTFIELDS,$POSTFIELDS);
  37. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  38. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  39. curl_setopt($ch, CURLOPT_ENCODING, '');
  40. curl_setopt($ch, CURLOPT_REFERER, $reffer);
  41. curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
  42. curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
  43. $headers2 = array('Accept-Language: pl,en-us;q=0.7,en;q=0.3',
  44. 'Accept-Charset: ISO-8859-2,utf-8;q=0.7,*;q=0.7',
  45. 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
  46. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers2);
  47.  
  48. $result = curl_exec ($ch);
  49. curl_close ($ch);
  50. print $result;
  51.  
  52. $ch = curl_init();
  53.  
  54. ?>



Odpalając go (oczywiście po podstawieniu poprawnego loginu i hasła) otrzymuję komunikat:
"CSRF attack detected".

Doszedłem mniej więcej dlaczego tak się może dziać.

Otóż wchodzimy pierwszy raz na stronę do logowania, następnie usuwam ciastko "erpk" i próbuję się zalogować - wtedy też dostaję taki komunikat.

Wniosek? Ciastka nie są przekazywane w drugim wywołaniu.
Ale dlaczego?

Będzie ktoś mi tutaj w stanie pomóc?
vokiel
Spróbuj zrobić to wszystko na jednym połączeniu (nie rób curl_close, a później znów curl_init)
Grzesiek23
Niestety, ale dalej komunikat CSRF ...

Plik cookie zdaje się być ok:

  1. # Netscape HTTP Cookie File
  2. # <a href="http://curl.haxx.se/rfc/cookie_spec.html" target="_blank">http://curl.haxx.se/rfc/cookie_spec.html</a>
  3. # This file was generated by libcurl! Edit at your own risk.
  4.  
  5. .erepublik.com TRUE / FALSE 0 erpk d86e89fbf05962be4f82d30a681a8bc4
  6. www.erepublik.com FALSE / FALSE 1262010248 lfrc 0


Jednak należy zauważyć, iż plik ten zawiera ciastka tylko z GET.
jaskolek
Mi się wydaje, ze to nie wina ciasteczek tylko tokena. Po coś on tam w końcu jest, prawda? Jak wejdziesz na stronę i go zmienisz, a później spróbujesz się zalogować, to też wywali komunikat CSRF

Spróbuj z pierwszej zmiennej $result pobrać tokena przy pomocy jakiegoś wyrażenia regularnego. Wstaw go później do wysyłanych danych (z tego co widzę to masz wstawioną stałą wartość) i powinno dział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.