You are on page 1of 25

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

PHP i MySQL.
Tworzenie sklepw
internetowych. Wydanie II
Autorzy: Daniel Bargie, Sebastian Marek
ISBN: 83-7361-939-9
Format: B5, stron: 512

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl

Liczba firm oferujcych towary w internecie stale wzrasta. Taki sposb przedstawienia
oferty umoliwia dotarcie do szerszego grona klientw i pozwala na znaczn redukcj
kosztw prowadzenia dziaalnoci handlowej. Rozwj handlu elektronicznego spowodowa
zwikszenie zainteresowania usugami zwizanymi z tworzeniem sklepw internetowych.
Programici, ktrzy otrzymuj takie zlecenie, zazwyczaj korzystaj z dwch bezpatnych
aplikacji: PHP i MySQL. Cigle rozwijany i rozbudowywany PHP jest jednym
z najpopularniejszych jzykw skryptowych interpretowanych po stronie serwera.
Jego najnowsza wersja, oznaczona numerem 5, to w peni obiektowe rodowisko
stosowane przez twrcw dynamicznych aplikacji WWW odwoujcych si do baz
danych. Funkcj zaplecza bazodanowego spenia baza MySQL prosta i wydajna.
Zbudowanie funkcjonalnego i bezpiecznego sklepu internetowego to ciekawe wyzwanie
dla programisty. Jeli chcesz si z nim zmierzy, ksika PHP i MySQL. Tworzenie
sklepw internetowych. Wydanie II jest dla Ciebie idealn lektur. Znajdziesz w niej
wszystkie informacje, jakich potrzebujesz, by zaprojektowa i stworzy sklep
internetowy, korzystajc z jzyka PHP 5, bazy danych MySQL i dodatkowych
mechanizmw opisanych w kolejnych rozdziaach ksiki.
Opracowanie koncepcji sklepu internetowego
Nowe moliwoci PHP 5
Oddzielenie kodu PHP od HTML z zastosowaniem szablonw Smarty
Wykorzystanie funkcji z biblioteki PEAR
Mechanizmy obsugi sesji i plikw cookie
Zabezpieczanie aplikacji
Przygotowanie projektu sklepu
Katalog produktw i koszyk
Modu zarzdzania klientami i zamwieniami
Obsuga patnoci elektronicznych
Przyczy si do rozwoju e-biznesu stwrz wasny sklep internetowy

Podzikowania ...................................................................................................................7
Wstp ..................................................................................................................................9

Rozdzia 1. Koncepcja sklepu internetowego ..................................................... 13


Cz publiczna ................................................................................................................13
Cz administracyjna ......................................................................................................14

Rozdzia 2. Migracja z PHP4 do PHP5 ............................................................... 17


Nowy model obiektowy ...................................................................................................17
Konstruktory oraz destruktory klas ............................................................................18
Dostp do metod oraz waciwoci obiektw ............................................................21
Klasy i metody abstrakcyjne ......................................................................................25
Dziedziczenie po interfejsach ....................................................................................27
Obsuga XML poprzez rozszerzenie DOM .........................................................................28
adowanie i zapisywanie obiektw XML .................................................................28
Klasy obiektw rozszerzenia DOM ...........................................................................32
Wyraenia XPath .......................................................................................................37
Wyjtki .............................................................................................................................41
Klasa Exception .........................................................................................................42
Zgaszanie i przechwytywanie wyjtkw ..................................................................43
Klasy potomne klasy Exception .................................................................................47
Rozwizania przyjte w aplikacji sklepu internetowego .................................................49
Model obiektowy .......................................................................................................49
Korzystanie z dokumentw XML ..............................................................................54
Wyjtki w aplikacji ....................................................................................................54

Rozdzia 3. Oddzielenie kodu PHP od kodu HTML .............................................. 57


System szablonw Smarty ...............................................................................................58
Instalacja systemu szablonw Smarty .......................................................................60
Struktura katalogowa .................................................................................................63
Parametry konfiguracyjne ..........................................................................................64
Praca ze Smarty ..........................................................................................................70
Metody obiektw klasy Smarty .................................................................................75
Zasady tworzenia szablonw TPL .............................................................................78
Transformacje XSL .........................................................................................................93
Czym jest XSL ...........................................................................................................95
Rozwizania przyjte w aplikacji sklepu internetowego ...............................................104

D:\Roboczy\!!!!MA~1\PHPIMY~1.WYD\__spis treci.doc

PHP i MySQL. Tworzenie sklepw internetowych

Rozdzia 4. PEAR ........................................................................................... 109


Czym jest, a czym nie jest PEAR? .................................................................................109
Biblioteka skryptw PHP .........................................................................................110
Zarzdzanie pakietami i rozpowszechnianie ich ......................................................110
PHP Foundation Classes ..........................................................................................110
Pakiet DB komunikacja z baz danych .....................................................................111
Konfiguracja poczenia ..........................................................................................113
czenie i rozczanie si z baz danych .................................................................114
Wysyanie zapyta do bazy danych .........................................................................115
Pobieranie zwrconych danych ...............................................................................117
Szybkie pobieranie danych ......................................................................................121
Pobieranie dodatkowych informacji ........................................................................127
Pakiet Log obsuga dziennika zdarze ......................................................................129
Tworzenie obiektw dziennika zdarze ...................................................................130
Pakiet Mail wysyanie wiadomoci e-mail ................................................................132
Pakiet QuickForm obsuga formularzy .....................................................................136
Pierwszy formularz ..................................................................................................136
Formularz z ycia wzity .........................................................................................138
Filtry i reguy walidacji ............................................................................................140
Wartoci domylne i stae ........................................................................................142
Przetwarzanie danych ..............................................................................................143
Elementy formularza ................................................................................................145
Zmiana wygldu formularza ....................................................................................161
Integracja z systemem szablonw Smarty ...............................................................166
Pakiet QuickForm_Controller formularze zaawansowane .......................................176
Typowy formularz ...................................................................................................177
Formularz w formie wizarda ....................................................................................184
Formularz z zakadkami ...........................................................................................192
Pakiet Benchmark pomiar wydajnoci skryptw ......................................................198
Benchmark_Timer ...................................................................................................198
Benchmark_Profiler .................................................................................................201
Benchmark_Iterate ...................................................................................................204

Rozdzia 5. Mechanizmy autoryzacji i sesje ..................................................... 207


Sposoby autoryzacji uytkownika w aplikacji ...............................................................207
Identyfikacja uytkownika .......................................................................................207
Zabezpieczenie sesji .......................................................................................................220
Standardowy mechanizm obsugi sesji ....................................................................220
Wasny mechanizm obsugi sesji .............................................................................220
Wykorzystanie cookies ..................................................................................................226
Do czego mona wykorzysta cookies ....................................................................227
Bezpieczestwo cookies ..........................................................................................228
Sposb uycia ..........................................................................................................228
Wykorzystanie nagwkw HTTP .................................................................................230

Rozdzia 6. Bezpieczestwo ............................................................................ 237


Bezpieczestwo systemu operacyjnego oraz serwera WWW ........................................237
Cel instalacji serwera ...............................................................................................238
Tylko potrzebne usugi ............................................................................................238
Bezpieczna konfiguracja serwera WWW ................................................................239
Bezpieczestwo wykorzystywanego oprogramowania ..................................................239
Instalacja PHP jako pliku wykonywalnego CGI .....................................................239
Instalacja PHP jako moduu Apachea ....................................................................242
Opcja register_globals .............................................................................................242

D:\Roboczy\!!!!MA~1\PHPIMY~1.WYD\__spis treci.doc

Spis treci

5
Raportowanie o bdach ...........................................................................................244
Ukrywanie PHP .......................................................................................................245
Aktualizacje .............................................................................................................245
Bezpieczestwo wasnej aplikacji ..................................................................................246
Brak walidacji danych ..............................................................................................246
Nieskuteczne mechanizmy kontroli dostpu i autoryzacji .......................................247
Nieprawidowe zarzdzanie kontami oraz sesjami uytkownikw .........................249
Ataki typu Cross-Site Scripting (XSS) ....................................................................250
Wstrzykiwanie kodu ................................................................................................251
Przechowywanie niezabezpieczonych danych ........................................................253
Bezpieczestwo bazy danych .........................................................................................253
Zarzdzanie hasami .......................................................................................................254

Rozdzia 7. Projekt aplikacji ........................................................................... 255


Wykorzystywane narzdzia ............................................................................................256
DBDesigner 4 projektowanie bazy danych .........................................................257
Aqua Data Studio .....................................................................................................270
Eclipse ......................................................................................................................272
Zaoenia projektowe .....................................................................................................281
Obsuga sownikw ..................................................................................................281
Wersje jzykowe ......................................................................................................286
Interfejs uytkownika .....................................................................................................299
Nagwek strony ......................................................................................................300
Menu gwne sklepu ................................................................................................300
Cz centralna sklepu .............................................................................................301
Stopka strony ...........................................................................................................302
Struktura bazy danych ....................................................................................................303
Uytkownicy i klienci sklepu ...................................................................................304
Produkty ...................................................................................................................306
Kategorie ..................................................................................................................308
Producenci ................................................................................................................309
Zamwienia ..............................................................................................................310
Sowniki ...................................................................................................................313
Biblioteka zdj .......................................................................................................314
Wersje jzykowe ......................................................................................................316
Budowa moduowa i struktura aplikacji .........................................................................317
Struktura katalogowa ...............................................................................................318
Konfiguracja serwisu ...............................................................................................320
Przetwarzanie da .................................................................................................320
FCKeditor ................................................................................................................322

Rozdzia 8. Katalog produktw ....................................................................... 327


Asortyment i produkty ...................................................................................................327
Asortyment sklepu klasa Item .............................................................................327
Produkty dostpne w ofercie sklepu klasa Produkt ...............................................346
Produkty w promocji ......................................................................................................364
Obsuga promocji klasa Special ..........................................................................365
Zarzdzanie promocjami ..........................................................................................367
Kategorie produktw ......................................................................................................367
Struktura katalogowa klasa Catalog ....................................................................368
Wywietlanie struktury katalogowej ........................................................................369

D:\Roboczy\!!!!MA~1\PHPIMY~1.WYD\__spis treci.doc

PHP i MySQL. Tworzenie sklepw internetowych

Rozdzia 9. Koszyk ......................................................................................... 371


Sesja jako podstawowy mechanizm realizacji koncepcji koszyka .................................372
Koszyk klasa Basket ..................................................................................................373
Operacje na produktach w koszyku .........................................................................374
Operacje na sumarycznych wartociach cen produktw w koszyku .......................375
Mechanizm obsugi koszyka ..........................................................................................375
Kontroler BasketPage ..............................................................................................376
Kontroler ChangeCountPage ...................................................................................378
Kontroler ClearBasketPage ......................................................................................379
Akcje kontrolera obsuga zdarze .......................................................................380

Rozdzia 10. Rejestracja klientw i zarzdzanie nimi .......................................... 383


Koncepcja uytkownikw aplikacji ...............................................................................384
Klasy uytkownika User oraz CustomUser ........................................................384
Zoone operacje na obiekcie uytkownika .............................................................386
Mechanizm rejestracji nowego uytkownika .................................................................387
Pierwszy etap rejestracji formularze rejestracyjne .............................................387
Drugi etap rejestracji aktywacja konta uytkownika ..........................................406

Rozdzia 11. Obsuga zamwie ........................................................................ 409


Realizacja koncepcji zamwie .....................................................................................409
Warunki zoenia zamwienia .................................................................................409
Modu zamwienia klasa Order ..........................................................................411
Zarzdzanie zamwieniami .....................................................................................412
Realizacja patnoci przez bank Inteligo ............................................................................413
Wykonywanie patnoci z bankiem Inteligo ............................................................414
Uruchomienie patnoci Pac z Inteligo ..............................................................415
Realizacja patnoci przez bank mBank .........................................................................415
Uruchomienie patnoci typu mTransfer .................................................................415
Wykonywanie przeleww przez mTransfer ............................................................419
Patnoci elektroniczne karty patnicze .....................................................................422
Usuga Bezpieczne z@kupy firmy Polcard .............................................................423
Usuga ePatnoci firmy eCard ................................................................................427

Dodatek A Przygotowanie rodowiska pracy ................................................... 439


Dodatek B Instalacja i konfiguracja sklepu internetowego .............................. 479
Skorowidz ..................................................................................... 489

D:\Roboczy\!!!!MA~1\PHPIMY~1.WYD\__spis treci.doc

Rozdzia 5.

Sposoby autoryzacji uytkownika


w aplikacji
Identyfikacja uytkownika
W przypadku bardziej zoonych aplikacji, a za tak z pewnoci mona uzna sklep
internetowy, kwestia kontroli poczyna uytkownikw staje si bardzo wana. Pewne
elementy aplikacji musz zosta zabezpieczone przed dostpem osb nieupowanionych,
a inne bdziemy chcieli udostpni tylko wybranym uytkownikom. Musimy zatem
w jaki sposb sprawdzi, kto korzysta z naszej aplikacji i co mu tak naprawd wolno
w niej zrobi. Jedynym sposobem na to jest implementacja skutecznego, bezpiecznego
i szybkiego mechanizmu identyfikacji uytkownika. Nie bez znaczenia s rwnie koszty
wdroenia takiego systemu.
Sprbujemy przedstawi rne sposoby implementacji mechanizmw autoryzacji oraz
ich podstawowe wady i zalety.

Prosta kontrola dostpu


Zabezpieczenie dostpu do pojedynczych stron nie stanowi wikszego problemu. W tym
celu wystarczy stworzy prosty formularz oraz skrypt PHP, ktry sprawdzi dane wpisane
do niego. Przykadowy skrypt moe wyglda tak jak na listingu 5.1.

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc

(10-08-06)

207

208

PHP i MySQL. Tworzenie sklepw internetowych

Listing 5.1. Skrypt zabezpieczajcy dostp do strony WWW przy uyciu mechanizmu prostej
kontroli dostpu
<?php
if (!isSet($_POST['username']) && !isSet($_POST['password'])) {
//Wywietl formularz autoryzacyjny
?>
<h1>Prosz si zalogowa!</h1>
<form method="post">
<table border="1">
<tr><td>Uytkownik:</td><td><input type="text" name="username"></td></tr>
<tr><td>Haso:</td><td><input type="password" name="password"></td></tr>
<tr><td colspan="2" align="center"><input type="submit" value="valoguj si">
</td></tr>
</table>
</form>
<?php
}elseif ($_POST['username']=="sebastian" && $_POST['password']=="tajnehaslo") {
//Autoryzacja przebiega pomylnie
?>
<h1>Witamy Ci serdecznie!</h1>
Autoryzacja przebiega pomylnie i uzyskae dostp do strony chronionej.
<?php
} else {
//Bdna nazwa uytkownika lub haso
?>
<h1>Przepraszamy!</h1>
ie masz dostpu do tej strony.
<?php
}
?>

Zasada dziaania takiego skryptu jest nastpujca:


t jeeli uytkownik nie poda nazwy uytkownika oraz hasa, na stronie

wywietlony zostanie formularz autoryzacyjny,


t jeeli uytkownik poda z kombinacj danych uytkownik-haso,

wywietlona zostanie informacja o wystpieniu bdu w trakcie autoryzacji,


t jeeli podana nazwa uytkownika oraz haso bd prawidowe, wywietlona

zostanie zabezpieczona tre strony.


Zalety:
t Prostota i szybko implementacji.

Wady:
t Zabezpieczona zostaje w ten sposb tylko jedna strona. Jeeli chcielibymy

zabezpieczy wiksz liczb stron przed ciekawskimi oczami internautw,


taki mechanizm trzeba by umieci na kadej z nich.

208 (10-08-06)

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc

Rozdzia 5. Mechanizmy autoryzacji i sesje

209

t Nazwa uytkownika i jego haso s na stae umieszczone w kodzie skryptu.

Stwarza to kilka problemw oraz niebezpieczestw. W przypadku


gdy uytkownik chciaby zmieni haso, musiaby si zwrci do autora
skryptu lub osoby majcej dostp do jego rde. Pomijajc kwesti sposobu
przekazywania nowego hasa midzy tymi dwoma osobami, sytuacja
jest bardzo niezrczna i kopotliwa. Napisanie osobnego skryptu (albo
samomodyfikowalnego skryptu) bdzie ju przerostem formy nad treci.
Najwikszym problemem jest ograniczenie liczby uytkownikw, ktrzy
maj dostp do strony. Mona oczywicie dopisa w skrypcie nastpnych
uytkownikw oraz ich hasa, jednak dodatkowo skomplikuje to sposb
autoryzacji.
t Haso jest zapisane oraz przesyane do serwera w oryginalnej postaci.

Oznacza to, e w bardzo prosty sposb mona je przechwyci i wykorzysta


w celu nieautoryzowanego dostpu do strony.

Zaawansowana kontrola dostpu


Aby uproci mechanizmy zarzdzania uytkownikami majcymi dostp do zabezpieczonych stron, naley pomyle o przeniesieniu informacji na ich temat do jakiego
zewntrznego rda. Modyfikacja danych w skrypcie, w ktrym jednoczenie umieszczone s mechanizmy autoryzacyjne, nie jest dobrym pomysem. Prociej i skuteczniej zrealizujemy taki mechanizm, gdy nazwy uytkownikw oraz ich hasa bdziemy
przechowywa w osobnym pliku (listing 5.2), a do tego stworzymy osobny skrypt oraz
stron WWW, za pomoc ktrych bdziemy mieli moliwo dodawania i usuwania
uytkownikw oraz zmiany ich hase. Informacje takie moemy przechowywa w pliku
tekstowym lub bazie danych.
Listing 5.2. Przykadowa struktura pliku tekstowego z nazwami uytkownikw oraz ich hasami
# azwa uytkownika oraz haso oddzielone s od siebie znakiem dwukropka
sebastian:haso1
daniel:haso2
magda:haso3
beata:haso4

Mechanizm przeszukiwania oraz edycji pliku tekstowego jest dosy zoony. Naley
pamita, aby zabezpieczy si przed jednoczesnym dostpem wielu uytkownikw
do tego pliku, w przeciwnym razie mog oni zniszczy oryginaln struktur pliku.
Przechowywanie nazw uytkownikw oraz ich hase w pliku tekstowym sprawdza si
w przypadku, gdy nie przekroczy on 100 wierszy (czyli bdzie przechowywa informacj o maksymalnie 100 uytkownikach). W przypadku wikszej liczby uytkownikw
szybko dziaania skryptu znaczco spadnie. W takiej sytuacji naley zdecydowa si
na przechowywanie tych informacji w bazie danych.
Sam skrypt autoryzacyjny nie bdzie o wiele bardziej skomplikowany ni ten, w ktrym hasa s przechowywane w pliku tekstowym, natomiast w zamian uzyskamy duo
szybszy mechanizm autoryzacji. W przypadku sklepu internetowego taki mechanizm

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)

209

210

PHP i MySQL. Tworzenie sklepw internetowych

przechowywania danych jest najlepszy i najbezpieczniejszy, a jednoczenie zapewnia


najwiksz wydajno. Dodatkowo otrzymujemy wiksz kontrol nad tym, kto, kiedy
i w jakich warunkach dokona autoryzacji oraz do jakich informacji uzyska dostp.

Przykad 5.1
Tworzc prost aplikacj autoryzujc:
1. W pierwszej kolejnoci musimy utworzy odpowiedni struktur bazy danych.

Odpowiedni skrypt SQL znajdziemy na listingu 5.3.


Listing 5.3. Skrypt tworzcy struktur tabeli Users na serwerze baz danych MySQL
CREATE DATABASE baza_danych;
USE baza_danych;
CREATE TABLE Users
(
USR_Id
UI FO_Email
USR_Password
primary key (USR_Id)
) type = InnoDB;

varchar(32)
varchar(96)
varchar(32)

not null
not null

GRA T SELECT I SERT UPDATE DELETE O user.* TO 'user'@'localhost' IDE TIFIED BY


'tajnehaslo';

Struktura utworzonej tabeli zostaa pokazana na rysunku 5.1.


Rysunek 5.1.
Struktura tabeli
z danymi
uytkownikw

W tabeli bdziemy przechowywa nastpujce dane:


t USR_Id unikalna nazwa uytkownika (cig 32 znakw, nie moe by pusty),
t UINFO_Email

adres e-mail uytkownika (cig 96 znakw, nie moe

by pusty),
t USR_Password

haso uytkownika (cig 32 znakw, nie moe by pusty).

2. Aplikacj przygotujemy na podstawie struktury aplikacji, ktr poznalimy

w rozdziale 4., rozbudowanej o obsug bazy danych. Struktura ta znajduje si


na CD-ROM-ie doczonym do ksiki w katalogu materialy/rozdzial05/
struktura_aplikacji. Skopiujmy j na serwer WWW, tak aby katalog www
by katalogiem rootwww dla serwera.
Nowoci jest tutaj plik config/dbmanager.inc.php, w ktrym znajduje si
definicja klasy DBManager obsugujcej poczenia z baz danych MySQL.
Obsuga odbywa si przy wykorzystaniu pakietu PEAR::DB (patrz rozdzia 4.
PEAR).

210 (10-08-06)

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc

Rozdzia 5. Mechanizmy autoryzacji i sesje

211

Parametry poczenia z baz danych stanowi stae DB_HOST (host bazy danych),
DB_NAME (nazwa bazy danych), DB_USERNAME (nazwa uytkownika bazy danych),
DB_PASSWD (haso dostpu do bazy danych). Wszystkie te stae zdefiniowane s
w pliku config/define.inc.php.
Inicjalizacj poczenia z baz danych przeprowadzimy w gwnym pliku
aplikacji www/index.php. Wykorzystamy do tego metod init(), ktr
wywoamy statycznie:
DBManager::init()

3. Przeprowadzenie caego procesu autoryzacji wymaga bdzie dwch funkcji:

jednej obsugujcej transakcje zapewniajce zachowanie integralnoci


wprowadzanych informacji do bazy danych (listing 5.4) oraz drugiej
przeprowadzajcej sam proces autoryzacji. W tym celu stworzymy klas
uytkownika, dziki ktrej cay proces stanie si przejrzysty i atwy
w zarzdzaniu. Pierwsz z tych funkcji uczynimy metod klasy DBManager,
natomiast drug czci klasy User.
Listing 5.4. Klasa DBManager wraz z metod obsugujc transakcje
<?php
class DBManager extends PEAR {
private static $dataBaseConnection = null;
private function __construct() {}
public function init() {
if (DB::isError(self::$dataBaseConnection = DB::connect(self::DS Init())))
throw new DBError(self::$dataBaseConnection->getMessage()
self::$dataBaseConnection->getCode());

}
public function Query($queryString) {
if (self::$dataBaseConnection) {
if (DB::isError($result = self::$dataBaseConnection->Query($queryString)))
throw new DBError($result->getMessage() $result->getCode());
return $result;
}
}
public function DS Init() {
//Doczenie obsugi klasy PEAR-DB
require_once('DB.php');
return 'mysql://' . DB_USER AME . ':' . DB_PASSWD . '@tcp(' . DB_HOST . ')
/' . DB_ AME;

}
/**
* Obsuga transakcji bazodanowych
*
* @access public
* @param string $type Rodzaj transakcji:
*
- BEGI
- rozpoczcie transakcji
*
- COMMIT - zatwierdzenie transakcji
*
- ROLLBACK - zwinicie transakcji
* @return mixed TRUE
- jeli funkcja wykonaa si prawidowo
*
zgoszenie wyjtku - jeli w trakcie wykonywania funkcji
*
wystpi bd
*/

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)

211

212

PHP i MySQL. Tworzenie sklepw internetowych


public function Transaction($type) {
//Doczenie obsugi klasy PEAR-DB
require_once('DB.php');

}
?>

$sqlquery = $type;
if (DB::isError($result = self::$dataBaseConnection->Query($sqlquery))) {
throw new DBError('Przesanie zapytania SQL nie powiodo si!');
} else {
if (self::$dataBaseConnection->affectedRows() < 0) {
throw new DBError('Odebranie wyniktw wykonania zapytania SQL nie
powiodo si!');
}
}
return TRUE;

Do obsugi transakcji MySQL wymaga stworzenia tabel typu InnoDB. Proces instalacji oraz konfiguracji MySQL-a pod ktem obsugi tego typu tabel zosta omwiony
w dodatku A w podrozdziale rodowisko pracy Windows i Linux.

Argumentem metody Transaction() jest tak naprawd jedno z trzech polece


systemu transakcji: BEGIN, COMMIT oraz ROLLBACK, ktre kolejno rozpoczynaj
transakcj, potwierdzaj j oraz cofaj stan bazy danych do stanu sprzed
rozpoczcia transakcji. W przypadku wystpienia bdu w trakcie wysyania
zapytania SQL do bazy danych funkcja zgosi wyjtek DBError z komunikatem
Przesanie zapPtania Sie nie powiodo siie, w przypadku bdu wykonania
zapytania SQL funkcja zgosi wyjtek DBError z komunikatem Odebranie
wPnikw wPkonania zapPtania Sie nie powiodo siie, a jeeli cay proces
przebiegnie prawidowo, funkcja zwrci warto TRUE.
O wyjtkach i sposobie obsugi bdw pisalimy w podrozdziale Wyjtki rozdziau 2.
Migracja z PHP 4 do PHP 5.

Dobrze jest zadeklarowa swoj klas wyjtku i przechwytywa tylko wasne wyjtki,
a na przechwycenie wyjtkw globalnych zezwoli jdru aplikacji. Dlatego te zaoylimy, i wyjtki globalne bd nosi nazw Error i dziedziczy bd wszystkie waciwoci i metody po klasie Exception, wyjtki generowane przez klas DBManager
bd obiektami klasy DBError (dziedziczcej po klasie Error), a wyjtki generowane
w trakcie procesu autoryzacji uytkownika (opisanego poniej) bd obiektami klasy
AuthError (rwnie dziedziczcej po klasie Error).
4. Przejdmy teraz do stworzenia klasy User. Jej definicja znajduje si w pliku

config/user.inc.php. Bdzie ona mie podobne waciwoci jak pola w tabeli


Users oraz metody pozwalajce na szybkie ustawianie oraz zwracanie ich

wartoci (listing 5.5).

212 (10-08-06)

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc

Rozdzia 5. Mechanizmy autoryzacji i sesje

213

Listing 5.5. Klasa User


<?php
class User {
private $_Id;
private $_DS ;
private $_Password;
private $_Email;
//Konstruktor klasy
public function __construct($userdata = ULL){}
//Metody ustawiajce wartoci waciwoci klasy
public function setId($id){}
public function setDS ($dsn){}
public function setPassword($password){}
public function setEmail($email){}
//Metody zwracajce wartoci waciwoci klasy
public function getId(){}
public function getDS (){}
public function getPassword(){}
public function getEmail(){}
//Metoda autoryzujca uytkownika
public function autorize ($userLogin $userPassword) {}
//Metoda logujca uytkownika
public function Logon($login $password) {}
}
?>

Parametrem konstruktora klasy jest tablica asocjacyjna, w ktrej klucze tablicy przyjmuj wartoci pl z tabeli Users naszej bazy danych (listing 5.6). W trakcie tworzenia
nowego obiektu tej klasy ustawimy na podstawie zawartoci tej tablicy wartoci waciwoci klasy.
Listing 5.6. Konstruktor klasy User
public function __construct($userdata = ULL) {
foreach ($userdata as $key => $value) {
switch (strtolower($key)) {
case 'usr_id':
$this->setId($value);
break;
case 'uinfo_email':
$this->setEmail($value);
break;
}
}
$this->setDS (DS Init());
}

Typowe metody ustawiajce oraz zwracajce warto danej waciwoci klasy bd


wyglda tak jak na listingu 5.7.

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)

213

214

PHP i MySQL. Tworzenie sklepw internetowych

Listing 5.7. Metoda ustawiajca oraz zwracajca warto waciwo Id klasy


//Metody ustawiajce wartoci waciwoci klasy
public function setId($id) {
if ($id <> ULL) {
$this->_Id = $id;
return TRUE;
} else { return FALSE; }
}
//Metody zwracajce wartoci waciwoci klasy
public function getId() { return $this->_Id; }

5. Sercem klasy jest tak naprawd metoda autorize() (listing 5.8). Jej argumentami
s kolejno nazwa uytkownika ($usereogin) oraz haso ($userPassword).

Cay proces autoryzacji przeprowadzamy w ramach jednej transakcji, zatem


pierwsz czynnoci, jak naley wykona, bdzie jej rozpoczcie:
DBManager::Transaction('BEGI ')

Listing 5.8. Metoda autorize() rozpoczcie transakcji


<?php
public function autorize ($userLogin, $userPassword)
{
//Rozpoczcie transakcji
DBManager::Transaction('BEGI ');
//Sprawd czy istnieje konto uytkownika
$sqlquery = "SELECT * FROM Users WHERE Users.USR_Id = '$userLogin'";
$result = DBManager::Query($sqlquery);
//Pobranie wyniktw zapytania
if ($user = &$result->fetchRow(DB_FETCHMODE_ASSOC)) {
if ($user['USR_Password'] == md5($userPassword)) {
DBManager::Transaction('COMMIT');
return TRUE;
}
}
//Odwoanie transakcji
DBManager::Transaction('ROLLBACK');
throw new AuthError('Logowanie nieudane - Uytkownik lub/i haso niepoprawne!');
}
?>

Aby niepotrzebnie nie pobiera z bazy wszystkich danych, w kolejnym kroku


sprawdzimy, czy uytkownik, ktry prbuje dokona autoryzacji, w ogle
istnieje:
$sqlquery = "SELECT * FROM Users WHERE Users.USR_Id = '$userLogin'";
$result = DBManager::Query($sqlquery);

W przypadku wystpienia jakiegokolwiek bdu w trakcie procesu autoryzacji


naley pamita o zwiniciu transakcji. Bez wzgldu na to, czy w trakcie
transakcji wystpi jaki bd, czy te nie, zawsze naley j zakoczy albo
pomylnie instrukcj COMMIT, ktra dopiero zapisze wszystkie zmiany w bazie
danych, albo niepomylnie instrukcj ROeeBACK, ktra przywrci baz danych
do stanu sprzed rozpoczcia transakcji.

214 (10-08-06)

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc

Rozdzia 5. Mechanizmy autoryzacji i sesje

215

W przypadku gdy transakcja nie zostanie jawnie zakoczona instrukcj COMMIT lub
ROeeBACK, serwer bazy danych po czasie okrelonym w pliku konfiguracyjnym sam
zakoczy transakcj, przywracajc baz danych do stanu sprzed jej rozpoczcia.

Pusty wynik przesanego zapytania oznacza, e takiego uytkownika nie ma w bazie


danych. Generujemy zatem wyjtek klasy AuthError z komunikatem eogowanie nieudane - UPtkownik lubui haso niepoprawnee i koczymy proces autoryzacyjny
niepowodzeniem:
//Odwoanie transakcji
DBManager::Transaction('ROLLBACK');
throw new AuthError('Logowanie nieudane - Uytkownik lub/i haso niepoprawne!');

W przypadku gdy uytkownik znajduje si w bazie danych, sprawdzamy zgodno


wprowadzonego przez niego hasa. Jeeli haso jest zapisane w bazie danych w oryginalnej postaci (czego nie powinno si robi), wystarczy zwyke porwnanie cigw,
jednak w przypadku gdy haso znajduje si w bazie danych w postaci zaszyfrowanej,
musimy skorzysta z odpowiedniego algorytmu, ktry pozwoli zaszyfrowa cig znakw podany przez logujcego si uytkownika.
Zalecamy stosowanie funkcji szyfrujcych przy przechowywaniu hase uytkownikw.
Szczeglnie skuteczne s funkcje md5() oraz crPpt(), ktrych odszyfrowanie jest
praktycznie niemoliwe. Jeli uytkownik zapomni hasa do swojego konta, jedynym
rozwizaniem jest wygenerowanie nowego. MySQL, zapisujc haso uytkownika do
bazy danych, ju domylnie korzysta z algorytmu MD5.

Gdy nazwa uytkownika oraz jego haso s poprawne, sytuacja jest prosta koczymy proces autoryzacji sukcesem, zwracajc warto TRUE, i zakaczamy transakcj
instrukcj COMMIT. T cz metody autorize() przedstawia listing 5.9.
Listing 5.9. Sposb obsugi pomylnej autoryzacji uytkownika
if ($user['USR_Password'] == md5($userPassword)) {
DBManager::Transaction('COMMIT');
return TRUE;
}

6. Pozostaje zatem wykorzysta w praktyce dopiero co stworzon metod.


Zaimplementujemy j w metodzie eogon() tej samej klasy (listing 5.10).
Listing 5.10. Metoda Logon() klasy User
//Metoda logujca uytkownika
public function Logon($login $password) {
self::autorize($login $password);
//Pobranie danych zautoryzowanego uytkownika
$sqlquery = "SELECT * FROM users WHERE usr_id='$login'";
$result = DBManager::Query($sqlquery);

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)

215

216

PHP i MySQL. Tworzenie sklepw internetowych

if ($userdata = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
//Utworzenie obiektu User i zalogowanie uytkownika
$currentUser = new User($userdata);
return $currentUser;
} else {
throw new Error('Pobranie danych nie powiodo si!');
}

Jeeli wykonanie metody przebiegnie bez problemw, na podstawie informacji pobranych z bazy danych tworzymy nowy obiekt uytkownika i zwracamy go. W przeciwnym
razie generujemy wyjtek klasy Error (listing 5.10).
7. Ostatnim etapem naszego przykadu bdzie stworzenie strony WWW

umoliwiajcej przeprowadzenie procesu autoryzacji uytkownika. Skrypt


z listingu 5.11 znajduje si rwnie w pliku www/logon.php, a szablony
potrzebne do wywietlenia zawartoci strony w plikach smartydirs/templates/
logon.tpl oraz smartydirs/templates/logon_finished.tpl.
Listing 5.11. Skrypt zabezpieczajcy dostp do strony WWW przy uyciu mechanizmu autoryzacji
opartej na bazie danych MySQL
<?php
require_once('PEAR.php');
require_once('DB.php');
require('../config/user.inc.php');
class AuthError extends Error {}
if (!isSet($_POST['username']) && !isSet($_POST['password'])) {
//Wywietl formularz autoryzacyjny
$smarty->display('logon.tpl');
} elseif (isSet($_POST['username']) && isSet($_POST['password'])) {
try {
//Prtba nawizania poczenia z baz danych
if (PEAR::isError(DB::connect(DBManager::DS Init()))) {
throw new Error('dbconnectionerror');
}
User::Logon($_POST['username'] $_POST['password']);
//Autoryzacja przebiega pomylnie
$smarty->assign('title' 'Witamy Ci serdecznie!');
$smarty->assign('message' 'Autoryzacja przebiega pomylnie i uzyskae dostp
do strony chronionej.');
} catch (AuthError $err) {
$smarty->assign('title' 'Przepraszamy!');
$smarty->assign('message' 'Dostp do tej strony zosta zablokowany.<br/>' .
$err->getMessage());
}
$smarty->display('logon_finished.tpl');
}
?>

216 (10-08-06)

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc

Rozdzia 5. Mechanizmy autoryzacji i sesje

217

Zalety:
t nazwa uytkownika i haso przechowywane s poza skryptem (albo w osobnym

pliku tekstowym, albo w bazie danych),


t moliwo zdefiniowania nieograniczonej iloci uytkownikw,
t atwy sposb implementacji zarzdzania uytkownikami,
t moliwo zapisu zaszyfrowanego hasa,
t moliwo gromadzenia wikszej ilo informacji o uytkownikach.

Wady:
t w ten sposb cigle zostaje zabezpieczona pojedyncza strona,
t aby zabezpieczy wiksz liczb stron, naley znaczco rozbudowa

przedstawiony mechanizm,
t w przypadku uycia pliku tekstowego znaczce spowolnienie wykonywania

skryptu przy wikszej liczbie uytkownikw.

Podstawowa kontrola dostpu po stronie serwera


Istniej rwnie mechanizmy oparte na protokole HTTP pozwalajce zaimplementowa
podstawow kontrol dostpu po stronie serwera (ang. basic authentication). Implementacj takiego mechanizmu mona wykona na dwa sposoby:
t poprzez odpowiednio napisany skrypt PHP,
t poprzez umieszczenie pliku o nazwie .htaccess w katalogu, w ktrym

umieszczone bd chronione pliki (listing 5.12).


Listing 5.12. Przykadowa zawarto pliku .htaccess wymagana do obsugi mechanizmu podstawowej
autoryzacji po stronie serwera
AuthType Basic
Auth ame "Domena testowa"
AuthUserFile G:\Praca\ProjektyCVS\test\www\.htpasswd
require valid-user

Aby byo moliwe korzystanie z plikw .htaccess, naley wczeniej odpowiednio


zmodyfikowa plik konfiguracyjny serwera WWW. W przypadku serwera Apache wystarczy umieci w dyrektywie <DirectorPD opcj AllowOverride AuthConfig lub
odpowiednio zmodyfikowa ju istniejcy wpis.
Z podstawowej kontroli dostpu po stronie serwera Apache mona korzysta po
zainstalowaniu moduu mod_auth.

Dziaanie tego mechanizmu wyglda nastpujco:


t uytkownik prosi o wywietlenie strony zabezpieczonej mechanizmem,
t serwer zwraca do przegldarki danie przedstawienia si uytkownika,

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)

217

218

PHP i MySQL. Tworzenie sklepw internetowych


t przegldarka wywietla okno dialogowe (rysunek 5.2), w ktrym uytkownik

podaje nazw uytkownika oraz haso,

Rysunek 5.2. Okno autoryzacyjne wywietlane przez przegldark Internet Explorer


oraz Mozilla Firefox przy mechanizmie podstawowej kontroli dostpu
t dane przesyane s do serwera i tam weryfikowane,
t efektem pomylnej autoryzacji jest uzyskanie dostpu do chronionych stron.
Aby wygenerowa plik z hasami dla uytkownikw, naley skorzysta z programu
htpasswd (w systemie Windows znajduje si on w podkatalogu bin katalogu, w ktrym zosta zainstalowany serwer Apache). Przykadowe wykorzystanie programu
wyglda nastpujco:
htpasswd -c .htpasswd Proofek

Pierwszy parametr -c informuje program o tym, e ma zosta stworzony nowy


plik, do ktrego zostan zapisane informacje o uytkowniku i hale, drugi parametr
okrela nazw pliku, a trzeci parametr nazw dodawanego uytkownika. Po uruchomieniu program poprosi jeszcze o wpisanie hasa dla podanego uytkownika.

Zalety:
t prostota i szybko implementacji,
t moliwo zabezpieczenia caej struktury katalogw,
t w przypadku wykorzystania pliku .htaccess przerzucenie na serwer WWW

caego mechanizmu autoryzacji oraz sposobu przechowywania danych


z informacjami o uytkownikach i ich hasach.
Wady:
t haso przesyane jest w postaci oryginalnej (niezaszyfrowanej),
t brak moliwoci wybirczego chronienia pojedynczych stron,
t w przypadku wykorzystania pliku .htaccess wymagane jest uycie osobnego

narzdzia do zarzdzania uytkownikami lub napisanie wasnego skryptu


wspomagajcego ten proces.

218 (10-08-06)

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc

Rozdzia 5. Mechanizmy autoryzacji i sesje

219

Chroniona kontrola dostpu po stronie serwera


Chroniona kontrola dostpu po stronie serwera (ang. digest authentication) jest duo
bezpieczniejszym mechanizmem. Cay mechanizm autoryzacji przebiega dokadnie
w taki sam sposb jak w przypadku podstawowej kontroli dostpu po stronie serwera.
Rnica polega na tym, e hasa przesyane s do serwera w postaci zakodowanej algorytmem MD5 (rysunek 5.3). Zawarto pliku .htaccess przedstawia listing 5.13.

Rysunek 5.3. Okno autoryzacyjne wywietlane przez przegldark Internet Explorer


oraz Mozilla Firefox przy mechanizmie chronionej kontroli dostpu
Listing 5.13. Przykadowa zawarto pliku .htaccess wymagana do obsugi mechanizmu chronionej
autoryzacji po stronie serwera
AuthType Digest
Auth ame "Test"
AuthDigestFile /www/.htdigest
require valid-user

Z chronionej kontroli dostpu po stronie serwera Apache mona korzysta po zainstalowaniu moduu mod_auth_digest.

Aby wygenerowa plik z hasami dla uytkownikw, naley skorzysta programu


htdigest (w systemie Windows znajduje si on w podkatalogu bin katalogu, w ktrym
zosta zainstalowany serwer Apache). Przykadowe wykorzystanie programu wyglda
nastpujco:
htdigest -c .htdigest "Domena testowa" Proofek

Pierwszy parametr -c informuje program o tym, e ma zosta stworzony nowy


plik, do ktrego zostan zapisane informacje o uytkowniku, nazwie domeny i hale,
drugi parametr okrela nazw pliku, trzeci parametr nazw domeny, a czwarty nazw
dodawanego uytkownika. Po uruchomieniu program poprosi jeszcze o wpisanie hasa
dla podanego uytkownika.

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)

219

220

PHP i MySQL. Tworzenie sklepw internetowych

Zabezpieczenie sesji
Protok HTTP jako protok bezstanowy nie pozwala na przekazywanie informacji
pomidzy poszczeglnymi stronami internetowymi. Z tego wanie wzgldu w PHP
(poczwszy od wersji 4.0) zaimplementowano obsug tzw. sesji. Sam mechanizm
obsugi sesji opiera si przede wszystkim na unikalnym identyfikatorze sesji, tzw. SID.
W momencie gdy uytkownik po raz pierwszy kontaktuje si z serwerem, tworzy on
unikalny identyfikator sesji i przesya go razem z dan stron z powrotem do uytkownika. Identyfikator ten jest zazwyczaj zapisywany w pliku cookie na lokalnym dysku
twardym komputera uytkownika. W trakcie trwania sesji istnieje moliwo przechowywania na serwerze informacji, do ktrych mona odwoywa si podczas danej sesji.
Kiedy uytkownik wysya kade nastpne danie do serwera WWW, przekazuje do
niego jednoczenie swj identyfikator sesji. Na jego podstawie aplikacja analizuje wszystkie dane powizane z tym identyfikatorem i odsya je wraz z dan stron do uytkownika. Sytuacja taka powtarza si do momentu zakoczenia sesji. Po zakoczeniu
sesji wszystkie informacje w z ni powizane s kasowane.

Standardowy mechanizm obsugi sesji


W wikszoci przypadkw mechanizm obsugi sesji wbudowany w PHP jest w zupenoci wystarczajcy. Dane dotyczce sesji przechowywane s w plikach tekstowych
zapisywanych w miejscu okrelonym w pliku php.ini (opcja session.save_path).
Domylnie jest to oglnie dostpny katalog tymczasowy (np. /tmp). Nie jest to jednak
miejsce bezpieczne, gdy kady moe uzyska dostp do danych przechowywanych
w tych plikach.

Wasny mechanizm obsugi sesji


Napisanie wasnego mechanizmu obsugi sesji i zapisywanie danych sesyjnych w bazie
danych moe znaczco zwikszy bezpieczestwo caego systemu. Dodatkowo uzyskujemy moliwo implementacji wasnych funkcji w tym mechanizmie, tj. np. ledzenie liczby uytkownikw aktualnie odwiedzajcych sklep; czasu, jaki kady uytkownik spdza w sklepie; stron, ktre uytkownik w danym momencie oglda, itp.
Wykorzystanie bazy danych do przechowywania danych sesji rozwizuje rwnie
problem, jaki wystpuje w momencie, gdy serwis przechowywany jest na kilku serwerach jednoczenie z zastosowaniem rwnowaenia obcienia (ang. load balancing).
W takiej sytuacji standardowy mechanizm obsugi sesji nie nadaje si do uycia.
Aby zaimplementowa wasny mechanizm obsugi sesji, musimy:
t zaprojektowa oraz stworzy odpowiedni struktur tabel w bazie danych

(listing 5.14),

220 (10-08-06)

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc

Rozdzia 5. Mechanizmy autoryzacji i sesje

221

Listing 5.14. Skrypt tworzcy tabel active_session


USE Sklep;
CREATE TABLE active_session
(
SESS_Id
SESS_Value
SESS_LastUpdate
primary key (SESS_Id)
) type = InnoDB;

varchar(32)
text
timestamp

not null

t okreli mechanizm obsugi sesji w pliku php.ini,


t napisa zestaw funkcji obsugujcych mechanizmy sesji,
t zarejestrowa ten zestaw funkcji jako obsugujcy mechanizmy sesji,
t doczy definicj klasy do strony, na ktrej chcemy zaimplementowa wasny

mechanizm obsugi sesji.


Tabela przechowujca dane sesji musi przynajmniej przechowywa informacje na temat
identyfikatora sesji, danych w niej zarejestrowanych oraz czasu jej ostatniej aktualizacji.
Opcja konfiguracyjna odpowiedzialna za uaktywnienie danego mechanizmu obsugi sesji
nosi nazw session.save_handler. Moe ona przyj wartoci:
t files (warto domylna) sesje obsugiwane przez wewntrzny mechanizm

PHP, dane sesyjne zapisywane s w plikach tekstowych,


t user zewntrzny mechanizm obsugi sesji,
t mm sesje obsugiwane przez wewntrzny mechanizm PHP, dane sesyjne

zapisywane s w pamici wspdzielonej (ang. shared memory).


Warto tej opcji mona ustawi bezporednio w pliku php.ini lub te przy wykorzystaniu funkcji ini_set():
ini_set('session.save_handler' 'user');

Pozostaje tylko napisa zestaw funkcji, w ktrych zaimplementujemy mechanizmy


obsugi sesji. W tym celu stworzymy odpowiedni klas (listing 5.15) z metodami:
t _open() metoda, ktra zostanie wywoana w momencie rozpoczcia nowej

sesji lub wznowienia ju rozpocztej. Musi mie dwa argumenty: ciek


dostpu do miejsca, gdzie dane sesji bd przechowywane, oraz nazw pliku
sesji. Obie wartoci ustawia si przy wykorzystaniu opcji session.save_path
oraz session.name. Dla nas jednak nie bd miay one adnego znaczenia,
poniewa dane sesji bdziemy przechowywa w bazie danych. Funkcja ta
powinna zwraca warto logiczn TRUE lub FAeSE. W przypadku gdy wczeniej
nie nawizywalimy poczenia z nasz baz danych, w tej wanie metodzie
powinnimy to zrobi.

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)

221

222

PHP i MySQL. Tworzenie sklepw internetowych


t _close() metoda, ktra zostanie wywoana w momencie zakoczenia sesji.
Nie ma ona adnych argumentw oraz podobnie jak metoda _open() powinna
zwrci warto logiczn TRUE lub FAeSE. Uyjemy tej metody do kontrolowanego
wywoania metody _gc() odpowiedzialnej za usuwanie danych nieaktywnych

sesji (ang. garbage collection).


t _read() metoda wywoywana przy odczycie danych sesji. Jej jedynym

argumentem powinien by poprawny identyfikator sesji (SID), ktrej dane


chcemy odczyta. Powinna ona zwrci dane sesji lub pusty cig znakw.
Zdarza si, e w przypadku gdy ta metoda nie zwrci adnej wartoci, PHP generuje tzw. bd segmentacji, co w praktyce oznacza zakoczenie jego pracy. Mimo e
w najnowszych wersjach PHP nie powinno si to ju zdarza, zadbajmy, aby ta metoda
zawsze zwracaa jak warto.
t _write() metoda wywoywana przy zapisie danych sesji w miejscu
okrelonym w opcjach session.save_path oraz session.name lub, tak jak

w naszym przypadku, w bazie danych. Argumentami tej funkcji powinny by:


poprawny identyfikator sesji (SID) oraz zmienna z danymi, ktre chcemy
zapisa. Metoda powinna zwrci warto logiczn TRUE lub FAeSE.
t _destroP() metoda wywoywana przy niszczeniu danych sesji. Jej argumentem

powinien by poprawny identyfikator sesji (SID) i musi ona zwrci warto


logiczn TRUE lub FAeSE.
t _gc() metoda suca do kasowania danych nieaktywnych sesji.

Jest wywoywana losowo z prawdopodobiestwem okrelonym w opcji


session.gc_probabilitP. Bdziemy j wywoywa z poziomu metody _close().
Jedynym argumentem tej metody jest zmienna liczbowa staoprzecinkowa
okrelajca maksymalny czas ycia sesji. Zignorujemy t warto i bdziemy
usuwa dane sesji zgodnie z czasem, ktry okrelimy wewntrz tej metody.
Metoda powinna zwrci warto logiczn TRUE lub FAeSE oraz waciwo
$_sessionTable przechowujc nazw tabeli w bazie danych.
Listing 5.15. Klasa CustomSession implementujca metod wasnej obsugi mechanizmw sesji
<?php
class CustomSession {
private $_sessionTable;
public function __construct() {
$this->setSessionTable('active_session');
//varejestrowanie wasnej obsugi sesji
session_set_save_handler(
array(&$this "_open")
array(&$this "_close")
array(&$this "_read")
array(&$this "_write")
array(&$this "_destroy")
array(&$this "_gc"));
}

222 (10-08-06)

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc

Rozdzia 5. Mechanizmy autoryzacji i sesje

223

public function setSessionTable($tablename) {


if ($tablename <> ULL) {
$this->_sessionTable = $tablename;
return TRUE;
} else { return new Error('cannotsetsessiontable'); }
}
public function getSessionTable(){ return $this->_sessionTable; }
public function _open($save_path $session_name) {
try {
DBManager::init();
return TRUE;
} catch (DBError $err) {
exit('Error: '.$err->getMessage().'<br/>');
}
}
public function _close() {
$this->_gc(0);
return TRUE;
}
public function _read($session_id) {
//Pobranie danych sesji
$sqlquery = "SELECT SESS_Value FROM " . $this->getSessionTable() . " WHERE SESS_Id
= '$session_id'";
try {
$result = DBManager::Query($sqlquery);

if ($result->numRows() > 0) {
if ($sessiondata = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
return current($sessiondata);
}
} else {
return '';
}
} catch (DBError $err) {
exit('Error: '.$err->getMessage().'<br/>');
}

public function _write($session_id $session_data) {


try {
//Sprawdzenie czy sesja ju istnieje
$sqlquery = "SELECT count(*) as 'ilosc' FROM " . $this->getSessionTable() . "
WHERE SESS_Id = '$session_id'";
$result = DBManager::Query($sqlquery);
if ($result->numRows() > 0) {
//Uaktualnienie danych sesji
$sqlquery = "UPDATE " . $this->getSessionTable() . " SET SESS_LastUpdate
= CURRE T_TIMESTAMP(0) SESS_Value = '$session_data' WHERE SESS_Id
= '$session_id'";
DBManager::Query($sqlquery);

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)

223

224

PHP i MySQL. Tworzenie sklepw internetowych


if (DBManager::AffectedRows() > 0) {
return TRUE;
} else { return FALSE; }
} else {
//vapisanie nowych danych sesji
$sqlquery = "I SERT I TO " . $this->getSessionTable() . " (SESS_Id
SESS_LastUpdate SESS_Value) VALUES ('$session_id' CURRE T_TIMESTAMP(0)
'$session_data')";
DBManager::Query($sqlquery);
if (DBManager::AffectedRows() > 0) {
return TRUE;
} else { return FALSE;}
}
} catch (DBError $err) {
exit('Error: '.$err->getMessage().'<br/>');
}
}
public function _destroy($session_id) {
try {
//Usunicie danych sesji
$sqlquery = "DELETE FROM " . $this->getSessionTable() . " WHERE SESS_Id
= '$session_id'";
DBManager::Query($sqlquery);
return TRUE;
} catch (DBError $err) {
exit('Error: '.$err->getMessage().'<br/>');
}
}
public function _gc($maxlifetime) {
$ses_life = strftime('%Y-%m-%d %H:%M' strtotime("-5 minutes"));
try {
//Usunicie przedawnionych danych sesji
$sqlquery = "DELETE FROM " . $this->getSessionTable() . " WHERE SESS_LastUpdate
< '$ses_life'";
DBManager::Query($sqlquery);
return DBManager::AffectedRows();
} catch (DBError $err) {
exit('Error: '.$err->getMessage().'<br/>');
}
}
}
?>

Dodatkowego wyjanienia w zasadzie wymagaj jedynie trzy metody: konstruktor tej


klasy, metoda _write() oraz _gc().
W konstruktorze klasy, oprcz okrelenia nazwy tabeli w bazie danych, w ktrej zapisywane bd dane sesji, musimy zarejestrowa metody naszej klasy jako funkcje
obsugujce mechanizmy sesji. Do tego celu wykorzystamy funkcj session_set_
save_handler().
bool session_set_save_handler (string open string close string read string write
string destroy string gc)

224 (10-08-06)

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc

Rozdzia 5. Mechanizmy autoryzacji i sesje

225

Argumentami tej funkcji powinny by kolejno nazwy funkcji odpowiedzialne za: otwarcie sesji, zamknicie sesji, odczytanie danych sesji, zapisanie danych sesji, zniszczenie
danych sesji oraz niszczenie danych starych sesji. Ze wzgldu na to, e korzystamy
z metod klasy, parametrami tej funkcji musz by tablice zawierajce kolejno nazw
obiektu obsugujcego mechanizmy sesji oraz nazw konkretnej metody.
W metodzie _write() naley zwrci uwag na kolejno przeprowadzanych operacji.
Najpierw musimy sprawdzi, czy operacja zapisu danych nie dotyczy sesji, ktra ju
istnieje. W takiej sytuacji uaktualniamy dane istniejcej sesji i koczymy wykonanie
metody. W przypadku gdy zapisywane dane dotycz nowej sesji, musimy doda nowy
wiersz do tabeli active_session.
W przypadku metody _gc() ze wzgldu na to, e ignorujemy warto jej argumentu
musimy na pocztku okreli, ktre sesje mamy traktowa jako przedawnione.
Ustalilimy maksymalny czas ycia sesji na 5 minut.
$ses_life = strftime('%Y-%m-%d %H:%M' strtotime("-5 minutes"));

Mona oczywicie przyj dowoln warto tego znacznika czasu, jednak uwaamy,
e pi minut bezczynnoci po stronie uytkownika jest wystarczajco dugim okresem
pozwalajcym stwierdzi, i przesta on korzysta ze sklepu.
Jeeli serwer WWW oraz serwer bazy danych zostay zainstalowane na osobnych
maszynach, naley upewni si, i ustawione na nich daty systemowe s takie
same. Najlepiej skonfigurowa je tak, aby synchronizoway czas z tym samym serwerem czasu. Jeeli midzy tymi maszynami bdzie istnie rnica czasowa, obsuga
sesji moe by nieprawidowa.

Przykad 5.2
Aby zaimplementowa w aplikacji wasny mechanizm obsugi sesji oparty na bazie
danych, naley:
1. Utworzy odpowiedni struktur bazy danych. Skrypt SQL tworzcy t struktur

znajdziemy na listingu 5.16.


Listing 5.16. Testowa instrukcja switch sprawdzajca poprawno mechanizmu obsugi sesji
if (isSet($_GET['action']))
switch ($_GET['action']) {
case 'new':
$_SESSIO ['test'] = ' owa zmienna sesyjna';
break;
case 'change':
$_SESSIO ['test'] = 'vmieniona zmienna sesyjna';
break;
case 'clear':
$_SESSIO ['test'] = ULL;
break;
}

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)

225

226

PHP i MySQL. Tworzenie sklepw internetowych


2. Aplikacj przygotujemy na podstawie struktury aplikacji, ktr poznalimy

w rozdziale 4., rozbudowanej o obsug bazy danych. Struktura ta znajduje si


na CD-ROM-ie doczonym do ksiki w katalogu materialy/rozdzial05/
struktura_aplikacji. Skopiujmy j na serwer WWW, tak aby katalog www
by katalogiem rootwww dla serwera.
W pliku www/index.php doczymy do skryptu za pomoc funkcji require_once()
plik config/custom_session.inc.php oraz rozpoczniemy sesj za pomoc funkcji
session_start():
require_once('../config/custom_session.inc.php');
session_start();

3. Prosta instrukcja switch pozwoli przetestowa poprawno obsugi sesji

(listing 5.16). Dziki trzem rnym akcjom moemy stworzy now zmienn
sesyjn (akcja new), zmieni jej warto (akcja change) lub wyczyci jej
zawarto (akcja clear). Kod z listingu 5.16 naley dopisa do pliku
www/index.php. Opcja przeadowania strony pozwoli sprawdzi, czy informacje
rzeczywicie trzymane s w sesji.
4. Na koniec zmodyfikujmy jeszcze szablon index.tpl, dopisujc do niego

nastpujc tre:
vmienna sesyjna: {$smarty.session.test|default:"Brak wartoci"}<br/>
<a href="index.php?action=new">Utwtrz zmienn sesyjn</a><br/>
<a href="index.php?action=change">vmie< warto zmiennej sesyjnej</a><br/>
<a href="index.php?action=clear">Wyczy zawarto zmiennej sesyjnej</a><br/><br/>
<a href="index.php">Przeaduj stron</a><br/>

Ze wzgldu na to, e w konfiguracji Smarty domylnie wczylimy tryb obsugi pamici podrcznej (staa SMARTS_CACHINA w pliku konfiguracyjnym define.inc.php),
zmiany na stronie mog nie pojawia si szybko pamitajmy, e wtedy Smarty
nie przekompiluje szablonu, tylko pobierze go z pamici podrcznej. Na czas testw
dobrze ustawi warto staej SMARTS_CACHINA na FAeSE.

Wykorzystanie cookies
Ciasteczka (ang. cookies) to bardzo pomocna technologia, ktr moe wykorzysta
w swojej pracy kady twrca serwisw internetowych. Mimo i o cookies duo si
mwi, to cigle wiele osb mao o nich wie, a wielu programistw nie docenia ich
moliwoci. Jeszcze inni uwaaj, i jest to technologia trudna oraz skomplikowana
i z tych wanie powodw jej nie uywaj. A tymczasem prawda jest taka, e obsuga
cookies jest banalnie prosta, a korzyci z ich stosowania bardzo due.
Co to jest cookieCookies to mae pliki (o maksymalnej wielkoci 4 kB) przechowywane na komputerze uytkownika, do ktrych dostp ma przegldarka internetowa.
Moe ona zarwno odczytywa, jak i zapisywa do nich potrzebne informacje. W zalenoci od danych zapisanych w cookie, moe ono pozosta na komputerze uytkownika

226 (10-08-06)

D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc

You might also like