Certyfikat ZendPHP

Funkcje Sieciowe

PHP to język stworzony dla Internetu. Jego pierwotnym celem było ułatwienie tworzenia stron internetowych i nadal mocno koncentruje się na skryptach po stronie serwera. Ta część przygląda się niektórym funkcjom językowym, które czynią go jednym z najpopularniejszych na świecie językiem programowania WWW po stronie serwera

Typy zapytań

HTTP ma kilka różnych metod żądania, które są powszechnie nazywane czasownikami HTTP. Specyfikacja HTTP szczegółowo określa przeznaczenie każdego czasownika. Twoja aplikacja powinna być zgodna z tą specyfikacją, aby była kompatybilna z używanymi przez klientów.

Czasownik : Użycie

GET : Pobierz reprezentację określonego zasobu
HEAD : Identyczny jak GET, ale bez odpowiedzi
POST : Prześlij wpis na serwer, często powodując zmianę, np. dodawanie nowy zasób
PUT : Zastąp określony zasób zasobem w żądaniu
PATCH : Zastosuj częściową modyfikację do określonego zasobu
DELETE : Usuń określony zasób
CONNECT : Zainicjuj tunel HTTP3
OPTION : Opisz opcje komunikacji dla zasobu docelowego
TRACE : Wykonuje test pętli zwrotnej wiadomości do zasobu docelowego

Poproś o dane

W typowym produkcyjnym środowisku internetowym PHP akceptuje żądania przekazywane do niego przez serwer WWW. Uruchamia i przetwarza żądanie przed zakończeniem i oczekiwaniem na następne żądanie. Serwer WWW może przekazywać dane wraz z żądaniem, które stanowią część kontekstu4, w którym działa PHP. Żądanie HTTP składa się z trzech części: adresu URL, nagłówków i treści. Dane mogą być zawarte w dowolnej z tych części żądania i zostaną udostępnione Twojej aplikacji PHP w następujący sposób:

Źródło : Przekazane : Dostępne

GET : Parametry w adresie URL żądania : $ _GET
POST : Treść żądania : $ _POST
PUT : Treść żądania : Odczyt z php: // input
PATCH : Treść żądania : Odczyt php: // input
Cookie : Nagłówek "cookie" : $ _COOKIE
Przesłany plik : Treść żądania : $ _FILES

Jeśli PHP przetwarza żądanie z wiersza poleceń, to $ _SERVER ['argv'] zawiera tablicę przekazanych argumentów, a $ _SERVER ['argc'] zawiera liczbę przesłanych argumentów. Oprócz danych zawartych w żądaniu HTTP PHP może akceptować dane ze środowiska, w którym działa. Na przykład można uruchomić PHP w kontenerze dokowanym i ustawić zmienną środowiskową, która zawiera adres serwera bazy danych. Możesz odwoływać się do tego w skrypcie PHP za pomocą superglobalu $ _ENV.

Żadanie Superglobal

Superglobal $ _REQUEST jest tablicą asocjacyjną, która domyślnie zawiera zawartość $ _GET, $ _POST i $ _COOKIE. Ustawienie php.ini zmienne_order określa, które z ENV, GET, POST i Zmienne COOKIE są obecne w tablicy $ _REQUEST, a także w kolejności. Jeśli ta sama zmienna występuje w wielu typach żądań, przyjmie wartość ostatniego w sekwencji tej wartości ustawień. Wyobraź sobie na przykład, że konfiguracja jest ustawiona na EGPCS, co wskazuje, że POST następuje po GET. Następnie, jeśli zarówno $ _GET ['akcja'], jak i $ _POST ['akcja'] są ustawione, wtedy $ _REQUEST ['akcja'] będzie zawierać wartość $ _POST ['akcja']. Ponieważ nie masz pewności, skąd pochodzą dane w $ _REQUEST, powinieneś ostrożnie korzystać z tej tablicy. Wprowadzenie niepewności do kodu komplikuje testowanie i może mieć wpływ na bezpieczeństwo.

POST

Zgodnie z konwencją żądania POST są wykorzystywane do wysyłania danych do strony internetowej i instruowania jej, aby utworzyła nowy podmiot. Jest to operacja zapisu w paradygmacie CRUD.

Odbieranie danych POST

Zmienne wysłane w żądaniu POST są zawarte w treści. Porównaj to z żądaniami GET, które przekazują zmienne w adresie URL. Jeśli użytkownik prześle formularz, przeglądarka zakoduje wartości w treści żądania i prześle je do Ciebie. Podobnie aplikacja POSTing do punktu końcowego interfejsu API będzie musiała zakodować zmienne w treści żądania. PHP udostępni je w zmiennej $ _POST. Na przykład tutaj jest przykład testu POST na stronie internetowej, która wysyła Ronalda jako wartość zmiennej name. Ta prośba zostanie wykorzystana do dodania osoby o imieniu Ron do fanklubu.

POST HTTP / 1.1
Host: bieberfanclub.com
Content-Type: application / x-www-form-urlencoded
Cache-control : no-cache
name= Ronald

Gdyby aplikacja działająca na bieberfanclub.com korzystała z PHP, tablica $ _POST byłaby tablicą zawierającą element o nazwie name o wartości Ronald. Wysyłanie zmiennych za pomocą POST ma trzy zalety:

o Dane POST można zakodować w określonym zestawie znaków, co nie ma miejsca w przypadku GET. o Ponieważ Twoje zmienne są wysyłane w treści wiadomości, nie masz ograniczeń co do ilości danych, które możesz wysłać według długości adresu URL. o POST pozwala na przesyłanie plików, ale GET nie. Nie ma różnicy w bezpieczeństwie między tymi dwiema metodami. W protokole HTTP nie ma ograniczenia długości adresu URL, ale istnieją ograniczenia dotyczące przeglądarek i innych klientów. Zasadniczo nie należy tworzyć adresów URL dłuższych niż 2000 znaków.

Wysyłanie danych POST

Jeśli chcesz wysłać żądanie POST do innej aplikacji, musisz wziąć odpowiedzialność za kodowanie zmiennych w treści. Najprostszym sposobem na to jest rozszerzenie curl. 7 Curl obsługuje kilka protokołów i ułatwia skonfigurowanie żądania dokładnie tak, jak chcesz. Korzystanie z curl obejmuje następujący proces:

1. Zainicjuj sesję curl.
2. Ustaw opcje dla sesji.
3. Wykonaj sesję (wykonaj połączenie).
4. Zamknij sesję i zwolnij zasób.

Zobaczmy, jak możesz użyć curl, aby skonfigurować żądanie, które oglądałeś wcześniej, w którym zamieściłeś nazwę zmiennej zawierającej wartość Ronalda w fanklubie Bieber.

< ?php
// Podajemy adres URL podczas inicjowania zasobu curl
$curlResource = curl_init ("https://requestb.in/13fkcqj1");
// Ta tablica zawiera zmienne, które chcemy POST
$postData = ['name' => 'Ron'];
// Powiedz curl, aby wykonał POST aplikacji / x-www-form-urlencoded
curl_setopt ($curlResource, CURLOPT_POST, true);
// Podajemy wartości do POST
curl_setopt ($curlResource, CURLOPT_POSTFIELDS, $postData);
// Wykonaj żądanie i zapisz odpowiedź
$response = curl_exec ($curlResource);
// Jeśli wystąpi błąd, zostanie zapisany w $err
$err = curl_error ($curlResource);
// Zamknij uchwyt

curl_close ($curlResource);

Wskazówka: Można przekazać curl_setopt() tablicę wszystkich opcji, które chcesz ustawić, zamiast wywoływać ją wiele razy.

GET

Żądania GET są zwykle używane do uzyskania pojedynczej encji lub kolekcji encji z serwera. Możesz to traktować jako odczyt danych z serwera.

Odbieranie danych GET

Zmienne wysyłane w żądaniu GET są kodowane w adresie URL. Oto przykład, w jaki sposób zmienne są kodowane w adresie URL:

http://bieberfanclub.com/topfan.php?name=Ron&rank=cheerleader

Zmienne zaczynają się od znaku zapytania i są ograniczone znakami ampersand. Każda zmienna jest parą klucz-wartość ze znakiem równości oznaczającym wartość. PHP automatycznie udostępni zmienne przekazywane w adresie URL w superglobalu $ _GET. Możliwe jest przekazywanie tablic przez GET przy użyciu następującej składni:

http://example.com/users.php?sort[col]=name&sort[order]=desc

Będziesz mógł uzyskać dostęp do tych zmiennych w następujący sposób:

< ?php
echo $ _GET ['sort'] ['col'];
echo $ _GET ['sort'] ['order'];

Wysyłanie danych GET

PHP zawiera funkcję, która bardzo ułatwia budowanie ciągu adresu URL do przekazywania danych GET.

< ?php
$getData = ['fans' => ['Ron', 'Jonathan', 'Anne Frank']];
// fani% 5B0% 5D = Ron i fani% 5B1% 5D = Jonathan i fani% 5B2% 5D = Anne + Frank
echo http_build_query ($ getData);

Funkcja http_build_query() konwertuje tablicę na poprawnie zakodowany ciąg zapytania. Specyfikacja HTTP adresu URL pozwala na użycie bardzo ograniczonego zestawu znaków. Każdy znak, którego nie ma w tym zestawie, musi zostać zakodowany. 8 PHP udostępnia funkcję urlencode(), która poprawnie zakoduje ciąg znaków, który będzie używany jako część adresu URL. Funkcja urldecode() konwertuje zakodowany ciąg znaków z powrotem do jego oryginalnej reprezentacji.

< ?php
$getData = ['fans' => ['Ron', 'Jonathan', 'Anne Frank']];
// fani% 5B0% 5D = Ron i fani% 5B1% 5D = Jonathan i fani% 5B2% 5D = Anne + Frank
$encodedString = http_build_query ($getData);
// fans [0] = Ron & fans [1] = Jonathan & fans [2] = Anne Frank
echo urldecode ($ encodedString);

W tym przykładzie dekodujemy poprawnie zakodowany ciąg znaków URL wygenerowany przez http_build_query(), abyśmy mogli zobaczyć, jak tablica jest zakodowana w parametrze.

PUT

Żądania PUT służą do zastąpienia całego obiektu lub kolekcji. Zazwyczaj żądanie PUT wymaga określenia wszystkich obowiązkowych atrybutów encji. Jest to operacja zapisu, ponieważ zastępuje encję stanem, który podajesz. Żądania PATCH są podobne, ponieważ służą do zastępowania danych, ale żądanie PATCH zastąpi tylko część podanego elementu. Na przykład, jeśli użytkownik ma imię, nazwisko i pole e-mail, będziesz mógł użyć żądania PATCH, aby zmienić tylko jedno z tych pól, pozostawiając te same. Serwery API często nie implementują PATCH i raczej wymagają użycia PUT.

Odbieranie danych PUT

PHP nie udostępnia superglobali dla PUT. Aby uzyskać do niego dostęp, musisz przeczytać strumień php: // input. Możesz użyć funkcji parse_str(), aby przekonwertować ją na tablicę:

< ?php
$putVariables = [];
parse_str(file_get_contents ("php: // input"), $ putVariables);

Wysyłanie danych PUT

Dane PUT są przesyłane dokładnie tak, jak w przypadku POST, więc curl jest najprostszym sposobem na przesłanie ich w PHP.

< ?php
$data = ["fan" ⇒ "Ron"];
$curlResource = curl_init ();
$ options = [
CURLOPT_URL ⇒ "https://requestb.in/oxk2utox",
CURLOPT_CUSTOMREQUEST ⇒ "PUT",
CURLOPT_POSTFIELDS ⇒ $data
];
curl_setopt_array ($curlResource, $options);
$response = curl_exec ($ curlResource);

W poprzednim przykładzie mówimy curlowi, aby złożył żądanie PUT i określamy wartości, które mają zostać przekazane dokładnie tak, jak w przypadku testu POST. Zauważ, że używamy funkcji curl_setopt_array() do ustawiania wielu opcji curl naraz zamiast wielokrotnego wywoływania curl_setopt().

Sesje

HTTP jest protokołem bezstanowym, co oznacza, że połączenie między klientem a serwerem zostaje utracone po zakończeniu transakcji. Ponadto PHP kończy działanie po zakończeniu przetwarzania żądania i utracie stanu aplikacji. Sesja pozwala serwerowi zachować stan aplikacji dla kolejnych żądań od gościa. Informacje takie jak zalogowany użytkownik mogą być przechowywane w sesji. Innym przykładem zastosowania sesji jest witryna zakupów online, w której zawartość koszyka na zakupy użytkownika może być przechowywana w sesji. Informacje o sesji są przechowywane na serwerze i są powiązane z unikalnym identyfikatorem. Klient prześle identyfikator sesji do serwera przy każdym żądaniu, co pozwala serwerowi powiązać żądanie z określoną sesją. Jeśli masz wiele serwerów internetowych, musisz znaleźć sposób na udostępnienie między nimi informacji o sesji lub upewnienie się, że odwiedzający jest zawsze kierowany na serwer, który przechowuje jej informacje o sesji. Witryny internetowe, które nie muszą pamiętać, kim jest użytkownik ani zachować preferencji, nie muszą korzystać z sesji. Przykładem takiej witryny może być ta, która udostępnia statyczne treści, które są takie same dla wszystkich odwiedzających. PHP domyślnie obsługuje sesje, ale można je wyłączyć poprzez ustawienie konfiguracji w php.ini.

Rozpoczęcie sesji

Sesja w PHP jest uruchamiana po wywołaniu funkcji session_start () lub automatycznie, jeśli konfiguracja php.ini określa session.auto_start = 1. Jeśli używasz session_start (), musisz upewnić się, że wywołujesz tę funkcję przed jakimkolwiek wyjściem jest wysyłany do klienta. Gdy sesja się rozpoczyna, użytkownik otrzymuje losowy unikalny identyfikator sesji o nazwie id sesji. Identyfikator sesji jest przechowywany w pliku cookie na kliencie lub przekazywany przez adres URL, jeśli włączysz ustawienie konfiguracji session.use_trans_sid. Akceptowanie sesji z adresu URL może być ryzykowne i lepiej jest skonfigurować PHP tak, aby korzystał z plików cookie tylko z ustawieniem session.use_only_cookies.

Identyfikator sesji i zmienne sesji

Rozszerzenie sesji udostępnia predefiniowaną stałą SID, która przechowuje identyfikator sesji. Możesz także użyć funkcji session_id(), aby ją uzyskać lub ustawić. Możesz użyć funkcji session_regenerate_id(), aby utworzyć nowy identyfikator sesji dla klienta. Powinieneś to wywołać natychmiast po wywołaniu session_start(), aby pomóc chronić przed utrwaleniem sesji. Po rozpoczęciu sesji superglobalna $ _SESSION jest dostępna jako tablica asocjacyjna zawierająca zmienne sesji.

Kończenie sesji

Aby poprawnie zakończyć sesję, powinieneś zrobić trzy rzeczy:

1. Ustaw tablicę $ _SESSION na pustą tablicę.
2. Ustaw czas wygaśnięcia cookie sesyjnego na przeszłość.
3. Wywołaj funkcję session_destroy().
Efektem kroku 2 jest powiadomienie przeglądarki klienta, że może usunąć plik cookie zawierający identyfikator sesji. Nie ma jednak gwarancji, że klient to zrobi. Oczywiście, jeśli nie używasz sesji opartych na plikach cookie, nie musisz tego robić.

Obsługa sesji

PHP obsługuje tworzenie własnego modułu obsługi sesji, ale domyślnie sesje PHP są przechowywane na dysku i używają poleceń serialize() i unserialize() do kodowania i dekodowania danych. Oprócz sesji dyskowych PHP dostarcza także moduł obsługi sesji memcached, który można skonfigurować w php.ini. Jeśli chcesz napisać własny moduł obsługi sesji, powinieneś zaimplementować interfejs SessionHandler. Umożliwi to korzystanie z alternatywnych sposobów przechowywania sesji oraz dostosowanie sposobu kodowania i dekodowania danych sesji.

Przesyłanie plików

W tej sekcji skupimy się na sposobie przesyłania plików i związanej z nimi składni PHP. Upewnij się, że zapoznałeś się z sekcją dotyczącą przesyłania plików w części 6 w połączeniu z tą sekcją. Formularze pozwalają na przesyłanie plików za pomocą "wieloczęściowej" opcji ransaction HTTP POST. Możesz określić, że chcesz zakodować swój POST przy użyciu wieloczęściowych danych formularza w kodzie HTML, deklarując formularz podobny do tego:

< form enctype = "multipart / form-data" action = "" method = "post" >

Zauważ, że pozostawiłem pusty atrybut "action". Domyślnie formularz HTML prześle do identyfikatora URI, z którego jest obsługiwany.

Ograniczanie rozmiaru przesyłanych plików

Nie chcesz, aby ludzie mogli przesyłać ogromne pliki, które zapełniają Twój dysk. Aby zarządzać rozmiarem plików, które ludzie mogą przesyłać, możesz ograniczyć rozmiar w przeglądarce i na serwerze. Aby powiedzieć klientowi, aby ograniczył rozmiar przesyłanego pliku, możesz dodać dane wejściowe do formularza w następujący sposób:

< input type = "hidden" name = "MAX_FILE_SIZE" wartość = "1000000" / >

Ograniczenie rozmiaru w przeglądarce powinno odbywać się tylko w celu poprawy komfortu użytkowania. Użytkownik może bardzo łatwo wyłączyć lub zmienić limit, aby ominąć limit. Powinieneś raczej skonfigurować PHP, aby ograniczyć rozmiar operacji POST. Ustawienie post_max_size ogranicza maksymalną ilość danych, jakie może zawierać dowolny test POST. Rozmiar upload_max_filesize jest stosowany w celu ograniczenia rozmiaru plików, które można przesłać.

Pliki tymczasowe

PHP przechowuje przesłany plik w tymczasowej lokalizacji i udostępnia go skryptowi, do którego skierowany był formularz POST. Możesz przetworzyć plik w tymczasowej lokalizacji, a następnie opcjonalnie przenieść go do stałej lokalizacji. PHP automatycznie usunie plik tymczasowy po zakończeniu działania skryptu, więc jeśli chcesz go zachować, musisz go przenieść. Oprócz utworzenia pliku tymczasowego PHP zapełni tablicę superglobalną $ _FILES. Każdy plik przesłany w formularzu będzie miał wpis w tablicy. Musisz być świadomy, że informacje w tablicy $ _FILES można dość łatwo sfałszować, więc powinieneś ręcznie sprawdzić poprawność każdej informacji. Każdy plik jest reprezentowany przez tablicę w superglobale $ _FILES i będzie kluczowa do nazwa, typ, rozmiar, tymczasowa nazwa pliku i kod błędu.

Klucz : Opis

name : Oryginalna nazwa pliku przechowywanego na kliencie
type : Typ MIME podany przez klienta
size : Rozmiar w bajtach pliku
tmp_name : Nazwa pliku w jego tymczasowej lokalizacji
error : Kod błędu lub UPLOAD_ERR_OK, jeśli przesyłanie się powiodło

Formularze

Formularze umożliwiają użytkownikom przesyłanie danych do skryptu PHP. Deklarując formularz w HTML, określasz metodę, za pomocą której wysyła informacje do serwera. Chociaż możesz wybrać opcję GET lub POST, upewnij się, że wybrałeś metodę żądania pasującą do tego, co zamierzasz zrobić. PHP automatycznie udostępnia dane formularza Twojemu skryptowi w jednym z dwóch superglobali - $ _ GET lub $ _POST - w zależności od metody użytej w formularzu.

Elementy formularza

Te superglobale mogą być łatwo edytowane przez klienta, dlatego zawsze należy je dokładnie filtrować i nie ufać. Kropki i spacje w nazwach pól formularza są konwertowane na podkreślenia. Jako przykład rozważ tag wejściowy HTML:

< input name = "email.address" type = "text">

Zawarta w nim wartość zostanie umieszczona w $ _GET ['adres_e-mail'] lub $ _POST ['adres_e-mail'] w zależności od metody formularzy.

Tablice w formularzach HTML

Dane formularza można przekształcić w tablicę przy użyciu takiej składni w HTML:

< form action = "formhandler.php" method = "POST" >
< input type = "text" name = "name [first]" >
< input type = "text" name = "name [last]" >
< input type = "Submit" >
< /form >
Spowoduje to, że $ _POST lub $ _GET będzie tablicą, która wygląda następująco:

array(
"name" ⇒ array (
"first" ⇒",
"last" ⇒ "
)
)

Jednym z najbardziej przydatnych sposobów pomocy tablic jest grupowanie danych wejściowych. Rozważ pole wyboru, które może mieć wiele wartości:

< h1 > Jakie zwierzęta chcesz w domu? < /h1 >
< form action = "formhandler.php" method = "POST" >
< input type = "checkbox" name = "Pets []" value = "cats" id = "Lotzats" >
< label for = "Lotzacats"> Dużo kotów < /label >
< input type = "checkbox" name = "Pets []" value = "dog" id = "adog" >
< label for = "adog" > Tylko pies < /label >
< input type = "Submit" >
< /form >

Jeśli dana osoba zaznaczyła oba pola przed przesłaniem formularza, wówczas $ _GET lub $ _POST będzie zawierać:
array(
"pets" => tablica ("koty", "pies")
)

To sprawia, że pola wyboru są o wiele ładniejsze i łatwiejsze w użyciu. Możesz przeczytać więcej na ten temat w podręczniku PHP.

Ciasteczka

Pliki cookie umożliwiają przechowywanie niewielkiej (4-6 KB) ilości danych na urządzeniu klienckim. Klient je przeczyta i prześle wraz z każdym żądaniem. Możesz przechowywać dowolne informacje w pliku cookie, ale najczęściej są one związane z sesjami. PHP może przechowywać swój identyfikator sesji w pliku cookie. Informacje o sesji są przechowywane na serwerze i dopasowane do klienta poprzez identyfikator w pliku cookie. PHP robi to za Ciebie, gdy zaczynasz sesję. Domyślnie pliki cookie sesji PHP są ważne do momentu zamknięcia przeglądarki. Nie możesz kontrolować plików cookie na urządzeniu klienckim. Mogą być edytowane lub usuwane przez klienta w dowolnym momencie. Oznacza to, że nie należy ufać przesyłanym z nimi informacjom ani polegać na ich istnieniu. Nie należy również przechowywać poufnych informacji w plikach cookie. Jeśli chcesz usunąć plik cookie, możesz ustawić datę wygaśnięcia, która jest w przeszłości. Poinformuj klienta, że plik cookie nie jest już potrzebny i można go usunąć. Nie masz gwarancji, że klient to uszanuje. Serwer ustawi plik cookie za pomocą nagłówka odpowiedzi Set-Cookie. Klient uwzględni to w przyszłych żądaniach za pomocą nagłówka żądania Cookie.

Ustawianie plików cookie

Funkcja setcookie () służy do ustawienia pliku cookie. Parametry są wyjaśnione w podręczniku PHP i podane w kolejności w tabeli:

Parametr : Używany dla

value : Przechowywanie wartości skalarnej w pliku cookie.
expire : znacznik czasu epoki uniksowej po wygaśnięciu pliku cookie. Nie możesz polegać na plik cookie istnieje do momentu jego wygaśnięcia, ponieważ ludzie często je usuwają ciasteczka.
path : Ścieżka podstawowa w domenie, w której będzie dostępny plik cookie. Jeśli ustawisz na /, wtedy będzie dostępny na wszystkich ścieżkach; w przeciwnym razie będzie dostępne na ścieżce i wszystkich podścieżkach z niej.
domain : Plik cookie będzie dostępny w tej i wszystkich subdomenach pod nim. Możesz ustawić tylko plik cookie pasujący do domeny, w której znajduje się plik cookie
secure : Informuje klienta, że powinien wysłać plik cookie tylko wtedy, gdy jest on wysyłany za pośrednictwem szyfrowanego połączenia HTTPS.
httponly : Informuje klienta, że powinien wysłać plik cookie tylko za pomocą protokołu HTTP, a nie udostępniać go w językach skryptowych, takich jak JavaScript. W ograniczonym stopniu może to pomóc ograniczyć ataki XSS i utrwalanie sesji na klientów, którzy go obsługują.

Pliki cookie mogą przechowywać tylko wartości skalarne. Możesz jednak użyć składni jak w poniższym przykładzie:

< ?php
setcookie("user[name]", "Alice");
setcookie("user[email]", "alice@example.com");

Następnym razem, gdy osoba wyśle żądanie do witryny, zmienna $ _COOKIE będzie zawierać coś takiego:

Array
(
[PHPSESSID] => jlm5od9ngqi3krmu6fkjcebcb4
[user] ⇒ Array
(
[name] ⇒ Alice
[email] ⇒ alice@example.com
)
)

Zauważ, że użytkownik jest tablicą, a wartość cookie zawiera także identyfikator sesji PHP

Pobieranie plików cookie

Możesz uzyskać dostęp do informacji o plikach cookie za pomocą superglobala $ _COOKIE. Pamiętaj, że ta tablica jest zapełniona informacjami z pliku cookie przesłanego przez klienta. Oznacza to, że jeśli użyjesz setcookie () do utworzenia lub zmiany pliku cookie, tablica $ _COOKIE będzie zawierać nowe informacje tylko wtedy, gdy klient wysyła nowe żądanie.

Nagłówki http

Nagłówki HTTP są wysyłane z żądaniem od klienta i odpowiedzią z serwera. Służą do przekazywania informacji o wiadomości HTTP, takich jak rodzaj dostarczanych informacji i co zostanie w zamian zaakceptowane. Nagłówki HTTP mają postać pary nazwa-wartość w postaci czystego ciągu tekstowego. Znaki carriage return i line feed następują po każdym nagłówku. Standard nie ma limitu, ale większość serwerów i klientów nakłada ograniczenia na długość nagłówka i całkowitą liczbę nagłówków, które można wysłać w jednym żądaniu / odpowiedzi. PHP automatycznie wyśle dla Ciebie prawidłowe nagłówki, ale istnieje kilka przypadków, w których możesz chcieć wysłać własny nagłówek.

Wysyłanie nagłówków

Funkcja PHP nagłówek () pozwala wysłać nagłówek do klienta. Możesz wysyłać nagłówki tylko przed wysłaniem normalnej zawartości do klienta. Jednym z powodów, dla których często pomija się tag zamykający?> W dołączonych plikach PHP, jest uniknięcie pojawienia się znaku nowej linii po tagu. Ten znak zostanie wysłany jako treść HTML i będzie uniemożliwiają wysyłanie nagłówków. Parametry wysyłane do header() są następujące:

Parametru : Opis

Nagłówek ciągu : Ciąg zawierający nagłówek do ustawienia. Na przykład, "Kontrola pamięci podręcznej: bez pamięci podręcznej, należy ponownie zweryfikować".
Replace : Wartość logiczna, aby wskazać, czy ten nagłówek musi zastąpić poprzednio wysłany nagłówek o tej samej nazwie.
Respose code : Kod odpowiedzi HTTP, który należy wysłać z nagłówkiem.

Istnieją dwa specjalne przypadki dla nagłówków. Pierwszy dotyczy nagłówków rozpoczynających się ciągiem "HTTP /". Można ich użyć do jawnego ustawienia kodu odpowiedzi HTTP, jak w tym przykładzie z podręcznika PHP


Drugi przypadek specjalny dotyczy użycia nagłówka "Lokcation". Ten nagłówek wskazuje klientowi, że szukany dokument znajduje się w określonej lokalizacji.

Uwaga : PHP automatycznie ustawi kod stanu HTTP 302, jeśli użyjesz tego nagłówka, chyba że ustawiłeś już heade 2xx lub 3xx

Oto przykład:

< ?php
header ("Location: http://www.example.com/");
exit;

W tym przykładzie serwer odpowie kodem stanu 302, a klient zostanie przekierowany do przykładowej domeny. Zwróć uwagę na użycie konstrukcji języka wyjściowego po wysłaniu nagłówka przekierowania. Twój kod nadal działa po wysłaniu nagłówka, chyba że go zatrzymasz. Klient musi przestrzegać nagłówka przekierowania. Jeśli zdecydują się go nie szanować, Twój kod będzie nadal generował dane wyjściowe i zobaczą, co wygeneruje. Upewnij się, że wyraźnie zakończyłeś swój program po wysłaniu nagłówka przekierowania.

Śledzenie nagłówków

Funkcja headers_list() zwróci tablicę nagłówków, które są gotowe do wysłania lub zostały już wysłane do klienta. Możesz ustalić, czy nagłówki zostały wysłane, wywołując headers_sent(). Jeśli chcesz zapobiec wysyłaniu określonego nagłówka, możesz użyć funkcji headers_remove(), aby odznaczyć nagłówek z listy, która ma zostać wysłana.

Uwierzytelnianie http

PHP może wysłać nagłówek do klienta, który powoduje wyświetlenie okna dialogowego Wymagane uwierzytelnienie. Gdy użytkownik wypełni okno dialogowe z użytkownikiem i hasłem, adres URL skryptu PHP zostanie ponownie wywołany. Przy drugim wywołaniu PHP będzie mieć trzy predefiniowane zmienne dostępne w tablicy $ _SERVER. Są to PHP_AUTH_USER, PHP_AUTH_PW i AUTH_TYPE i są ustawione odpowiednio na nazwę użytkownika, hasło i typ uwierzytelnienia. Następnie należy uwierzytelnić użytkownika przy użyciu dowolnej metody, jaką uznasz za stosowną, na przykład poprzez sprawdzenie użytkownika i hasła w bazie danych. Przykłady uwierzytelniania HTTP podano na stronie podręcznika PHP:

< ?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
echo "< p >Hello {$_SERVER['PHP_AUTH_USER']}.< /p >";
echo "< p >You entered {$_SERVER['PHP_AUTH_PW']} as your password.< /p >";
}

W tym przykładzie po prostu wypisujemy zawartość zmiennych w tablicy $_SERVER, ale w rzeczywistości wykonalibyśmy jakąś formę uwierzytelnienia. Hasło wysłane przez klienta jest zakodowane w standardzie base64, aby ustandaryzować zestaw znaków, ale nie jest wykonywane haszowanie ani szyfrowanie. Jest to bardzo słaba forma ochrony twojej witryny i jeśli nie używasz HTTPS, hasło będzie czytelne dla każdego pomiędzy twoim klientem a serwerem.

Kody stanu http

Kody stanu HTTP są wysyłane z odpowiedziami i są zgodne ze standardami określonymi przez Internet Engineering Task Force, a także de facto standardy stosowane w branży. Kody stanu HTTP są podzielone na zakresy 100 kodów każdy. Wszystkie kody stanu w zakresie będzie miało podobne znaczenie, jak w poniższej tabeli.

Zakres : Ogólne znaczenie

200 : Żądanie powiodło się
300 : Żądanie musi zostać przekierowane
400 : Po stronie klienta wystąpił błąd
500 : Wystąpił błąd po stronie serwera

Do egzaminu nie musisz znać wszystkich różnych kodów stanu. Kiedy piszesz API w prawdziwym życiu, będziesz mógł odwiedzić Wikipedię i wybrać odpowiedni kod dla twojej odpowiedzi. Do egzaminu wystarczy znać najważniejsze:

Kod : Status

200 : OK; żądanie zakończyło się powodzeniem.
201 : Utworzono; żądanie spowodowało utworzenie nowego zasobu.
301 : Przeniesiony na stałe; zasób będzie zawsze znajdować się w określonej lokalizacji.
400 : Złe żądanie; w żądaniu było coś źle sformułowanego lub w przeciwnym razie uniemożliwiłby jej wykonanie.
401 : Niedozwolone; klient nie został uwierzytelniony jako upoważniony do wykonania tego żądania
403 : Zabronione; (uwierzytelniony) klient nie może złożyć tego żądania.
500 : Wewnętrzny błąd serwera; serwer nie był w stanie zrealizować żądania i nie może odpowiedzieć bardziej odpowiednio. Powszechnie związany z awarią lub błędną konfiguracją.

Podczas korzystania z interfejsów API kod statusu HTTP jest bardzo ważny. Jeśli kodujesz interfejs API, powinieneś upewnić się, że wysłałeś poprawny kod stanu błędu. Na przykład, jeśli żądanie nie powiedzie się i wyślesz komunikat o błędzie w treści, ty powinien upewnić się, że kod stanu HTTP to 400, a nie 200. W trakcie pracy z PHP poznasz kody stanu, ale jeśli wątpisz, sprawdź listę i upewnij się, że wysyłasz odpowiednią odpowiedź.

Funkcje kontroli wyjścia

Zamiast natychmiastowego wyjścia ze skryptu, często bardzo przydatne jest przechowywanie danych wyjściowych w buforze, a następnie jednoczesne opróżnienie całego bufora. Może to być przydatne do ucieczki przed wyjściem przed wysłaniem go do użytkownika lub za pomocą wbudowanych procedur kompresji PHP w celu skompresowania odpowiedzi wysyłanej do kompatybilnych przeglądarek. Funkcja ob_start () służy do rozpoczęcia buforowania danych wyjściowych. Wszystko, co normalnie skrypt wypisuje w treści odpowiedzi, zostanie zapisane w buforze. Ta funkcja przyjmuje opcjonalny parametr, który można wywołać i będzie wywoływany, gdy bufor zostanie wyprowadzony lub odrzucony. Oto przykład ustawienia funkcji oddzwaniania. Uwzględniłem wyniki skryptu jako komentarz.

< ?php
function escapeOutput(string $buffer): string {
return htmlentities($buffer);
}
ob_start("escapeOutput");
// <script>alert("xss");</script>
echo '< script >alert("xss");< /script >';

W tym przykładzie bufor został domyślnie opróżniony po zakończeniu skryptu. Możesz użyć funkcji ob_flush() , aby jawnie opróżnić bufor i wyprowadzić jego zawartość. Może to być przydatne, gdy piszesz skrypt CLI i chcesz widzieć postęp, a innym (prawdopodobnie złym) przypadkiem użycia może być napisanie serwera dla klienta JavaScript z długimi pytaniami

< ?php
ob_start ();
// to jest skrypt cli
dla ($ i = 1; $ i <5; $ i ++) {
echo $ i;
// każdy znak jest wyprowadzany jeden po drugim
ob_flush ();
sen (1);
}

Funkcja ob_flush wyśle bufor i umożliwi buforowanie dalszych danych wyjściowych. Porównaj to z ob_end_flush, który wygeneruje bufor i wyłączy dalsze buforowanie.

Uwaga : Funkcji flush () można użyć, jeśli serwer WWW buforuje dane wyjściowe i chcesz spróbować zastąpić to zachowanie i wysłać coś bezpośrednio do przeglądarki. Jednak to nie zawsze działa.

PHP ma wbudowany sposób, aby pomóc Ci skompresować dane przed wysłaniem ich przez sieć. Jeśli włączysz tę opcję, PHP wykryje, czy przeglądarka jest w stanie obsługiwać skompresowane dane, a jeśli tak, użyj algorytmu GZIP, aby zmniejszyć rozmiar odpowiedzi. Aby to skonfigurować, należy określić funkcję kompresji jako wywołanie zwrotne dla ob_start (). Więcej przykładów znajdziesz w podręczniku PHP, ale oto prosty przykład:

< ?php
ob_start("ob_gzhandler");
? >
{"string": "my json api output is compressed now"}


QUIZ



P1: Załóżmy, że zmienna_zamów jest ustawiona na wartość domyślną PHP. Jaka byłaby wartość $ _REQUEST ["największy fan"] dla następującego żądania HTTP?

POST HTTP/1.1
Host: thebeebfanclub.com?biggestfan=Ron
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
biggestfan=Ronald

-----------------------------------
Ron
Ronald
Something else
None of the above

P2: Każde z tych danych wejściowych ma odpowiednio skonstruowaną formę, która POST przesyła do Twojej witryny. Który z nich jest prawidłowym sposobem umieszczenia nazwy wprowadzonej w polu wejściowym w zmiennej, do której można uzyskać dostęp, np. $ _POST ['justin] [' numberonefan ']?

-----------------------------------
< input type = "text" name = "justin.numberonefan" >
< input type = "text" name = "justin (numberonefan)" >
< input type = "text" name = "justin [numberonefan]" >
< input type = "text" name = "justin_numberonefan" >
Żadne z powyższych

P3: Pliki cookie to niezawodny sposób przechowywania informacji bez marnowania zasobów serwera. Wybierz najbardziej odpowiednią opcję.

-----------------------------------
Tak, przechowywanie informacji po stronie klienta oszczędza miejsce na dysku serwera
Nie, kopia informacji jest nadal przechowywana w danych sesji
Nie, nie są wiarygodne
Tak, często przechowywane są wszystkie dane sesji w plikach cookie

P4: Co wygeneruje ten kod? Wybierz wszystkie, które dotyczą

< ?php
echo $a;
session_start();
echo session_id();

-----------------------------------
Powiadomienie, ponieważ $a jest niezdefiniowany
Ostrzeżenie, ponieważ $a jest niezdefiniowany
Ostrzeżenie, ponieważ nie można rozpocząć sesji
Losowy ciąg zawierający identyfikator_sesji

P5: Która z poniższych cech służy do właściwości domeny pliku cookie?

-----------------------------------
Ogranicz, dla której części witryny internetowej plik cookie jest ważny
Podaj nazwę swojej strony internetowej
Uniemożliwić przeglądarce wysyłanie tego pliku cookie na inne strony internetowe
Żadne z powyższych

ODPOWIEDZI



•  Ronald

•  < input type = "text" name = "justin [numberonefan]" >

•  Nie, nie są wiarygodne

•  Powiadomienie, ponieważ $a jest niezdefiniowany ; Ostrzeżenie, ponieważ $a jest niezdefiniowany

• Uniemożliwić przeglądarce wysyłanie tego pliku cookie na inne strony internetowe