SlideShare ist ein Scribd-Unternehmen logo
1 von 24
Downloaden Sie, um offline zu lesen
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¹!
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
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
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
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
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
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?
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
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
<?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
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
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
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
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
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
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
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
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
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
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
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
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
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
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

Weitere ähnliche Inhalte

Was ist angesagt?

Windows XP PL. Ilustrowany przewodnik
Windows XP PL. Ilustrowany przewodnikWindows XP PL. Ilustrowany przewodnik
Windows XP PL. Ilustrowany przewodnikWydawnictwo Helion
 
mod_rewrite. Podręcznik administratora
mod_rewrite. Podręcznik administratoramod_rewrite. Podręcznik administratora
mod_rewrite. Podręcznik administratoraWydawnictwo Helion
 
Flash MX. Ćwiczenia zaawansowane
Flash MX. Ćwiczenia zaawansowaneFlash MX. Ćwiczenia zaawansowane
Flash MX. Ćwiczenia zaawansowaneWydawnictwo Helion
 
PHP5. Bezpieczne programowanie. Leksykon kieszonkowy
PHP5. Bezpieczne programowanie. Leksykon kieszonkowyPHP5. Bezpieczne programowanie. Leksykon kieszonkowy
PHP5. Bezpieczne programowanie. Leksykon kieszonkowyWydawnictwo Helion
 
Flash MX. ActionScript. Leksykon kieszonkowy
Flash MX. ActionScript. Leksykon kieszonkowyFlash MX. ActionScript. Leksykon kieszonkowy
Flash MX. ActionScript. Leksykon kieszonkowyWydawnictwo Helion
 
.Net. Najpilniej strzeżone tajemnice
.Net. Najpilniej strzeżone tajemnice.Net. Najpilniej strzeżone tajemnice
.Net. Najpilniej strzeżone tajemniceWydawnictwo Helion
 
.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanieWydawnictwo Helion
 
I ty też możesz mieć swoje dane w cache
I ty też możesz mieć swoje dane w cacheI ty też możesz mieć swoje dane w cache
I ty też możesz mieć swoje dane w cacheJaroslaw Palka
 
101 zabezpieczeń przed atakami w sieci komputerowej
101 zabezpieczeń przed atakami w sieci komputerowej101 zabezpieczeń przed atakami w sieci komputerowej
101 zabezpieczeń przed atakami w sieci komputerowejWydawnictwo Helion
 
Hack I.T. Testy bezpieczeństwa danych
Hack I.T. Testy bezpieczeństwa danychHack I.T. Testy bezpieczeństwa danych
Hack I.T. Testy bezpieczeństwa danychWydawnictwo Helion
 
Anti-Hacker Tool Kit. Edycja polska
Anti-Hacker Tool Kit. Edycja polskaAnti-Hacker Tool Kit. Edycja polska
Anti-Hacker Tool Kit. Edycja polskaWydawnictwo Helion
 
Czy aby na pewno jest Pan człowiekiem. Użyteczność kodów CAPTCHA 2.
Czy aby na pewno jest Pan człowiekiem. Użyteczność kodów CAPTCHA 2.Czy aby na pewno jest Pan człowiekiem. Użyteczność kodów CAPTCHA 2.
Czy aby na pewno jest Pan człowiekiem. Użyteczność kodów CAPTCHA 2.Symetria
 
Linux. Niezbędnik programisty
Linux. Niezbędnik programistyLinux. Niezbędnik programisty
Linux. Niezbędnik programistyWydawnictwo Helion
 

Was ist angesagt? (17)

Windows XP PL. Ilustrowany przewodnik
Windows XP PL. Ilustrowany przewodnikWindows XP PL. Ilustrowany przewodnik
Windows XP PL. Ilustrowany przewodnik
 
mod_rewrite. Podręcznik administratora
mod_rewrite. Podręcznik administratoramod_rewrite. Podręcznik administratora
mod_rewrite. Podręcznik administratora
 
Flash MX. Ćwiczenia zaawansowane
Flash MX. Ćwiczenia zaawansowaneFlash MX. Ćwiczenia zaawansowane
Flash MX. Ćwiczenia zaawansowane
 
JavaScript dla każdego
JavaScript dla każdegoJavaScript dla każdego
JavaScript dla każdego
 
PHP5. Bezpieczne programowanie. Leksykon kieszonkowy
PHP5. Bezpieczne programowanie. Leksykon kieszonkowyPHP5. Bezpieczne programowanie. Leksykon kieszonkowy
PHP5. Bezpieczne programowanie. Leksykon kieszonkowy
 
Bezpieczny komputer w domu
Bezpieczny komputer w domuBezpieczny komputer w domu
Bezpieczny komputer w domu
 
Flash MX. ActionScript. Leksykon kieszonkowy
Flash MX. ActionScript. Leksykon kieszonkowyFlash MX. ActionScript. Leksykon kieszonkowy
Flash MX. ActionScript. Leksykon kieszonkowy
 
Po prostu Red Hat Linux 8
Po prostu Red Hat Linux 8Po prostu Red Hat Linux 8
Po prostu Red Hat Linux 8
 
.Net. Najpilniej strzeżone tajemnice
.Net. Najpilniej strzeżone tajemnice.Net. Najpilniej strzeżone tajemnice
.Net. Najpilniej strzeżone tajemnice
 
.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie.NET Framework 2.0. Zaawansowane programowanie
.NET Framework 2.0. Zaawansowane programowanie
 
I ty też możesz mieć swoje dane w cache
I ty też możesz mieć swoje dane w cacheI ty też możesz mieć swoje dane w cache
I ty też możesz mieć swoje dane w cache
 
101 zabezpieczeń przed atakami w sieci komputerowej
101 zabezpieczeń przed atakami w sieci komputerowej101 zabezpieczeń przed atakami w sieci komputerowej
101 zabezpieczeń przed atakami w sieci komputerowej
 
Hack I.T. Testy bezpieczeństwa danych
Hack I.T. Testy bezpieczeństwa danychHack I.T. Testy bezpieczeństwa danych
Hack I.T. Testy bezpieczeństwa danych
 
Anti-Hacker Tool Kit. Edycja polska
Anti-Hacker Tool Kit. Edycja polskaAnti-Hacker Tool Kit. Edycja polska
Anti-Hacker Tool Kit. Edycja polska
 
Czy aby na pewno jest Pan człowiekiem. Użyteczność kodów CAPTCHA 2.
Czy aby na pewno jest Pan człowiekiem. Użyteczność kodów CAPTCHA 2.Czy aby na pewno jest Pan człowiekiem. Użyteczność kodów CAPTCHA 2.
Czy aby na pewno jest Pan człowiekiem. Użyteczność kodów CAPTCHA 2.
 
Podstawy kryptografii
Podstawy kryptografiiPodstawy kryptografii
Podstawy kryptografii
 
Linux. Niezbędnik programisty
Linux. Niezbędnik programistyLinux. Niezbędnik programisty
Linux. Niezbędnik programisty
 

Andere mochten auch

Excel. Praktyczne zastosowania w biznesie
Excel. Praktyczne zastosowania w biznesieExcel. Praktyczne zastosowania w biznesie
Excel. Praktyczne zastosowania w biznesieWydawnictwo Helion
 
Visual Basic .NET. Bazy danych. Księga eksperta
Visual Basic .NET. Bazy danych. Księga ekspertaVisual Basic .NET. Bazy danych. Księga eksperta
Visual Basic .NET. Bazy danych. Księga ekspertaWydawnictwo Helion
 
Windows XP PL. Księga eksperta
Windows XP PL. Księga ekspertaWindows XP PL. Księga eksperta
Windows XP PL. Księga ekspertaWydawnictwo Helion
 
File Systems
File SystemsFile Systems
File Systemskendersec
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzkeGaldoMedia
 

Andere mochten auch (6)

Excel. Praktyczne zastosowania w biznesie
Excel. Praktyczne zastosowania w biznesieExcel. Praktyczne zastosowania w biznesie
Excel. Praktyczne zastosowania w biznesie
 
Visual Basic .NET. Bazy danych. Księga eksperta
Visual Basic .NET. Bazy danych. Księga ekspertaVisual Basic .NET. Bazy danych. Księga eksperta
Visual Basic .NET. Bazy danych. Księga eksperta
 
Systemy plików w Linuksie
Systemy plików w LinuksieSystemy plików w Linuksie
Systemy plików w Linuksie
 
Windows XP PL. Księga eksperta
Windows XP PL. Księga ekspertaWindows XP PL. Księga eksperta
Windows XP PL. Księga eksperta
 
File Systems
File SystemsFile Systems
File Systems
 
Extjs & netzke
Extjs & netzkeExtjs & netzke
Extjs & netzke
 

Ähnlich wie PHP. Praktyczne skrypty, które oszczędzą Twój czas

PHP. 101 praktycznych skryptów. Wydanie II
PHP. 101 praktycznych skryptów. Wydanie IIPHP. 101 praktycznych skryptów. Wydanie II
PHP. 101 praktycznych skryptów. Wydanie IIWydawnictwo Helion
 
PHP i MySQL. Dynamiczne strony WWW. Szybki start
PHP i MySQL. Dynamiczne strony WWW. Szybki startPHP i MySQL. Dynamiczne strony WWW. Szybki start
PHP i MySQL. Dynamiczne strony WWW. Szybki startWydawnictwo Helion
 
Po prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowanePo prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowaneWydawnictwo Helion
 
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie IIPHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie IIWydawnictwo Helion
 
The Shellcoders Handbook. Edycja polska
The Shellcoders Handbook. Edycja polskaThe Shellcoders Handbook. Edycja polska
The Shellcoders Handbook. Edycja polskaWydawnictwo Helion
 
Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programistyWydawnictwo Helion
 
Visual Studio 2005. Programowanie z Windows API w języku C++
Visual Studio 2005. Programowanie z Windows API w języku C++Visual Studio 2005. Programowanie z Windows API w języku C++
Visual Studio 2005. Programowanie z Windows API w języku C++Wydawnictwo Helion
 
Hack Proofing Linux. Edycja polska
Hack Proofing Linux. Edycja polskaHack Proofing Linux. Edycja polska
Hack Proofing Linux. Edycja polskaWydawnictwo Helion
 
PHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIPHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
Profesjonalne programowanie. Część 1. Zrozumieć komputer
Profesjonalne programowanie. Część 1. Zrozumieć komputerProfesjonalne programowanie. Część 1. Zrozumieć komputer
Profesjonalne programowanie. Część 1. Zrozumieć komputerWydawnictwo Helion
 
Hack Proofing Your Web Applications. Edycja polska
Hack Proofing Your Web Applications. Edycja polskaHack Proofing Your Web Applications. Edycja polska
Hack Proofing Your Web Applications. Edycja polskaWydawnictwo Helion
 
C++. Wykorzystaj potęgę aplikacji graficznych
C++. Wykorzystaj potęgę aplikacji graficznychC++. Wykorzystaj potęgę aplikacji graficznych
C++. Wykorzystaj potęgę aplikacji graficznychWydawnictwo Helion
 
ASP.NET 3.5 dla programistów PHP
ASP.NET 3.5 dla programistów PHPASP.NET 3.5 dla programistów PHP
ASP.NET 3.5 dla programistów PHPWydawnictwo Helion
 

Ähnlich wie PHP. Praktyczne skrypty, które oszczędzą Twój czas (20)

PHP. 101 praktycznych skryptów. Wydanie II
PHP. 101 praktycznych skryptów. Wydanie IIPHP. 101 praktycznych skryptów. Wydanie II
PHP. 101 praktycznych skryptów. Wydanie II
 
PHP i MySQL. Dynamiczne strony WWW. Szybki start
PHP i MySQL. Dynamiczne strony WWW. Szybki startPHP i MySQL. Dynamiczne strony WWW. Szybki start
PHP i MySQL. Dynamiczne strony WWW. Szybki start
 
Po prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowanePo prostu PHP. Techniki zaawansowane
Po prostu PHP. Techniki zaawansowane
 
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie IIPHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II
PHP i MySQL. Dynamiczne strony WWW. Szybki start. Wydanie II
 
The Shellcoders Handbook. Edycja polska
The Shellcoders Handbook. Edycja polskaThe Shellcoders Handbook. Edycja polska
The Shellcoders Handbook. Edycja polska
 
PHP w mgnieniu oka
PHP w mgnieniu okaPHP w mgnieniu oka
PHP w mgnieniu oka
 
Asembler. Podręcznik programisty
Asembler. Podręcznik programistyAsembler. Podręcznik programisty
Asembler. Podręcznik programisty
 
Mandrake Linux
Mandrake LinuxMandrake Linux
Mandrake Linux
 
Visual Studio 2005. Programowanie z Windows API w języku C++
Visual Studio 2005. Programowanie z Windows API w języku C++Visual Studio 2005. Programowanie z Windows API w języku C++
Visual Studio 2005. Programowanie z Windows API w języku C++
 
Hack Proofing Linux. Edycja polska
Hack Proofing Linux. Edycja polskaHack Proofing Linux. Edycja polska
Hack Proofing Linux. Edycja polska
 
Win32ASM. Asembler w Windows
Win32ASM. Asembler w WindowsWin32ASM. Asembler w Windows
Win32ASM. Asembler w Windows
 
PHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie IIIPHP. Programowanie. Wydanie III
PHP. Programowanie. Wydanie III
 
J2ME. Praktyczne projekty
J2ME. Praktyczne projektyJ2ME. Praktyczne projekty
J2ME. Praktyczne projekty
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
Profesjonalne programowanie. Część 1. Zrozumieć komputer
Profesjonalne programowanie. Część 1. Zrozumieć komputerProfesjonalne programowanie. Część 1. Zrozumieć komputer
Profesjonalne programowanie. Część 1. Zrozumieć komputer
 
Hack Proofing Your Web Applications. Edycja polska
Hack Proofing Your Web Applications. Edycja polskaHack Proofing Your Web Applications. Edycja polska
Hack Proofing Your Web Applications. Edycja polska
 
Linux. Kurs. Wydanie II
Linux. Kurs. Wydanie IILinux. Kurs. Wydanie II
Linux. Kurs. Wydanie II
 
C++. Wykorzystaj potęgę aplikacji graficznych
C++. Wykorzystaj potęgę aplikacji graficznychC++. Wykorzystaj potęgę aplikacji graficznych
C++. Wykorzystaj potęgę aplikacji graficznych
 
ASP.NET 3.5 dla programistów PHP
ASP.NET 3.5 dla programistów PHPASP.NET 3.5 dla programistów PHP
ASP.NET 3.5 dla programistów PHP
 
Flash i PHP5. Podstawy
Flash i PHP5. PodstawyFlash i PHP5. Podstawy
Flash i PHP5. Podstawy
 

Mehr von Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 
Serwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanieSerwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanieWydawnictwo Helion
 

Mehr von Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 
Serwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanieSerwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanie
 

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