Professional Documents
Culture Documents
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
D:\Roboczy\!!!!MA~1\PHPIMY~1.WYD\__spis treci.doc
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
D:\Roboczy\!!!!MA~1\PHPIMY~1.WYD\__spis treci.doc
D:\Roboczy\!!!!MA~1\PHPIMY~1.WYD\__spis treci.doc
Rozdzia 5.
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc
(10-08-06)
207
208
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
}
?>
Wady:
t Zabezpieczona zostaje w ten sposb tylko jedna strona. Jeeli chcielibymy
208 (10-08-06)
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc
209
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
Przykad 5.1
Tworzc prost aplikacj autoryzujc:
1. W pierwszej kolejnoci musimy utworzy odpowiedni struktur bazy danych.
varchar(32)
varchar(96)
varchar(32)
not null
not null
by pusty),
t USR_Password
210 (10-08-06)
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc
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()
}
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
}
?>
$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.
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
212 (10-08-06)
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc
213
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());
}
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)
213
214
5. Sercem klasy jest tak naprawd metoda autorize() (listing 5.8). Jej argumentami
s kolejno nazwa uytkownika ($usereogin) oraz haso ($userPassword).
214 (10-08-06)
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc
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.
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;
}
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)
215
216
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
216 (10-08-06)
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc
217
Zalety:
t nazwa uytkownika i haso przechowywane s poza skryptem (albo w osobnym
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
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)
217
218
Zalety:
t prostota i szybko implementacji,
t moliwo zabezpieczenia caej struktury katalogw,
t w przypadku wykorzystania pliku .htaccess przerzucenie na serwer WWW
218 (10-08-06)
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc
219
Z chronionej kontroli dostpu po stronie serwera Apache mona korzysta po zainstalowaniu moduu mod_auth_digest.
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)
219
220
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.
(listing 5.14),
220 (10-08-06)
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc
221
varchar(32)
text
timestamp
not null
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)
221
222
222 (10-08-06)
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc
223
if ($result->numRows() > 0) {
if ($sessiondata = $result->fetchRow(DB_FETCHMODE_ASSOC)) {
return current($sessiondata);
}
} else {
return '';
}
} catch (DBError $err) {
exit('Error: '.$err->getMessage().'<br/>');
}
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)
223
224
224 (10-08-06)
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc
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
D:\Roboczy\!!!!makiety poprawki druk pdf\PHP i MySQL. Tworzenie sklepw internetowych. Wydanie II\05.doc (10-08-06)
225
226
(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