Obszerny zbiór przydatnych skryptów! Musisz go mieć!
* Jak skonfigurować środowisko PHP?
* Jak tworzyć bezpieczne skrypty PHP?
* Jakie skrypty musisz znać?
PHP jest łatwym w użyciu językiem skryptowym. Łatwym, a przez to niezwykle popularnym. Jednak, czy ktoś mówił, że w łatwym języku nie można napotkać na skomplikowane problemy? Niestety odpowiedz brzmi - nie. Jednak nie załamuj rąk! Dzięki swej popularności, w sieci istnieje niezliczona liczba stron zawierających informacje, które mogą być przydatne w rozwiązywaniu Twoich problemów.
Ale po co szukać perełek wśród masy kiepskich rozwiązań? Czyż nie lepiej sięgnąć po książkę, która zawierałaby rozwiązania najczęstszych zadań? Oczywiście, że tak. Właśnie taką książkę trzymasz przed sobą! Książka ta zawiera blisko 80 skryptów pozwalających na rozwiązanie najróżniejszych zadań, począwszy od formatowania dat i ciągów znaków, skończywszy na skryptach wykorzystujących pocztę elektroniczną. Dzięki tej książce dowiesz się między innymi, jak tworzyć bezpieczne skrypty oraz pracować z formularzami. Dodatkowo poznasz sposoby konfiguracji samego PHP. Dzięki książce "Praktyczne skrypty, które oszczędzą Twój czas" twoje skrypty będą lepsze, a Ty zyskasz więcej wolnego czasu!
* Zestaw skryptów, które musi znać każdy programista
* Tworzenie szablonów Smarty
* Konfigurowanie środowiska PHP
* Przegląd wszystkich ustawień PHP
* Zastosowanie pakietu SafeHTML
* Zapobieganie atakom XSS
* Zapewnienie bezpieczeństwa w skryptach PHP
* Generowanie losowych haseł
* Praca z formularzami
* Weryfikacja danych z formularza
* Weryfikacja kart kredytowych
* Operacje wykonywane na datach
* Praca z tekstem oraz kodem HTML
* Wykorzystanie plików w codziennej pracy
* Monitorowanie sesji użytkownika
* Mechanizm logowania do aplikacji
* Tworzenie obrazów CAPTCHA
* Operowanie danymi w formacie XML
* Operowanie grafiką
Nie trać czasu na poszukiwanie dobrych rozwiązań! Miej je pod ręką!
PHP. Praktyczne skrypty, które oszczędzą Twój czas
1. PHP. Praktyczne skrypty,
które oszczêdz¹ Twój czas
Autor: William Steinmetz, Brian Ward
T³umaczenie: Miko³aj Szczepaniak
ISBN: 978-83-246-1851-4
Tytu³ orygina³u: Wicked Cool PHP: Real-World Scripts
That Make Difficult Things Possible
Format: 80x235, stron: 248
Obszerny zbiór przydatnych skryptów! Musisz go mieæ!
• Jak skonfigurowaæ œrodowisko PHP?
• Jak tworzyæ bezpieczne skrypty PHP?
• Jakie skrypty musisz znaæ?
PHP jest ³atwym w u¿yciu jêzykiem skryptowym. £atwym, a przez to niezwykle popularnym.
Jednak, czy ktoœ mówi³, ¿e w ³atwym jêzyku nie mo¿na napotkaæ na skomplikowane
problemy? Niestety odpowiedz brzmi – nie. Jednak nie za³amuj r¹k! Dziêki swej popularnoœci,
w sieci istnieje niezliczona liczba stron zawieraj¹cych informacje, które mog¹ byæ przydatne
w rozwi¹zywaniu Twoich problemów.
Ale po co szukaæ pere³ek wœród masy kiepskich rozwi¹zañ? Czy¿ nie lepiej siêgn¹æ po
ksi¹¿kê, która zawiera³aby rozwi¹zania najczêstszych zadañ? Oczywiœcie, ¿e tak. W³aœnie
tak¹ ksi¹¿kê trzymasz przed sob¹! Ksi¹¿ka ta zawiera blisko 80 skryptów pozwalaj¹cych
na rozwi¹zanie najró¿niejszych zadañ, pocz¹wszy od formatowania dat i ci¹gów znaków,
skoñczywszy na skryptach wykorzystuj¹cych pocztê elektroniczn¹. Dziêki tej ksi¹¿ce dowiesz
siê miêdzy innymi, jak tworzyæ bezpieczne skrypty oraz pracowaæ z formularzami. Dodatkowo
poznasz sposoby konfiguracji samego PHP. Dziêki ksi¹¿ce „Praktyczne skrypty, które
oszczêdz¹ Twój czas” twoje skrypty bêd¹ lepsze, a Ty zyskasz wiêcej wolnego czasu!
• Zestaw skryptów, które musi znaæ ka¿dy programista
• Tworzenie szablonów Smarty
• Konfigurowanie œrodowiska PHP
• Przegl¹d wszystkich ustawieñ PHP
• Zastosowanie pakietu SafeHTML
• Zapobieganie atakom XSS
• Zapewnienie bezpieczeñstwa w skryptach PHP
• Generowanie losowych hase³
• Praca z formularzami
• Weryfikacja danych z formularza
• Weryfikacja kart kredytowych
• Operacje wykonywane na datach
• Praca z tekstem oraz kodem HTML
• Wykorzystanie plików w codziennej pracy
• Monitorowanie sesji u¿ytkownika
• Mechanizm logowania do aplikacji
• Tworzenie obrazów CAPTCHA
• Operowanie danymi w formacie XML
• Operowanie grafik¹
Nie traæ czasu na poszukiwanie dobrych rozwi¹zañ! Miej je pod rêk¹!
2. Spis tre ci
WPROWADZENIE ....................................................................................... 9
1.
NAJCZ}¥CIEJ ZADAWANE ¿YCIOWE PYTANIA — SKRYPTY,
KTÓRE KA¿DY PROGRAMISTA PHP CHCE (MUSI) ZNAm ...................... 11
Skrypt nr 1: DoïÈczenie innego pliku w formie czÚ ci danego skryptu ..................................12
Co mo e pój Ê nie po naszej my li? ...................................................................................13
Skrypt nr 2: Naprzemienne kolorowanie wierszy tabeli ........................................................15
Doskonalenie tego skryptu ................................................................................................16
Skrypt nr 3: Tworzenie ïÈczy Poprzednia/NastÚpna ..............................................................18
Stosowanie tego skryptu ....................................................................................................21
Skrypt nr 4: Wy wietlanie zawarto ci tablicy .........................................................................22
Skrypt nr 5: Przeksztaïcanie tablicy w zmiennÈ .....................................................................23
nietablicowÈ z mo liwo ciÈ przywrócenia oryginalnej struktury ...........................................24
Co mo e pój Ê nie po naszej my li? ...................................................................................24
Skrypt nr 6: Sortowanie tablic wielowymiarowych ................................................................25
Doskonalenie tego skryptu ................................................................................................26
Skrypt nr 7: Tworzenie dla witryny internetowej szablonów Smarty ....................................26
Instalacja biblioteki Smarty .................................................................................................27
Krótki podrÚcznik Smarty ..................................................................................................28
Co mo e pój Ê nie po naszej my li? ...................................................................................29
Doskonalenie tego skryptu ................................................................................................30
2.
KONFIGUROWANIE PHP ......................................................................... 31
Ustawienia konfiguracyjne i plik php.ini .................................................................................31
Lokalizowanie pliku php.ini ................................................................................................32
Skrypt nr 8: Odkrywanie wszystkich ustawieñ PHP ..............................................................33
Skrypt nr 9: Odczytywanie poszczególnych ustawieñ ........................................................33
Skrypt nr 10: Raportowanie o bïÚdach ...................................................................................35
Typowe komunikaty o bïÚdach ..........................................................................................35
3. Skrypt nr 11: Ukrywanie wszystkich komunikatów o bïÚdach .............................................. 37
Skrypt nr 12: Wydïu anie czasu wykonywania skryptu ......................................................... 38
Co mo e pój Ê nie po naszej my li? ................................................................................... 38
Skrypt nr 13: Uniemo liwianie u ytkownikom wysyïania wielkich plików ........................... 38
Skrypt nr 14: WyïÈczanie rejestrowanych zmiennych globalnych ......................................... 39
Skrypt nr 15: WïÈczanie „magicznych cudzysïowów” ........................................................... 39
Co mo e pój Ê nie po naszej my li? ................................................................................... 40
Skrypt nr 16: Ograniczanie dostÚpu PHP do plików ......................................................... 40
Co mo e pój Ê nie po naszej my li? ................................................................................... 41
Skrypt nr 17: WyïÈczanie obsïugi okre lonych funkcji ........................................................... 41
Skrypt nr 18: Dodawanie rozszerzeñ do PHP ....................................................................... 41
Dodawanie rozszerzeñ jÚzyka PHP ................................................................................... 43
Instalacja rozszerzeñ za pomocÈ internetowego panelu sterowania ................................. 44
Co mo e pój Ê nie po naszej my li? ................................................................................... 48
3.
BEZPIECZE”STWO W PHP ....................................................................... 49
Ustawienia konfiguracyjne zalecane z uwagi na bezpieczeñstwo .......................................... 51
Skrypt nr 19: Wstrzykiwanie kodu jÚzyka SQL ..................................................................... 52
Skrypt nr 20: Zapobieganie prostym atakom typu XSS ......................................................... 54
Skrypt nr 21: Stosowanie pakietu SafeHTML ........................................................................ 56
Co mo e pój Ê nie po naszej my li? ................................................................................... 57
Skrypt nr 22: Ochrona danych za pomocÈ jednokierunkowej funkcji generujÈcej skróty ..... 58
Doskonalenie tego skryptu ................................................................................................ 59
Skrypt nr 23: Szyfrowanie danych za pomocÈ rozszerzenia Mcrypt ..................................... 60
Doskonalenie tego skryptu ................................................................................................ 62
Skrypt nr 24: Generowanie haseï losowych .......................................................................... 62
Stosowanie tego skryptu ................................................................................................... 63
4.
PRACA Z FORMULARZAMI ..................................................................... 65
¥rodki bezpieczeñstwa: formularze nie sÈ godne zaufania .................................................... 65
Strategie weryfikacji .............................................................................................................. 66
Stosowanie zmiennych $_POST, $_GET, $_REQUEST
oraz $_FILES do uzyskiwania dostÚpu do danych formularza ............................................... 67
Skrypt nr 25: Spójne i bezpieczne uzyskiwanie zmiennych formularza ................................. 67
Skrypt nr 26: Usuwanie zbÚdnych znaków biaïych .................................................................... 68
Skrypt nr 27: Importowanie zmiennych formularza do tablicy ............................................. 69
Skrypt nr 28: Sprawdzanie, czy odpowied nale y do zbioru prawidïowych warto ci ......... 72
Doskonalenie tego skryptu ................................................................................................ 73
Skrypt nr 29: Stosowanie wielu przycisków akceptacji formularza ....................................... 74
Skrypt nr 30: Weryfikacja kart kredytowych ......................................................................... 74
Stosowanie tego skryptu ................................................................................................... 77
Doskonalenie tego skryptu ................................................................................................ 77
4 Spis tre ci
4. Skrypt nr 31: Podwójne sprawdzanie daty wyga niÚcia wa no ci karty kredytowej .............77
Stosowanie tego skryptu ....................................................................................................79
Skrypt nr 32: Sprawdzanie poprawno ci adresów poczty elektronicznej ..............................79
Skrypt nr 33: Sprawdzanie poprawno ci numerów telefonu .................................................80
5.
PRACA Z TEKSTEM I KODEM J}ZYKA HTML .......................................... 83
Skrypt nr 34: WyodrÚbnianie fragmentu ïañcucha ....................................................................83
Doskonalenie tego skryptu ................................................................................................86
Skrypt nr 35: Zmiana liter ïañcucha na wielkie,
maïe lub wielkie litery na poczÈtku wyrazów ........................................................................86
Co mo e pój Ê nie po naszej my li? ...................................................................................87
Skrypt nr 36: Odnajdywanie podïañcuchów ..........................................................................88
Co mo e pój Ê nie po naszej my li? ...................................................................................89
Skrypt nr 37: ZastÚpowanie podïañcuchów ...........................................................................89
Co mo e pój Ê nie po naszej my li? ...................................................................................90
Skrypt nr 38: Odnajdywanie i poprawianie literówek za pomocÈ moduïu pspell ..................91
Praca ze sïownikiem domy lnym .......................................................................................91
Dodawanie sïownika niestandardowego do biblioteki pspell .............................................94
Co mo e pój Ê nie po naszej my li? ...................................................................................95
Skrypt nr 39: Wyra enia regularne ........................................................................................96
Podstawy wyra eñ regularnych .........................................................................................96
Sekwencje znaków specjalnych ..........................................................................................97
Repetytory wzorców .........................................................................................................98
Grupowanie .......................................................................................................................99
Klasy znaków ......................................................................................................................99
PoïÈczenie wszystkich omówionych elementów ...............................................................99
Dopasowywanie i wyodrÚbnianie tekstu za pomocÈ wyra eñ regularnych .....................100
ZastÚpowanie podïañcuchów za pomocÈ wyra eñ regularnych ......................................102
Skrypt nr 40: Przebudowa tabeli jÚzyka HTML ...................................................................103
Skrypt nr 41: Tworzenie screen scrapera ............................................................................104
Doskonalenie tego skryptu ..............................................................................................106
Skrypt nr 42: Konwersja zwykïego tekstu na prawidïowy kod jÚzyka HTML .....................106
Skrypt nr 43: Automatyczna konwersja adresów URL na hiperïÈcza ..................................109
Skrypt nr 44: Usuwanie znaczników jÚzyka HTML z ïañcuchów .........................................110
6.
PRACA Z DATAMI ................................................................................. 113
Jak liczony jest czas w systemie UNIX .................................................................................113
Skrypt nr 45: Uzyskiwanie bie Ècego znacznika czasowego ................................................114
Skrypt nr 46: Uzyskiwanie znacznika czasowego dla daty z przeszïo ci lub w przyszïo ci .....115
Tworzenie znaczników czasowych na podstawie ïañcucha .............................................115
Tworzenie znaczników czasowych na podstawie warto ci dat .......................................117
Skrypt nr 47: Formatowanie daty i godziny .........................................................................118
Skrypt nr 48: Wyznaczanie dnia tygodnia na podstawie danej daty .....................................121
Spis tre ci 5
5. Skrypt nr 49: Odnajdywanie ró nic dzielÈcych dwie daty ................................................... 121
Stosowanie tego skryptu ................................................................................................. 123
Doskonalenie tego skryptu .............................................................................................. 123
Formaty dat systemu MySQL .............................................................................................. 123
7.
PRACA Z PLIKAMI ................................................................................ 125
Uprawnienia dostÚpu do plików ......................................................................................... 125
Uprawnienia ustawiane za po rednictwem programu FTP ............................................ 127
Wiersz poleceñ ................................................................................................................ 127
Co mo e pój Ê nie po naszej my li? ................................................................................. 127
Skrypt nr 50: Umieszczanie zawarto ci pliku w zmiennej ................................................... 128
Doskonalenie tego skryptu .............................................................................................. 130
Co mo e pój Ê nie po naszej my li? ................................................................................. 131
Skrypt nr 51: Tworzenie plików i zapisywanie danych w plikach ....................................... 131
Skrypt nr 52: Sprawdzanie, czy interesujÈcy nas plik istnieje .............................................. 132
Skrypt nr 53: Usuwanie plików ........................................................................................... 133
Skrypt nr 54: Wysyïanie obrazów do katalogu .................................................................... 133
Stosowanie tego skryptu ................................................................................................. 138
Co mo e pój Ê nie po naszej my li? ................................................................................. 138
Doskonalenie tego skryptu .............................................................................................. 138
Skrypt nr 55: Odczytywanie plików z danymi oddzielonymi przecinkami .......................... 138
8.
¥LEDZENIE U¿YTKOWNIKA I SESJI ...................................................... 141
¥ledzenie danych u ytkownika z wykorzystaniem ciasteczek i sesji ................................... 142
Ciasteczka ........................................................................................................................ 142
Sesje ................................................................................................................................. 143
Skrypt nr 56: Tworzenie komunikatu
„Witaj ponownie, nazwa_u ytkownika!” z wykorzystaniem ciasteczek .................................. 144
Co mo e pój Ê nie po naszej my li? ................................................................................. 145
Skrypt nr 57: Wykorzystywanie sesji do tymczasowego skïadowania danych .................... 146
Co mo e pój Ê nie po naszej my li? ................................................................................. 148
Skrypt nr 58: Sprawdzanie, czy przeglÈdarka internetowa u ytkownika obsïuguje ciasteczka .....148
Skrypt nr 59: Przekierowywanie u ytkowników na inne strony ......................................... 150
Skrypt nr 60: Wymuszanie na u ytkownikach
stosowania stron szyfrowanych za pomocÈ SSL .................................................................. 151
Skrypt nr 61: Uzyskiwanie informacji o kliencie .................................................................. 151
Skrypt nr 62: Limity czasowe sesji ....................................................................................... 156
Skrypt nr 63: Prosty system logowania ............................................................................... 158
9.
PRACA Z POCZTk ELEKTRONICZNk ................................................... 161
Skrypt nr 64: Wysyïanie wiadomo ci poczty elektronicznej
z wykorzystaniem pakietu PHPMailer ................................................................................. 162
6 Spis tre ci
6. Instalacja pakietu PHPMailer ............................................................................................162
Stosowanie tego skryptu ..................................................................................................164
Dodawanie zaïÈczników ...................................................................................................165
Co mo e pój Ê nie po naszej my li ..................................................................................166
Skrypt nr 65: Wykorzystywanie wiadomo ci poczty elektronicznej
do weryfikacji kont u ytkowników ......................................................................................167
10.
PRACA Z OBRAZAMI ............................................................................ 173
Skrypt nr 66: Tworzenie obrazów CAPTCHA zabezpieczajÈcych system ..........................173
Skrypt nr 67: Tworzenie miniaturek obrazów .....................................................................181
11.
STOSOWANIE BIBLIOTEKI CURL
DO INTERAKCJI Z INNYMI US’UGAMI SIECIOWYMI ............................ 187
Skrypt nr 68: NawiÈzywanie poïÈczenia z innymi witrynami internetowymi .......................188
Skrypt nr 69: Stosowanie ciasteczek ....................................................................................191
Skrypt nr 70: Transformacja danych w formacie XML na bardziej czytelnÈ formÚ .............192
Skrypt nr 71: Korzystanie z geograficznych usïug sieciowych ..............................................194
Skrypt nr 72: Uzyskiwanie danych z witryny Amazon.com
za po rednictwem skryptu PHP i protokoïu SOAP .............................................................198
Skrypt nr 73: Budowanie usïugi sieciowej ............................................................................200
12.
PRZYK’ADY BARDZIEJ Z’O¿ONYCH PROJEKTÓW .............................. 205
Skrypt nr 74: Internetowe gïosowanie .................................................................................206
Tworzenie formularza z kartÈ do gïosowania ..................................................................207
Przetwarzanie karty do gïosowania .................................................................................209
Uzyskiwanie wyników gïosowania ...................................................................................211
Doskonalenie tego skryptu ..............................................................................................213
Skrypt nr 75: Elektroniczne kartki z pozdrowieniami ..........................................................214
Wybór kartki ....................................................................................................................216
Wysyïanie kartki elektronicznej .......................................................................................218
Wy wietlanie kartki ..........................................................................................................221
Doskonalenie tego skryptu ..............................................................................................224
Skrypt nr 76: System blogu ..................................................................................................225
Tworzenie wpisów na blogu ............................................................................................226
Wy wietlanie wpisu na blogu ...........................................................................................228
Dodawanie komentarzy ...................................................................................................232
Tworzenie indeksu blogu .................................................................................................233
Doskonalenie tego skryptu ..............................................................................................236
DODATEK .............................................................................................. 239
SKOROWIDZ .......................................................................................... 241
Spis tre ci 7
7. 2
Konfigurowanie PHP
JAK KA¿DY PAKIET OPROGRAMOWANIA, TAK I PHP OFERUJE
WIELE OPCJI KONFIGURACYJNYCH, KTÓRE W TEN CZY INNY
SPOSÓB WP’YWAJk NA SPOSÓB JEGO FUNKCJONOWANIA.
WiÚkszo Ê tych opcji nie ma istotnego znaczenia, ale o kilku
najwa niejszych opcjach ka dy programista PHP z pewno ciÈ
powinien wiedzieÊ.
Co wiÚcej, istnieje wiele dodatków do PHP (okre lanych
mianem bibliotek) uzupeïniajÈcych tÚ technologiÚ o nowe mo liwo ci. Na przy-
kïad rozszerzenie cURL umo liwia serwerowi wysyïanie danych formularzy do in-
nych serwerów i przetwarzanie odsyïanych odpowiedzi. Inne przydatne rozsze-
rzenie, Mcrypt, umo liwia nam ïatwe i skuteczne szyfrowanie danych celem
bezpiecznego skïadowania poufnych informacji.
W tym rozdziale zajmiemy siÚ ustawieniami konfiguracyjnymi najczÚ ciej wyko-
rzystywanymi przez programistów PHP oraz sytuacjami, w których stosowanie tych
ustawieñ jest uzasadnione.
Ustawienia konfiguracyjne i plik php.ini
WiÚkszo Ê poczÈtkujÈcych programistów traktuje ustawienia domy lne PHP jakby
,
byli nie miaïymi lokatorami wprowadzajÈcymi siÚ do ekskluzywnego apartamentu
— obawiajÈ siÚ cokolwiek zmieniÊ w obawie o wpïaconÈ kaucjÚ. W postrzeganiu
PHP jako domu nie ma niczego zïego. BÚdziemy tam jaki czas mieszkaÊ, dlacze-
go wiÚc nie poprzestawiaÊ mebli czy nie zburzyÊ paru cian?
8. UWAGA W zale no ci od konfiguracji samego komputera, na którym pracuje Twój serwer
WWW, mo esz nie mieÊ mo liwo ci samodzielnego modyfikowania ustawieñ.
Dobrzy operatorzy serwerów nie majÈ jednak nic przeciwko wprowadzaniu nie-
zbÚdnych zmian w Twoim imieniu, a najlepsze firmy tego typu oferujÈ nawet mo li-
wo Ê modyfikacji ustawieñ za po rednictwem specjalnych plików konfiguracyjnych.
Ustawienia rodowiska PHP sÈ skïadowane w pliku nazwanym php.ini, który
mo na przeglÈdaÊ i modyfikowaÊ w dowolnym edytorze tekstu. Ustawienia, które
podzielono pomiÚdzy sekcje, majÈ nastÚpujÈcÈ postaÊ:
max_execution_time = 30 ; Maksymalny czas wykonywania
max_input_time = 60 ; Maksymalny czas analizy skáadniowej danych wej ciowych
memory_limit = 8M ; Maksymalna ilo ü pami ci zajmowanej przez skrypt
Parametry konfiguracyjne mo na ustawiaÊ za pomocÈ znaku równo ci (=).
¥rednik (;) oznacza, e mamy do czynienia z komentarzem; okazuje siÚ jednak,
e istniejÈ wyjÈtki od tej reguïy umo liwiajÈce stosowanie redników w niektó-
rych parametrach. Gdyby my chcieli trwale zmieniÊ jakie ustawienie, powinni my
sporzÈdziÊ kopiÚ zapasowÈ pliku php.ini, zmodyfikowaÊ oryginalny plik konfi-
guracyjny i ponownie uruchomiÊ serwer Apache. Gdyby my chcieli zmieniaÊ
ustawienia na poziomie skryptu, powinni my u yÊ funkcji ini_set().
Lokalizowanie pliku php.ini
W niektórych przypadkach wskazanie miejsca skïadowania pliku php.ini w syste-
mie, w którym pracujemy (szczególnie je li korzystamy z wielu instalacji rodowiska
PHP), bywa trudne. Poni ej opisano kilka sposobów lokalizowania tego pliku:
Q U ytkownicy systemów UNIX powinni zajrzeÊ do katalogu /usr/lib
lub /usr/local/lib. Plik php.ini powinien siÚ znajdowaÊ w podkatalogu lib
w miejscu, w którym zainstalowano PHP.
Q U ytkownicy systemu Windows powinni zwróciÊ uwagÚ na katalog C:php.
Q Mo na te wywoïaÊ funkcjÚ phpinfo() w kodzie skryptu PHP (wiÚcej
informacji na ten temat w kolejnym podrozdziale). Lokalizacja pliku
php.ini zostanie wy wietlona w poczÈtkowej czÚ ci danych wynikowych
obok etykiety Configuration File (php.ini) Location.
Q W wielu systemach UNIX mo na uzyskaÊ listÚ wszystkich plików
pasujÈcych do wzorca php.ini za pomocÈ polecenia locate php.ini.
UWAGA Wiele ustawieñ nie jest definiowanych w domy lnym pliku php.ini; rodowisko PHP
stosuje dla niezdefiniowanych ustawieñ wïasne warto ci domy lne. ListÚ ustawieñ
domy lnych PHP mo na znale Ê na stronie internetowej http://www.php.net/
´manual/en/ini.php.
32 Rozdziaï 2
9. Skrypt nr 8: Odkrywanie
wszystkich ustawieñ PHP
PHP oferuje bogatÈ funkcjonalno Ê, jednak nie zawsze wszystkie te funkcje sÈ
wïÈczone lub wbudowane w stosowanej instalacji. Do sprawdzenia, jakie ele-
menty wchodzÈ w skïad danej instalacji rodowiska PHP mo na wykorzystaÊ
,
bardzo prosty skrypt. Mo liwo Ê uzyskiwania tego rodzaju danych jest o tyle nie-
bezpieczna, e szeroki zakres prezentowanych informacji stanowi swoisty pod-
rÚcznik dla potencjalnych atakujÈcych. Funkcja phpinfo() zdaje siÚ mówiÊ: „Tutaj.
To sÈ moje sïabe punkty. Wprost nie mogÚ siÚ doczekaÊ wïamania do mojego
systemu”. W tej sytuacji nale y pamiÚtaÊ o konieczno ci usuniÚcia tego skryptu
zaraz po uzyskaniu interesujÈcych nas informacji:
<?php
phpinfo();
?>
Funkcja phpinfo() wy wietla wszystko, co rodowisko PHP „wie” o swojej kon-
figuracji. NaprawdÚ wszystko. Zwracane informacje nie ograniczajÈ siÚ tylko do sta-
nu poszczególnych ustawieñ konfiguracyjnych PHP poïo enia pliku php.ini czy
,
wersji samego rodowiska PHP — obejmujÈ tak e wersjÚ serwera WWW, skompi-
lowane rozszerzenia oraz dane interfejsu API serwera. Warto zwróciÊ szczególnÈ
uwagÚ na opcje konfiguracyjne, aby mieÊ pewno Ê, e wszystkie niezbÚdne funkcje
zostaïy prawidïowo zainstalowane i wïÈczone.
Aby uruchomiÊ ten skrypt, odwied odpowiedniÈ stronÚ za pomocÈ swojej
przeglÈdarki internetowej. Nie zapomnij usunÈÊ tego skryptu po uzyskaniu po-
trzebnych informacji.
Skrypt nr 9: Odczytywanie
poszczególnych ustawieñ
Czasem, kiedy wiemy, czego szukamy, stosowanie funkcji phpinfo() jest prze-
sadne i niepotrzebne. Mo emy na przykïad byÊ zainteresowani tylko sprawdze-
niem, czy mechanizm „magicznych cudzysïowów” jest wïÈczony, lub okre le-
niem cie ki doïÈczania. Co wiÚcej, funkcja phpinfo() w aden sposób nam nie
pomo e, je li pisany skrypt zachowuje siÚ inaczej w razie wïÈczenia jakiego usta-
wienia i inaczej w sytuacji, gdy to ustawienie jest wyïÈczone.
Aby uzyskaÊ warto Ê okre lonego ustawienia konfiguracyjnego, nale y u yÊ
funkcji ini_get():
Konfigurowanie PHP 33
10. <?php
echo "Warto Ê opcji register_globals: " . ini_get('register_globals');
?>
Wystarczy przekazaÊ na wej ciu funkcji ini_get() prawidïowÈ nazwÚ para-
metru konfiguracji, a otrzymamy aktualne ustawienie tego parametru na bie Ècym
serwerze. Opcja jest zwracana w formie zwykïej warto ci, zatem mo na jÈ wy wie-
tliÊ, przypisaÊ do zmiennej itd. KorzystajÈc z tej funkcji, musimy jednak mieÊ na
uwadze dwa aspekty.
Po pierwsze: warto ci logiczne, np. "false", z reguïy sÈ zwracane w formie
ïañcuchów pustych, zatem je li spróbujemy wy wietliÊ ustawienie "off" para-
metru register_globals, byÊ mo e otrzymamy nastÚpujÈcy komunikat:
Warto Ê opcji register_globals:
Po drugie: warto ci numeryczne czÚsto sÈ reprezentowane w formie skróconej.
Je li na przykïad parametrowi upload_max_filesize przypisano warto Ê 8192 baj-
tów, zostanie zwrócona warto Ê 8 kB. Podobnie, je li maksymalny rozmiar wysyïa-
nego pliku ustalono na poziomie 2 MB, dla parametru upload_max_filesize
otrzymamy warto Ê 2 MB, a nie 2 097 152 bajty.
Taki sposób reprezentowania numerycznych ustawieñ konfiguracyjnych mo-
e stanowiÊ powa ny problem, je li chcemy na tych liczbach wykonywaÊ opera-
cje arytmetyczne. Oficjalna dokumentacja PHP wspomina o funkcji konwertujÈ-
cej warto ci skrócone (kilo- i mega-) na prawdziwe warto ci:
function return_bytes($val) {
$val = trim($val);
$last = $val{strlen($val)-1};
switch(strtoupper($last)) {
case 'K':
return (int) $val * 1024;
break;
case 'M':
return (int) $val * 1048576;
break;
default:
return $val;
}
}
34 Rozdziaï 2
11. Skrypt nr 10: Raportowanie o bïÚdach
PracujÈc nad kodem, czÚsto zapominamy nazw stosowanych zmiennych lub ko-
rzystamy z przestarzaïych, niezalecanych konstrukcji. W niektórych przypad-
kach jÚzyk PHP okazuje siÚ na tyle przyjazny u ytkownikowi (przynajmniej jak
na standardy programowania), e sam naprawia wiele drobnych bïÚdów w kodzie.
PHP umo liwia nam miÚdzy innymi pisanie programów bez konieczno ci
deklarowania wszystkich niezbÚdnych zmiennych na poczÈtku kodu, co jest bardzo
wygodne, przynajmniej do momentu gdy zamiast nazwy $string omyïkowo
u yjemy nazwy $stirng reprezentujÈcej warto Ê pustÈ. Mo na te przekazywaÊ
zmienne na wej ciu funkcji w zupeïnie niewïa ciwy sposób, a mimo to skrypt
PHP bÚdzie dziaïaï prawidïowo, poniewa w wiÚkszo ci przypadków bÚdzie
przyjmowaï pewne zaïo enia wobec zamiarów programisty. Tego rodzaju mechani-
zmy sÈ oczywi cie bardzo po Èdane, dopóki PHP prawidïowo odgaduje nasze in-
tencje — w przeciwnym razie poszukiwanie tajemniczego bïÚdu mo e nam zajÈÊ
mnóstwo czasu.
Aby wyïÈczyÊ mechanizmy automatycznego usuwania problemów, mo na
wïÈczyÊ tryb raportowania o bïÚdach, co spowoduje, e PHP bÚdzie wy wietlaï
na ekranie niezliczone komunikaty w reakcji na ka dy wykryty bïÈd (niezale nie
od jego faktycznej wagi). Mo na te komunikaty wykorzystaÊ do eliminowania
potencjalnych luk w zabezpieczeniach i wykrywania bïÚdnych zmiennych przed
skierowaniem programu do rodowiska koñcowego. WïÈczenie trybu raporto-
wania o bïÚdach wymaga umieszczenia nastÚpujÈcego kodu na poczÈtku tworzonego
skryptu:
<?php
error_reporting(E_ALL);
// Tutaj nale y umie ciü dalsz cz ü skryptu.
?>
WïÈczenie trybu raportowania o bïÚdach powoduje, e PHP wy wietla ko-
munikaty jeszcze przed przetworzeniem dalszej czÚ ci danego programu. (Takie
rozwiÈzanie uniemo liwia ustawianie ciasteczek w razie wystÈpienia bïÚdu, zatem
nie powinni my nawet próbowaÊ zmieniaÊ warto ci ciasteczek po wïÈczeniu tego
trybu).
Typowe komunikaty o bïÚdach
Warto dobrze opanowaÊ i zrozumieÊ trzy najczÚ ciej generowane komunikaty
o bïÚdach.
Notice: Undefined variable: var in script.php on line n
Konfigurowanie PHP 35
12. Komunikat w tej formie oznacza, e korzystamy ze zmiennej, której wcze niej
nie zdefiniowano w danym skrypcie. Taka sytuacja mo e mieÊ miejsce w kilku
przypadkach:
Q ByÊ mo e popeïnili my bïÈd w pisowni nazwy zmiennej.
Q ByÊ mo e u yli my wyra enia warunkowego zawierajÈcego definicjÚ
zmiennej, np.:
if ($fred == "Jestem Fred") {
$he_is_fred = "yes";
}
Q ByÊ mo e próbujemy konkatenowaÊ zmiennÈ bez jej uprzedniego
zadeklarowania.
Inny popularny problem wystÚpuje du o czÚ ciej w sytuacji, gdy w swoim
programie próbujemy korzystaÊ ze starszego kodu PHP:
Notice: Use of undefined constant k - assumed 'k' in script.php on line n
Komunikat ostrze enia w tej formie zwykle oznacza, e programista podjÈï
próbÚ przekazania ïañcucha na wej ciu funkcji bez otaczajÈcych go cudzysïo-
wów. Innymi sïowy, u yto na przykïad wywoïania strtolower(ïañcuch) zamiast
metody strtolower("ïañcuch").
I wreszcie istnieje popularny komunikat o bïÚdzie generowany w sytuacji,
gdy uzyskujemy dostÚp do tablicy:
Notice: Undefined index: i in script.php on line n
W praktyce komunikat w tej formie oznacza, e podjÚto próbÚ odczytania
elementu $tablica[i], mimo e tablica $tablica nie definiuje elementu pod
tym indeksem. Z tego rodzaju bïÚdami mamy do czynienia w sytuacji, gdy uzy-
skujemy warto Ê z formularza za po rednictwem zmiennej $_POST lub $_GET,
chocia adna z tych zmiennych nie zawiera tak nazwanej warto ci. NajczÚ ciej
podobne bïÚdy wynikajÈ z tego, e u ytkownik nie zaznaczyï odpowiedniego
pola wyboru lub przycisku opcji — w takim przypadku zmienna reprezentujÈca
ten element formularza w ogóle nie jest przekazywana w ramach Èdania GET
(jako czÚ Ê adresu URL).
Tryb raportowania o bïÚdach nale y wyïÈczyÊ z chwilÈ wdra ania skryptu na
docelowej witrynie, aby u ytkownicy nie mogli siÚ zapoznawaÊ z popeïnionymi
przez nas bïÚdami i aby wyeliminowaÊ wpïyw tego trybu na ciasteczka (w szcze-
gólno ci problemy ze ledzeniem sesji).
36 Rozdziaï 2
13. Skrypt nr 11: Ukrywanie wszystkich
komunikatów o bïÚdach
W pewnych sytuacjach dysponujemy prawidïowo dziaïajÈcym skryptem, a mimo
to rodowisko PHP wciÈ sugeruje potencjalne usterki. Innym razem nie chcemy,
by oczekiwane problemy powodowaïy, e nasi u ytkownicy bÚdÈ nara eni na
odra ajÈcy widok komunikatów o bïÚdach (odkrywajÈcych informacje, co szcze-
gólnie ceniÈ sobie hakerzy).
Na szczÚ cie istnieje mo liwo Ê powstrzymania PHP przed wy wietlaniem
wszystkich komunikatów o bïÚdach. Wystarczy w pliku php.ini umie ciÊ nastÚ-
pujÈcy wiersz:
display_errors = Off
Przytoczone rozwiÈzanie warto stosowaÊ w rodowisku docelowym aplikacji
internetowej, aby w przyszïo ci nie obawiaÊ siÚ szerokiej dostÚpno ci komuni-
katów diagnostycznych PHP odno nie do naszego kodu. Gdyby my chcieli za-
poznaÊ siÚ z tymi komunikatami celem wyeliminowania ewentualnych problemów,
powinni my u yÊ nastÚpujÈcego ustawienia konfiguracyjnego wymuszajÈcego
kierowanie tych komunikatów do dziennika zdarzeñ serwera Apache:
log_errors = On
W razie potrzeby mo na nawet wysyïaÊ komunikaty diagnostyczne do dzien-
nika systemowego lub wskazanego pliku — parametrowi error_log nale y wów-
czas przypisaÊ odpowiednio warto Ê syslog lub nazwÚ pliku.
Pozostaje jeszcze kwestia naszego rodowiska wytwarzania, gdzie z reguïy
chcemy uzyskiwaÊ mo liwie wiele komunikatów diagnostycznych. Po przypisa-
niu parametrowi display_errors warto ci On mo na dodatkowo (w pliku php.ini)
ustawiÊ strukturÚ bitowÈ w parametrze error_reporting (wiÚcej szczegóïów na
ten temat mo na znale Ê w przykïadowym pliku php.ini instalowanym wraz ze
rodowiskiem PHP). Je li jednak chcemy „uciszyÊ” jaki skrypt, który nieustannie
zasypuje nas tymi samymi komunikatami, mo emy u yÊ w jego kodzie nastÚpujÈ-
cego wywoïania funkcji:
error_reporting(0);
Konfigurowanie PHP 37
14. Skrypt nr 12: Wydïu anie czasu
wykonywania skryptu
Pracowaïem kiedy w firmie, która postawiïa sobie za cel zmianÚ mechanizmu
obsïugi koszyków z zakupami. Do moich zadañ nale aïo napisanie skryptu od-
powiedzialnego za konwersjÚ 250 MB danych o produktach ze starego na nowy
format. Skrypt dziaïaï co prawda znakomicie, jednak ilo Ê przetwarzanych da-
nych powodowaïa, e rodowisko PHP stale przerywaïo jego wykonywanie po
upïywie 30 sekund, a wiÚc na dïugo przed osiÈgniÚciem zamierzonego celu.
Wïa nie wówczas odkryïem drobne rozszerzenie, które umo liwiïo mojemu
skryptowi wykonanie zleconego zadania. Poni szy wiersz dodany na poczÈtku
skryptu powoduje, e bÚdzie on miaï maksymalnie 240 sekund na przetworzenie
danych:
ini_set(max_execution_time, "240");
Parametr konfiguracyjny max_execution_time okre la maksymalny czas wyko-
nywania skryptu przed jego automatycznym zakoñczeniem. Nie nale y jednak tego
parametru nadu ywaÊ. Je li dany skrypt dziaïa kilka minut, to albo usprawie-
dliwia nas ogromna ilo Ê przetwarzanych informacji (najpewniej zaczerpniÚtych
z bazy danych), albo nasz skrypt jest bardzo nieefektywny, albo korzystamy z
niewïa ciwego jÚzyka programowania.
Co mo e pój Ê nie po naszej my li?
Je li nasz serwer pracuje w trybie awaryjnym, ustawianie warto ci parametru
max_execution_time w czasie wykonywania jest niemo liwe.
Warto te dokïadnie sprawdziÊ kod skryptu. ByÊ mo e omyïkowo zawarli my
tam nieskoñczonÈ pÚtlÚ lub pÚtlÚ wykonywanÈ w innej pÚtli i niepodejmujÈcÈ
adnych sensownych dziaïañ.
Skrypt nr 13: Uniemo liwianie u ytkownikom
wysyïania wielkich plików
Gdyby my chcieli uniemo liwiÊ u ytkownikom naszej aplikacji wysyïanie na
serwer 70-gigabajtowych MPEG-ów z najnowszym filmem „Gwiezdne wojny”,
powinni my okre liÊ maksymalny rozmiar plików kopiowanych na serwer.
(Szczegóïowe omówienie samych technik przetwarzania wysyïanych plików
mo na znale Ê w podrozdziale „Skrypt nr 54: Wysyïanie obrazów do katalogu”
w rozdziale 7.).
upload_max_filesize = 500K
38 Rozdziaï 2
15. Maksymalny rozmiar plików wysyïanych na serwer mo na okre liÊ na jeden
z trzech sposobów:
Q w formie warto ci caïkowitoliczbowej (wyra ajÈcej ïÈcznÈ liczbÚ bajtów);
Q w formie liczby z przyrostkiem M reprezentujÈcej megabajty
(2M to 2 megabajty);
Q w formie liczby z przyrostkiem K reprezentujÈcej kilobajty
(8K to 8 kilobajtów).
Niezale nie od u ytego formatu nasi u ytkownicy nie bÚdÈ mogli wysïaÊ na
serwer pliku, którego rozmiar bÚdzie przekraczaï tak zdefiniowany próg. Domy l-
nym rozmiarem maksymalnym sÈ 2 MB.
Skrypt nr 14: WyïÈczanie rejestrowanych
zmiennych globalnych
JÚzyk PHP oferuje przestarzaïÈ, niezalecanÈ funkcjÚ, która nieznacznie uïatwia
dostÚp do parametrów Èdañ GET i POST protokoïu HTTP Je li na przykïad Èda-
.
nie POST zawiera parametr nazwany mojparam, PHP mo e automatycznie umie-
ciÊ jego warto Ê w zmiennej nazwanej $mojparam. Dziaïanie tego mechanizmu
stwarza powa ne ryzyko dla bezpieczeñstwa aplikacji, poniewa umo liwia
u ytkownikom ustawianie dowolnych zmiennych globalnych — je li zapomnimy
zainicjalizowaÊ odpowiednie zmienne, u ytkownik zyska mo liwo Ê wpïywania
na istotne elementy naszego skryptu.
Wspomniany mechanizm mo na wyïÈczyÊ, ustawiajÈc w zmiennej register_
´globals warto Ê Off w pliku php.ini serwera:
register_globals = Off
Opisana funkcja na szczÚ cie zostaïa wyïÈczona w wersjach 4.2 i nowszych
jÚzyka PHP Waga problemu jest jednak na tyle du a, e warto to dwukrotnie
.
sprawdziÊ.
Skrypt nr 15: WïÈczanie
„magicznych cudzysïowów”
„Magiczne cudzysïowy” (ang. magic quotes) to wygodne narzÚdzie stosowane
przez administratorów serwerów do ochrony przed atakami polegajÈcymi na
wstrzykiwaniu kodu SQL-a (patrz podrozdziaï „Skrypt nr 19: Wstrzykiwanie
kodu jÚzyka SQL” w rozdziale 3.). Dziaïanie tego mechanizmu polega na po-
Konfigurowanie PHP 39
16. przedzaniu wszystkich apostrofów, cudzysïowów i lewych uko ników dodatkowym
znakiem lewego uko nika (tzw. znakiem ucieczki) we wszystkich danych zapisywa-
nych w zmiennych skryptu PHP i pochodzÈcych z formularzy HTML. W ten
sposób na przykïad ïañcuch "Ferrett's Book" zostanie przeksztaïcony w ïañcuch
"Ferrett's Book".
Mechanizm „magicznych cudzysïowów” nie jest rozwiÈzaniem idealnym, je-
li korzystamy z bazy danych MySQL — w takim przypadku nale y stosowaÊ raczej
wyspecjalizowanÈ funkcjÚ mysql_real_escape_string() — jednak generalnie
„magiczne cudzysïowy” zdajÈ egzamin. Mo na ten mechanizm wïÈczyÊ w pliku
php.ini za pomocÈ nastÚpujÈcego wyra enia:
magic_quotes_gpc = 1
Co mo e pój Ê nie po naszej my li?
Je li nie wïÈczymy mechanizmu „magicznych cudzysïowów”, bÚdziemy musieli
korzystaÊ z funkcji mysql_real_escape_string(), aby zagwarantowaÊ stosowanie
sekwencji ucieczki w wykorzystywanych danych. Je li jednak u yjemy tej funk-
cji dla danych w sytuacji, gdy mechanizm „magicznych cudzysïowów” bÚdzie
wïÈczony, ryzykowne znaki zostanÈ poprzedzone podwójnymi lewymi uko nikami
(zamiast "Ferrett's Book" otrzymamy "Ferrett's Book"). Jak widaÊ,
konsekwencja popïaca — chwila nieuwagi mo e spowodowaÊ, e tabele naszej
bazy danych bÚdÈ zawieraïy niemal wyïÈcznie lewe uko niki.
Skrypt nr 16: Ograniczanie dostÚpu PHP
do plików
Je li obawiasz siÚ wrogiego skryptu PHP uzyskujÈcego dostÚp do plików syste-
mowych (np. do pliku haseï), mo esz u yÊ ustawienia open_basedir do ograni-
czenia zbioru katalogów dostÚpnych z poziomu kodu PHP Po ustawieniu tej
.
opcji skrypt PHP nie bÚdzie mógï otwieraÊ ani modyfikowaÊ adnych plików
spoza wskazanego katalogu. Poni ej przedstawiono wiersz pliku php.ini ograni-
czajÈcy dostÚp tylko do katalogu /home/www:
open_basedir = /home/www
Istnieje mo liwo Ê zapewniania skryptom dostÚpu do wielu katalogów —
w systemie UNIX nale y je oddzielaÊ dwukropkami (:); w systemie Windows
kolejne katalogi oddzielamy rednikami (;).
UWAGA PHP domy lnie zapewnia dostÚp zarówno do wskazanego katalogu, jak i wszystkich
jego podkatalogów. Gdyby my chcieli ograniczyÊ ten dostÚp tylko do plików w okre-
lonym katalogu, na koñcu u ytej cie ki powinni my u yÊ uko nika (np. /home/www/).
40 Rozdziaï 2
17. Co mo e pój Ê nie po naszej my li?
Je li u ytkownicy muszÈ wysyïaÊ pliki na serwer, to do czasu ich przetworzenia
przez skrypt otrzymane pliki sÈ skïadowane w katalogu tymczasowym. Ponie-
wa katalog tymczasowy z reguïy dzieli spora odlegïo Ê od pozostaïych plików
PHP koniecznie musimy pamiÚtaÊ o jego uwzglÚdnieniu na li cie reprezentowanej
,
przez parametr open_basedir.
Skrypt nr 17: WyïÈczanie
obsïugi okre lonych funkcji
Przypu Êmy, e uznali my funkcjÚ exec(), która umo liwia bezpo rednie wyko-
nywanie poleceñ na serwerze z poziomu skryptów PHP za zbyt niebezpiecznÈ.
,
Okazuje siÚ, e istnieje mo liwo Ê wyïÈczania obsïugi poszczególnych funkcji
PHP (wïa nie z my lÈ o wyeliminowaniu luk w zabezpieczeniach) z zachowa-
niem mo liwo ci stosowania wszystkich pozostaïych funkcji. Poni ej przedsta-
wiono przykïad wiersza pliku php.ini wyïÈczajÈcego obsïugÚ kilku szczególnie
ryzykownych funkcji:
disable_functions = system, exec, passthru, shell_exec, proc_open
Skrypt nr 18: Dodawanie rozszerzeñ do PHP
NaprawdÚ powa ni programi ci prÚdzej czy pó niej odkrywajÈ pewne ograni-
czenia jÚzyka PHP Mimo ogromnej liczby wbudowanych funkcji i mechani-
.
zmów sam jÚzyk PHP nie oferuje rdzennych rozwiÈzañ w zakresie szyfrowania,
grafiki, dostÚpu do innych stron internetowych czy przetwarzania danych w forma-
cie XML.
Te i inne cele mo na jednak osiÈgaÊ dziÚki niezliczonym rozszerzeniom wy-
korzystujÈcym biblioteki tworzone przez niezale nych programistów i podmioty.
Kilka najbardziej przydatnych rozszerzeñ jÚzyka PHP opisano poni ej:
cURL
cURL umo liwia naszemu serwerowi PHP uzyskiwanie dostÚpu do innych
witryn internetowych, w tym wysyïanie i odbieranie informacji za po rednic-
twem swoistego protokoïu zbudowanego na bazie adresów URL. (NajczÚ ciej
korzystamy z protokoïu HTTP który umo liwia nam komunikacjÚ z innymi
,
stronami internetowymi, oraz protokoïu FTP umo liwiajÈcego nam wysyïanie
i pobieranie plików). W praktyce oznacza to, e nasz serwer mo e byÊ trak-
towany przez inne witryny jak przeglÈdarka internetowa, a pobierane strony
WWW mo emy umieszczaÊ w dowolnych zmiennych w ramach swoich
skryptów.
Konfigurowanie PHP 41
18. cURL jest niezwykle wa nym narzÚdziem dla programistów pracujÈcych nad
powa nymi sklepami internetowymi, poniewa umo liwia nam akceptowa-
nie pïatno ci kartami kredytowymi i wyceny towarów dla poszczególnych
klientów w czasie rzeczywistym. Za pomocÈ rozszerzenia cURL mo na nawiÈ-
zywaÊ poïÈczenia i wysyïaÊ dane o transakcjach na serwer innej firmy. W od-
powiedzi otrzymujemy wówczas informacje o akceptacji bÈd odrzuceniu
Èdania dokonania pïatno ci.
Mcrypt
Musiaïe kiedy co zaszyfrowaÊ? Wszystkie poufne informacje umieszczane
w ciasteczkach i sesjach powinny byÊ szyfrowane. Co wiÚcej, je li gdziekolwiek
zapisujemy co naprawdÚ warto ciowego, jak numery kart kredytowych czy
dane osobowe, z pewno ciÈ powinni my siÚ upewniÊ, e odczyt tych infor-
macji nie bÚdzie mo liwy przez zwykïy zrzut zawarto ci bazy danych. Na
szczÚ cie biblioteka Mcrypt umo liwia nam naprawdÚ skuteczne szyfrowa-
nie danych bez choÊby szczÈtkowej znajomo ci technik szyfrowania! (Sposoby
korzystania z tego rozszerzenia zostanÈ szczegóïowo omówione w podroz-
dziale „Skrypt nr 23: Szyfrowanie danych za pomocÈ rozszerzenia Mcrypt”
w rozdziale 3.).
GD
Gdyby my chcieli tworzyÊ obrazy graficzne na Èdanie lub po prostu uzy-
skiwaÊ szczegóïowe informacje o obrazach ju istniejÈcych, powinni my siÚ
zapoznaÊ z mo liwo ciami biblioteki GD. Biblioteka GD umo liwia nam pracÚ
na plikach JPEG i GIF — mo emy je tworzyÊ z my lÈ o graficznej prezentacji
rozmaitych danych (np. w formie wykresów) albo modyfikowaÊ (np. tworzÈc
miniaturki istniejÈcych obrazów).
MySQL
Podstawowa wersja rodowiska PHP w ogóle „nie wie”, jak uzyskiwaÊ do-
stÚp do baz danych. Poniewa jednak system MySQL i jÚzyk PHP sÈ jak Zan
i Jayna z popularnej kreskówki, wiÚkszo Ê serwerów WWW przystosowa-
nych do obsïugi PHP oferuje te domy lnie instalowane biblioteki systemu
MySQL, zatem wiÚkszo Ê programistów korzysta z funkcji mysql_connect(),
nie wiedzÈc, e jest ona czÚ ciÈ rozszerzenia.
Zbiór rozszerzeñ PHP jest oczywi cie du o bogatszy i obejmuje takie biblioteki
jak SOAP (zapewniajÈca dostÚp do usïug internetowych), PDF czy Verisign
Payment Pro. Na pierwszy rzut oka mo e siÚ wydawaÊ, e najlepszym rozwiÈ-
zaniem jest doïÈczanie do rodowiska PHP wszystkich rozszerzeñ, które tylko
udaïo nam siÚ odnale Ê, jednak warto mieÊ na uwadze, e ka de z nich mo e
wydïu yÊ czas inicjalizacji i stwarzaÊ dodatkowe luki w zabezpieczeniach. Co
wiÚcej, mniej popularne rozszerzenia z reguïy nie sÈ na bie Èco aktualizowane
ani rozwijane.
42 Rozdziaï 2
19. Dodawanie rozszerzeñ jÚzyka PHP
Skoro wiemy ju , co mo na zyskaÊ, instalujÈc rozszerzenia, przyjrzyjmy siÚ sa-
mem procesowi ich instalowania. W pierwszej kolejno ci nale y sprawdziÊ, czy
przypadkiem ju nie dysponujemy tym, czego szukamy.
Sprawdzanie, czy interesujÈce nas rozszerzenia nie zostaïy ju zaïadowane
Wiele serwerów WWW domy lnie instaluje najbardziej przydatne i najpopular-
niejsze rozszerzenia, zatem przed podjÚciem prób odszukania i instalacji intere-
sujÈcej nas biblioteki powinni my siÚ upewniÊ, czy nie zostaïa ju zainstalowana
i zaïadowana.
Najprostszym sposobem sprawdzenia ewentualnej obecno ci rozszerzeñ jest
wywoïanie funkcji phpinfo() (opisanej w podrozdziale „Skrypt nr 8: Odkrywa-
nie wszystkich ustawieñ PHP” we wcze niejszej czÚ ci tego rozdziaïu). ListÚ
zwróconÈ przez tÚ funkcjÚ nale y dokïadnie przejrzeÊ w poszukiwaniu naszych
bibliotek. Je li na przykïad rodowisko PHP obejmuje zainstalowane rozszerze-
nie MySQL, dane wynikowe funkcji phpinfo() bÚdÈ zawieraïy wiersz podobny
do poni szego:
mysql
MySQL Support => enabled
...
Je li uznasz, e takie rozwiÈzanie nie jest dla Ciebie, je li wyda Ci siÚ zbyt
wolne, mo esz skorzystaÊ z innych mo liwo ci.
Ka de rozszerzenie dodaje do PHP nowe funkcje — na przykïad cURL
uzupeïnia funkcjonalno Ê PHP o takie funkcje jak cURL_init() czy cURL_setopt(),
Mcrypt dodaje funkcje mcrypt_encrypt() oraz mcrypt_decrypt() itd. Przypu Êmy
jednak, e nie zainstalowano rozszerzenia Mcrypt. W takim przypadku PHP nie
ma pojÚcia o funkcji mcrypt_decrypt() i traktuje jÈ jako funkcjÚ niezdefiniowanÈ.
Mo na to wykorzystaÊ, stosujÈc funkcjÚ function_exists() jÚzyka PHP Poni ej
.
przedstawiono przykïadowy skrypt wykrywajÈcy rozszerzenie MySQL:
<?php
if (function_exists(mysql_connect)) {
print 'Wykryto rozszerzenie MySQL';
} else {
print 'Nie wykryto rozszerzenia MySQL';
}
?>
’adowanie rozszerzeñ przy pomocy administratorów zdalnych serwerów
Je li korzystamy z serwera WWW bÚdÈcego wïasno ciÈ innej firmy (tak robi
wiÚkszo Ê programistów), musimy siÚ zdaÊ na ïaskÚ administratora tego ser-
wera. Poniewa z natury rzeczy nie dysponujemy hasïem administratora, nie
Konfigurowanie PHP 43
20. mo emy instalowaÊ niezbÚdnych bibliotek samodzielnie. W takim przypadku
musimy o to poprosiÊ administratora wynajmowanego serwera. KierujÈc odpo-
wiednie zlecenie, powinni my siÚ upewniÊ, e administrator dysponuje precy-
zyjnymi informacjami; w przeciwnym razie mo e siÚ okazaÊ, e zostaïa zainsta-
lowana niewïa ciwa wersja lub wrÚcz niewïa ciwe rozszerzenie.
Niektóre firmy zrealizujÈ naszÈ pro bÚ bez najmniejszych problemów. Inne
bÚdÈ oczekiwaïy dodatkowych opïat za obciÈ anie swoich serwerów dodatko-
wymi rozszerzeniami. Jeszcze inne odpowiedzÈ: „Nasza oferta nie obejmuje ob-
sïugi dodatkowych rozszerzeñ. Ograniczamy siÚ tylko do standardowego PHP”.
Je li z jakiego powodu nie mo esz zainstalowaÊ potrzebnych rozszerzeñ,
mo esz albo spróbowaÊ poradziÊ sobie bez nich, albo zmieniÊ firmÚ obsïugujÈcÈ
serwery.
UWAGA Nawet je li korzystamy z wïasnego serwera, ale nie potrafimy prawidïowo zain-
stalowaÊ niezbÚdnych rozszerzeñ, warto zwróciÊ siÚ z pro bÈ o instalacjÚ nowych
bibliotek do pracowników wsparcia technicznego. W takim przypadku w razie nie-
powodzenia procesu instalacji technicy bÚdÈ w stanie naprawiÊ usterkÚ (przy-
najmniej teoretycznie).
Instalacja rozszerzeñ
za pomocÈ internetowego panelu sterowania
Dzier awione serwery czÚsto oferujÈ specjalne panele sterowania, za po red-
nictwem których mo emy realizowaÊ typowe zadania administracyjne (w tym
zadanie ponownego uruchomienia usïugi Apache lub restartu caïego serwera)
w oknie przeglÈdarki internetowej.
Niektóre panele sterowania oferujÈ nawet mo liwo Ê automatycznego kom-
pilowania serwera Apache i rodowiska PHP wskutek zaznaczenia pól wyboru
lub wyboru z list rozwijanych opcji reprezentujÈcych dodawane rozszerzenia.
Na przykïad WHM (popularny, choÊ do Ê trudny w obsïudze panel sterowania)
udostÚpnia opcjÚ Update Apache, która powoduje ponownÈ instalacjÚ serwera
Apache i rodowiska PHP wraz z wybranymi Èdaniami.
Je li Twój serwer nie udostÚpnia preinstalowanego panelu sterowania, z reguïy za
niewielkÈ opïatÈ mo na taki panel zainstalowaÊ ju po wdro eniu oprogramowania
serwera.
RÚczna instalacja rozszerzeñ
Ponowna kompilacja PHP jest w systemach UNIX traktowana jako ponowna in-
stalacja tego rodowiska wraz z niezbÚdnymi rozszerzeniami. Dla programistów,
którzy nie majÈ do wiadczenia w roli administratorów systemów UNIX, ponowna
kompilacja rodowiska PHP czÚsto jest powa nym wyzwaniem.
Najlepszym rozwiÈzaniem jest przystÈpienie do eksperymentów z lokalnym
serwerem Apache z dala od docelowego rodowiska pracy aplikacji interneto-
wej. Poniewa zmiany wprowadzane w konfiguracji pracujÈcego serwera mogÈ
44 Rozdziaï 2
21. doprowadziÊ do powa nych problemów, warto uprzednio sprawdziÊ, czy w razie
kïopotów mo emy liczyÊ na pomoc technicznÈ i czy zdajemy sobie sprawÚ z tego,
co mo e siÚ wydarzyÊ. Je li nie jeste my przygotowani do tego rodzaju zadañ,
powinni my siÚ zwróciÊ o pomoc do kogo bardziej kompetentnego.
Instalacja biblioteki w rodowisku PHP jest procesem dwuetapowym —
w pierwszej kolejno ci musimy zainstalowaÊ same biblioteki rozszerzeñ; drugim
krokiem jest takie skonfigurowanie rodowiska PHP, aby rozpoznawaïo te roz-
szerzenia.
Instalowanie bibliotek
Szczegóïowe kroki skïadajÈce siÚ na proces instalacji rozszerzenia w du ej mie-
rze zale È od dodawanej biblioteki. Mo na oczywi cie sformuïowaÊ ogólne za-
sady rzÈdzÈce tym procesem, jednak przed przystÈpieniem do instalacji zawsze
nale y siÚ zapoznaÊ z podrÚcznikami dostÚpnymi na stronie biblioteki oraz
wszystkimi plikami README. Czytelnicy zainteresowani szczegóïowym wyja-
nieniem pracy systemu Linux, w tym technik kompilowania oprogramowania,
powinni siÚgnÈÊ po ksiÈ kÚ Briana Warda zatytuïowanÈ How Linux Works (No
Starch Press, 2004)1.
W poni szych punktach opisano ogólne kroki skïadajÈce siÚ na proces insta-
lacji bibliotek:
1. Zalogowanie na serwerze jako administrator lub u ytkownik z prawem
instalacji nowych programów.
2. Pobranie archiwum biblioteki i umieszczenie go w katalogu gïównym
serwera. Wpisanie w wyszukiwarce Google nazwy biblioteki i sïowa PHP
(np. mcrypt php) z reguïy pozwoli bïyskawicznie odnale Ê stronÚ domowÈ
interesujÈcego nas rozszerzenia, gdzie bÚdÈ dostÚpne odpowiednie pliki
ródïowe. Pliki ródïowe najczÚ ciej sÈ archiwizowane i kompresowane
za pomocÈ narzÚdzi Gzip i tar (z my lÈ o oszczÚdzaniu przestrzeni),
zatem pobrany plik najprawdopodobniej bÚdzie nosiï nazwÚ
nazwaplikubiblioteki.tar.gz.
3. Wypakowanie zawarto ci pobranego archiwum. Archiwum tar jest
w istocie zbiorem plików i katalogów. Caïe to archiwum jest nastÚpnie
kompresowane za pomocÈ pakietu Gzip, stÈd rozszerzenie .gz jest
dopisywane na samym koñcu. Oznacza to, e plik .tar.gz mo na
traktowaÊ tak samo jak plik .zip, z tÈ ró nicÈ, e plik .tar.gz powstaje
w dwóch etapach i z wykorzystaniem dwóch ró nych programów.
Okazuje siÚ jednak, e nie musimy wprost uruchamiaÊ obu tych narzÚdzi,
poniewa program tar w wersji GNU „wie”, jak korzystaÊ z narzÚdzia de-
kompresujÈcego. Wypakowanie zawarto ci archiwum tar wymaga wydania
polecenia tar zxvf nazwaplikubiblioteki.tar.gz w wierszu poleceñ. W wyniku
tego polecania otrzymamy listÚ wypakowanych wszystkich plików i katalogów.
1
Polskie wydanie: Jak dziaïa Linux, Helion, 2005 — przyp. tïum.
Konfigurowanie PHP 45
22. WiÚkszo Ê archiwów tworzy drzewo poni ej katalogu najwy szego poziomu,
zatem wïa nie takiej struktury powinni my oczekiwaÊ.
4. Przej cie do katalogu biblioteki za pomocÈ polecenia cd nazwakatalogu.
Je li nie pamiÚtamy lub w ogóle przeoczyli my nazwÚ z poprzedniego
kroku, z reguïy mo emy przyjÈÊ, e nazwa tego katalogu bÚdzie odpowiadaïa
nazwie samej biblioteki — np. cd cURL. (Warto pamiÚtaÊ, e wielko Ê znaków
w nazwach katalogów jest istotna, zatem cURL to nie to samo co CURL).
5. Uruchomienie polecenia configure, aby sprawdziÊ, czy wszystkie
skïadniki niezbÚdne do zakoñczenia instalacji na danym komputerze
zostaïy rozpakowane. Z uwagi na ró norodno Ê dostÚpnych systemów
UNIX instalacja pakietów w tych systemach wymaga pewnej wiedzy
i do wiadczenia. Na szczÚ cie polecenie configure w wiÚkszo ci przypadków
potrafi wykonaÊ caïÈ tÚ „brudnÈ robotÚ” za nas, automatycznie analizujÈc
ustawienia serwera i stosujÈc warto ci umo liwiajÈce prawidïowy przebieg
instalacji programu. Wpisz w wierszu poleceñ wyra enie ./configure.
Niektóre rozszerzenia wymagajÈ do wïa ciwego dziaïania stosowania dodat-
kowych flag za poleceniem configure. Na przykïad rozszerzenie Mcrypt
wymaga od nas wydania polecenia ./configure --disable-nls --disable-
posix-threads, poniewa tylko w ten sposób mo na zagwarantowaÊ peïnÈ
zgodno Ê z serwerem Apache. Poniewa dodatkowe opcje zale È od samej
biblioteki, warto siÚ zapoznaÊ z przewodnikami i plikami README, gdzie
mo na znale Ê precyzyjnÈ dokumentacjÚ wszystkich niezbÚdnych flag kon-
figuracyjnych.
6. Kompilacja i instalacja danego pakietu. W systemach UNIX standardowym
narzÚdziem kompilujÈcym i instalujÈcym pakiety jest make. Najpierw musimy
wydaÊ wïa nie polecenie make, aby skompilowaÊ nasz pakiet. Na ekranie
zostanÈ wy wietlone wykonywane polecenia, które skïadajÈ siÚ na proces
kompilacji. NastÚpnie powinni my u yÊ polecenia make check celem
wykonania na tym pakiecie automatycznych testów (niektóre pakiety nie
zawierajÈ testów, czym jednak nie powinni my siÚ przejmowaÊ). I wreszcie
nale y wpisaÊ polecenie make install, aby ostatecznie zainstalowaÊ
rozszerzenie. Tak e proces instalacji bÚdzie dokumentowany na ekranie.
Po wykonaniu polecenia make install proces instalacji rozszerzenia
bÚdzie zakoñczony.
7. Utworzenie skryptu phpinfo(). Ach, pewnie my laïe , e to ju koniec,
prawda? Przykro mi, ale opisana powy ej procedura prowadzi tylko do
instalacji rozszerzenia na serwerze. Musimy jeszcze ponownie zainstalowaÊ
rodowisko PHP i wskazaÊ, gdzie znajduje siÚ nowe rozszerzenie i jak z niego
korzystaÊ.
Za pomocÈ funkcji phpinfo() (patrz podrozdziaï „Skrypt nr 8: Odkrywanie
wszystkich ustawieñ PHP” we wcze niejszej czÚ ci tego rozdziaïu) mo emy
uzyskaÊ kompletny wykaz ustawieñ serwera. Gdzie na poczÈtku pierwszej
46 Rozdziaï 2
23. strony danych wygenerowanych przez tÚ funkcjÚ mo na znale Ê sekcjÚ za-
tytuïowanÈ Configure Command i zawierajÈcÈ tajemniczÈ listÚ elementów
podobnÈ do poni szej:
'./configure' '--with-apxs=/usr/local/apache/bin/apxs' '--with-xml'
´'--enable-bcmath' '--enable-calendar' '--enable-ftp' '--enable-magic-
´quotes' '--with-mysql' '--enable-discard-path' '--with-pear' '--enable-
´sockets' '--enable-track-vars' '--enable-versioning' '--with-zlib'
Gdyby my chcieli ponownie zainstalowaÊ rodowisko PHP w stanie, w któ-
rym znajduje siÚ obecnie, dysponowaliby my gotowym poleceniem (a przy-
najmniej prawie gotowym). W pierwszej kolejno ci nale y usunÈÊ apostrofy
wokóï polecenia configure, aby otrzymaÊ polecenie w postaci:
./configure '--with-apxs=/usr/local/apache/bin/apxs' '--with-xml'
´'--enable-bcmath' '--enable-calendar' '--enable-ftp' '--enable-magic-
´quotes' '--with-mysql' '--enable-discard-path' '--with-pear' '--enable-
´sockets' '--enable-track-vars' '--enable-versioning' '--with-zlib'
Celem tego kroku jest zachowanie ju zainstalowanych rozszerzeñ — je li
dodajemy rozszerzenie GD, nie chcemy przecie przy tej okazji utraciÊ in-
nych, zainstalowanych wcze niej rozszerzeñ. Gotowe polecenie configure
nale y skopiowaÊ do pliku tekstowego i dopisaÊ na jego koñcu odpowiednie
wyra enia --with. Je li na przykïad dodajemy do serwera rozszerzenie
Mcrypt, powinni my dopisaÊ wyra enie --with-mcrypt. Wïa ciwy parametr
--with z reguïy mo na znale Ê w dokumentacji instalowanego rozszerzenia.
UWAGA Je li zastÈpimy oryginalnÈ strukturÚ katalogów zawartÈ w pliku tar i umie cimy
naszÈ bibliotekÚ w folderze innym ni domy lny, bÚdziemy musieli dodaÊ do flagi
--with cie kÚ, aby rodowisko PHP mogïo tÚ bibliotekÚ odnale Ê. W powy szym
przykïadzie taka sytuacja miaïa miejsce w przypadku biblioteki apxs (Apache Exten-
sion Tool Synopsis), gdzie flaga --with-apxs=/usr/local/apache/bin/apxs okre laïa,
e wspomniana biblioteka jest skïadowana w katalogu /usr/local/apache/bin/apxs.
8. Pobranie i rozpakowanie plików ródïowych nowej dystrybucji PHP
oraz przej cie do katalogu, w którym umieszczono rozpakowane pliki.
Kod ródïowy PHP mo na rozpakowaÊ dokïadnie tak, jak wcze niej
rozpakowali my kod ródïowy biblioteki. Je li dysponujesz ju
utworzonym wcze niej drzewem kodu PHP, mo esz je wykorzystaÊ,
jednak w takim przypadku koniecznie u yj polecenia make clean.
9. Skopiowanie polecenia configure utworzonego wcze niej w pliku
tekstowym, wklejenie go w wierszu poleceñ i naci niÚcie klawisza Enter,
aby je wykonaÊ. W ten sposób ponownie skonfigurujemy rodowisko
PHP z nowÈ bibliotekÈ i wszystkimi dotychczasowymi bibliotekami.
Konfigurowanie PHP 47
24. 10. Kompilacja kodu ródïowego PHP. Nale y wykonaÊ kolejno polecenia
make i make install. Warto siÚ przygotowaÊ na dïugie oczekiwanie, a
wymienione polecenia odpowiednio skompilujÈ i zainstalujÈ wszystkie
komponenty PHP.
UWAGA W razie dokonania jakichkolwiek zmian w plikach .ini (podobnych do tych poka-
zanych we wcze niejszej czÚ ci tego rozdziaïu) wprowadzone modyfikacje mogÈ
zostaÊ nadpisane ustawieniami domy lnymi w czasie ponownego kompilowania
PHP. W takim przypadku warto do tych ustawieñ wróciÊ, aby mieÊ pewno Ê, e
nasza konfiguracja nie zostaïa zmieniona.
11. Ponowne uruchomienie serwera Apache. Nale y wykonaÊ polecenie
apachectl graceful.
12. Przetestowanie rodowiska PHP. W pierwszej kolejno ci warto uruchomiÊ
skrypt Witaj wiecie!, aby sprawdziÊ, czy wïa nie zainstalowane rodowisko
dziaïa wïa ciwie. NastÚpnie dobrze jest poeksperymentowaÊ z wywoïaniami
rozmaitych funkcji definiowanych przez biblioteki, aby mieÊ pewno Ê,
e tak e nowe biblioteki nie stwarzajÈ niespodziewanych problemów.
Co mo e pój Ê nie po naszej my li?
Liczba problemów, które mogÈ wystÈpiÊ w czasie kompilacji, jest tak dïuga, e
omówienie ich wszystkich jest niemal niemo liwe. Chocia wiele bïÚdów jest
do Ê skomplikowanych, a znaczna ich czÚ Ê jest ci le zwiÈzana z poszczególnymi
bibliotekami (i tym samym wymaga bardzo specjalistycznych porad), trzy typo-
we problemy wystÚpujÈ niemal zawsze.
Pierwszym powa nym problemem, z którym mo emy siÚ zetknÈÊ, jest brak
zainstalowanych pakietów wytwarzania oprogramowania w pobranej dystrybu-
cji lub wersji. W takim przypadku bÚdziemy potrzebowali kompilatora jÚzyka C
i rozmaitych wersji „deweloperskich” wielu innych bibliotek potrzebnych do
skompilowania kodu.
Po drugie, mo emy stanÈÊ przed konieczno ciÈ skonfigurowania rodowiska
PHP z wykorzystaniem parametru --with definiujÈcego wprost cie kÚ do doïÈ-
czanej biblioteki, np. --with-mcrypt=/usr/lib/mcrypt.
Innym powszechnym ródïem problemów sÈ le skonfigurowane pakiety bi-
bliotek rozszerzeñ. Jak ju wspomniano, bibliotekÚ Mcrypt nale y skonfiguro-
waÊ z flagami --disable-nls --disable-posix-threads; w przeciwnym razie stoso-
wanie tego pakietu mo e prowadziÊ nawet do awarii serwera Apache. Tak e
inne biblioteki wymagajÈ do prawidïowego funkcjonowania w rodowisku PHP
i na serwerze Apache pewnych dodatkowych zabiegów. Szczegóïowych infor-
macji na ten temat nale y szukaÊ na stronach internetowych z najczÚ ciej zada-
wanymi pytaniami, stronach pomocy systemowej oraz w plikach README.
48 Rozdziaï 2