środa, 20 maja 2015

[PHP][cURL] Podstawy cz.4 - cookies

TRUE
8097816399849509347
Wysyłanie cookies może odbywać się dwukierunkowo, tj. serwer może w odpowiedzi zażądać utworzenia pliku ciasteczka w przeglądarce, jak i przeglądarka/cURL może wysłać do serwera informacje o ciasteczkach jakie są ustawione dla danej domeny. Ciasteczka oczywiście możemy preparować sami, a odbywa się to za pomocą stworzenia prostego ciągu z nazwami i wartościami naszych ciasteczek, a nastepnie wysłaniu żądania na serwer. Spójrzmy więc jak to wygląda w praktyce.

Przygotowanie ciasteczek - CURLOPT_COOKIE

W najprostrzej możliwej postaci musimy przygotować ciąg o następującej strukturze:

  1. $cookies = "cookie1=".urlencode("wartość1")."; cookie2=".urlencode("wartość2");  // i tak dalej

Wszystkie ciastecznka muszą być rozdzielone średnikiem, a ich wartości potraktowane funkcją urlencode().

Nastepnie taki ciąg ustawiamy jako opcję w cURL-u za pomocą parametru CURLOPT_COOKIE:

  1. curl_setopt($ch, CURLOPT_COOKIE, $cookies);

Całość wysyłamy na serwer.
Nasz kod wyglądać więc będzie tak:

  1. <?php
  2.  
  3. // do tej tablicy odbierzemy nagłówki
  4.  
  5. $return_headers = [];
  6.  
  7. $errors = '';
  8.  
  9.  
  10.  
  11. // funkcja odbierająca nagłówki
  12.  
  13. function headerLine($curl, $header_line ) {
  14.  
  15.     $GLOBALS['return_headers'][] = $header_line;
  16.  
  17.     return strlen($header_line);
  18.  
  19. }
  20.  
  21.  
  22.  
  23. // url do server.php
  24.  
  25. $url_to_server = 'http://localhost/server.php';
  26.  
  27.  
  28.  
  29. // inicjujemy sesję połączenia
  30.  
  31. $ch = curl_init($url_to_server);
  32.  
  33.  
  34.  
  35. // definiujemy cookies
  36.  
  37. $cookies = "cookie1=".urlencode("this_is_cookie1").";cookie2=".urlencode("this_is_cookie2");
  38.  
  39.  
  40.  
  41. // dodajemy cookies do żądania:
  42.  
  43. curl_setopt($ch, CURLOPT_COOKIE, $cookies);
  44.  
  45.  
  46.  
  47. // ustawiamy opcje
  48.  
  49. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // chcemy odebrać dane
  50.  
  51. curl_setopt($ch, CURLOPT_USERAGENT, 'fake browser'); // ustawiamy user-agenta
  52.  
  53. curl_setopt($ch, CURLOPT_REFERER, 'http://www.google.com'); // ustawiamy referera
  54.  
  55. curl_setopt($ch, CURLOPT_HEADERFUNCTION, "headerLine"); // ustawiamy własną funkcję do przetworzenia nagłówka
  56.  
  57.  
  58.  
  59.  
  60.  
  61. // wykonujemy połączenie
  62.  
  63. $response_body = curl_exec($ch);
  64.  
  65.  
  66.  
  67. // pobieramy błąd, jeśli wystąpi
  68.  
  69. if (curl_errno($ch))  $errors.= '<h2>Error #' . curl_errno($ch) . ': ' . curl_error($ch).'</h2>';
  70.  
  71.  
  72.  
  73. // zamykamy sesję połączenia
  74.  
  75. curl_close($ch);
  76.  
  77. ?>


Wysłane ciasteczka pojawią się po stronie serwera w tablicy $_COOKIE:



Ciasteczka wysyłane przez serwer

A jak sprawa wygląda w drugą stronę, gdy to serwer wysyła do nas żądanie ze stworzeniem ciasteczka? Zobaczymy to w nagłówku otrzymanym od serwera:


Jak widać dostaliśmy nagłówek Set-Cookie, który wysyła do nas ciasteczko sesyjne o nazwie PHPSESSID i wartości w tym przypadku 04bc39avas8hvkks9458b8toe7. Analogicznie przesyłane są do nas wszystkie inne ciasteczka, informujące o zalogowaniu i inne, ustawiane w PHP za pomocą funkcji setcookie().

Aby to przeanalizować, dodajmy na początku pliku server.php następujący kod:

  1. <?php
  2.  
  3. setcookie('cookie_from_server', 'test123');

i sprawdźmy co się stało w clients.php - jak widać otrzymaliśmy od serwera nagłówek z nowym ciasteczkiem:


Ustawianie flagi HttpOnly

Domyślnie przesyłane przez PHP ciasteczko nie ma ustawionej opcji HttpOnly, a więc może zostać odczytane przez Javascript. Aby wymusić na przeglądarce ustawienie takiej opcji, musimy ustawić cookie poprzez:

  1. <?php
  2.  
  3. setcookie('cookie_from_server', 'test123', 0, '/', 'localhost', false, true);

gdzie składnia wygląda następująco:

  1. setcookie(nazwa_cookie, wartość_cookie, czas_ważności, domena, https, httponly)



Ciasteczko z pliku

Cookies można też zapisać w pliku i wysłać je prosto z pliku.
Służy do tego opcja:

  1. curl_setopt($ch, CURLOPT_COOKIEFILE, '/ścieżka/absolutna/do/pliku');

Uwaga: ścieżka MUSI być absolutna, nie możemy tutaj podać:

  1. cookies.txt

Musimy podać, np.:

  1. C:/WWW/test/cookies.txt

lub wykorzystać:

  1. realpath('cookies.txt')


Nasz plik cookies.txt może wyglądać następująco:

  1. localhost   TRUE    /   FALSE   0   cookie_from_file1    cookie_value1
  2.  
  3. localhost   TRUE    /   FALSE   0   cookie_from_file2    cookie_value3
  4.  


Składnia wygląda następująco:

  1. domena   dostęp_dla_poddomen   ścieżka   czas_wygaśnięcia   nazwa_cookie   wartość_cookie

Pola oddzielamy tabulatorem, nie spacją, a każde ciasteczko to oddzielna linijka.
Gdy domenę ustawimy z kropką na początku:

  1. .localhost

i podamy TRUE w dostępie do poddomen, to ciastko będzie dostępne również dla subdomen, jak np. test.localhost, www.localhost, test2.localhost itd.

Przykład użycia:

  1. <?php
  2.  
  3. $return_headers = [];
  4.  
  5.  
  6.  
  7. function headerLine($curl, $header_line ) {
  8.  
  9.     $GLOBALS['return_headers'][] = $header_line;
  10.  
  11.     return strlen($header_line);
  12.  
  13. }
  14.  
  15. $url_to_server = 'http://localhost/server.php';
  16.  
  17. $ch = curl_init($url_to_server);
  18.  
  19. $cookie_file = 'cookies.txt';
  20.  
  21.  
  22.  
  23. curl_setopt($ch, CURLOPT_COOKIEFILE, realpath($cookie_file)); // cookie z pliku
  24.  
  25. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // chcemy odebrać dane
  26.  
  27. curl_setopt($ch, CURLOPT_HEADERFUNCTION, "headerLine"); // ustawiamy własną funkcję do przetworzenia nagłówka
  28.  
  29. $response_body = curl_exec($ch);
  30.  
  31. curl_close($ch);
  32.  
  33. ?>


Wynik:


Zapisywanie odebranych ciasteczek

Odebrane od serwera cookies cURL może zapisać do określonego przez nas pliku.
Służy do tego opcja:

  1. curl_setopt($ch, CURLOPT_COOKIEJAR, '/absolutna/ścieżka/do/pliku');

Dzięki tej opcji wszystkie odebrane od serwera ciasteczka, po wykonaniu funkcji curl_close()  zapisane zostaną do pliku, który podaliśmy jako parametr.
Uwaga: ścieżka ponownie MUSI być absolutna, nie możemy tutaj podać:

  1. returned_cookies.txt

Musimy podać, np.:

  1. C:/WWW/test/returned_cookies.txt

lub wykorzystać:

  1. realpath('returned_cookies.txt')


Przykład użycia:

  1. <?php
  2.  
  3. $return_headers = [];
  4.  
  5.  
  6.  
  7. function headerLine($curl, $header_line ) {
  8.  
  9.     $GLOBALS['return_headers'][] = $header_line;
  10.  
  11.     return strlen($header_line);
  12.  
  13. }
  14.  
  15. $url_to_server = 'http://localhost/server.php';
  16.  
  17. $ch = curl_init($url_to_server);
  18.  
  19. $cookie_file = 'returned_cookies.txt';
  20.  
  21.  
  22.  
  23. curl_setopt($ch, CURLOPT_COOKIEJAR, realpath($cookie_file)); // cookie do pliku
  24.  
  25. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // chcemy odebrać dane
  26.  
  27. curl_setopt($ch, CURLOPT_HEADERFUNCTION, "headerLine"); // ustawiamy własną funkcję do przetworzenia nagłówka
  28.  
  29. $response_body = curl_exec($ch);
  30.  
  31. curl_close($ch);
  32.  
  33. ?>


W naszym przypadku, plik returned_cookies.txt uzyska taką treść:

  1. # Netscape HTTP Cookie File
  2.  
  3. # http://curl.haxx.se/docs/http-cookies.html
  4.  
  5. # This file was generated by libcurl! Edit at your own risk.
  6.  
  7.  
  8.  
  9. #HttpOnly_.localhost TRUE / FALSE 0 cookie_from_server test123
  10.  
  11. test5.localhost FALSE / FALSE 0 PHPSESSID 04h6239oieslvfhqajtdls7nf0



Oficjalny, pełny manual biblioteki cURL znajduje się tutaj: http://php.net/manual/en/book.curl.php

Brak komentarzy:

Prześlij komentarz

Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)

webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji