PHP PHP i bezpieczne logowanie 12 2004


CMYK
NA CD NEWSY Z OKŁADKI FIRMA MAGAZYN PROGRAMY WARSZTAT
PHP
i
bezpieczne
logowanie
PHP
Każdy programista PHP prędzej czy póxniej stanie przed problemem stworzenia systemu
logowania do serwisu internetowego. DziS internauci są już przyzwyczajeni do tego,
że coraz częSciej niektóre interesujące ich informacje dostępne są jedynie
po zarejestrowaniu się w serwisie oraz zalogowaniu się. Często potrzeba logowania
wynika także z koniecznoSci zapewnienia bezpieczeństwa, np. panel administracyjny
sklepu internetowego lub systemu CMS powinien być dostępny jedynie dla SciSle
okreSlonego grona użytkowników.
Marcin Staniszczak
stnieje przynajmniej kilka podejSć do tematu autoryzacji. Najprost- lastlogin INT NOT NULL,
sze z nich to wykorzystanie autoryzacji HTTP (co opisano dokład- lasttry INT NOT NULL,
Inie w MI 9/04, str. 94). Jednak sposób ten jest mało elegancki, trycount INT NOT NULL,
a dodatkowo często niedostępny ze względu na koniecznoSć utworze- authority INT NOT NULL,
nia oraz modyfikowania pliku .htaccess. W artykule zaproponuję im-
plementację klasy autoryzacji opartej o bazę MySQL oraz przedstawię UNIQUE(login),
sposób jej wykorzystania z użyciem sesji, a na koniec podsunę kilka PRIMARY KEY(iduser)
pomysłów na rozbudowę zaprezentowanej tu klasy. );
Przygotowania iduser  unikatowy identyfikator użytkownika,
Zanim zaczniemy pisanie naszej klasy, musimy się zastanowić, jakie login, passwd, name, surename, email  odpowiednio: login
informacje chcemy przechowywać w bazie. Już na samym początku użytkownika, jego hasło, imię, nazwisko oraz e-mail,
nasuwa się mySl o loginie i haSle. Ale nie musimy się ograniczać tylko authority  poziom uprawnień użytkownika.
do tych dwóch informacji. W konstruowanej tu klasie będziemy prze-
chowywali imię i nazwisko użytkownika, jego adres e-mail. Dodatko- Nic nie wiadomo jeszcze o polach lastlogin, lasttry oraz trycount.
wo zapiszemy poziom uprawnień, co pozwoli na podział serwisu opar- Pierwsze z nich będzie służyło do przechowywania daty ostatniego lo-
tego na tej klasie na moduły, do których dostęp będą mieli jedynie gowania. Dlaczego w takim razie lasttry jest typu INT? Odpowiedx
użytkownicy z odpowiednimi uprawnieniami. jest prosta  data będzie przechowywana w bazie w postaci uniksowe-
A oto polecenie SQL tworzące tabelę używaną w naszej klasie: go znacznika czasu, czyli w postaci liczby będącej iloScią sekund jakie
upłynęły od 1 stycznia 1970 roku. O znaczeniu pozostałych pól
CREATE TABLE login (lasttry, trycount) napiszę podczas analizy kodu klasy autoryzacji.
(
iduser INT NOT NULL auto_increment,
login varchar(25) NOT NULL, Klasa cLogin
passwd varchar(32) NOT NULL, Pora na przyjrzenie się klasie odpowiedzialnej za przeprowadzanie au-
toryzacji. Na początku zabezpieczamy plik z naszą klasą przed wpisa-
name varchar(30) NOT NULL, niem go w adresie przeglądarki. JeSli ktoS chciałby to uczynić (i wpisać
surename varchar(50) NOT NULL, w przeglądarce stronę o adresie np. http://adres_strony/include/login.class.php, zo-
email varchar(200) NOT NULL, stanie przekierowany na stronę główną serwisu). Nie możemy zapo-
mnieć o zmianie w razie koniecznoSci adresu, na który ma zostać prze-
Omawiane w artykule przykłady są dostępne na dołączonej płycie CD w katalogu
Warsztat_logowanie (archiwum source.rar). Znajduje się tam m.in. plik makedb.php,
98 INTERNET.grudzień.2004
który zakłada niezbędną bazę i tabele do funkcjonowania przykładów.
CMYK
WARSZTAT PROGRAMY MAGAZYN FIRMA Z OKŁADKI NEWSY NA CD
PHP
kierowany taki użytkownik (w linii Header należy zmienić wpis Już na początku zabezpieczamy się przed przemyceniem przez
../index.php). użytkownika instrukcji SQL, które mogłyby narobić bałaganu
w bazie (w najgorszym razie nawet ją usunąć). Służy do tego
if (eregi( login.class.php ,$_SERVER[ PHP_SELF ])) { parametr oraz modyfikuje go tak, aby był w pełni bezpieczny
Header( Location: ../index.php ); i mógł zostać wykorzystany w zapytaniu SQL. Podczas zabezpie-
die(); czania hasła jest ono dodatkowo szyfrowane za pomocą funkcji
} haszującej md5(..). Funkcja ta zwraca ciąg 32 znaków, które iden-
tyfikują podane hasło. Jednak na podstawie znaków wygenerowa-
Następnie definiujemy trzy stałe. Takie wartoSci będzie zwracała nych za jej pomocą nie da się odzyskać hasła. Z tego powodu
nasza funkcja autoryzująca: w razie utraty hasła przez użytkownika, musimy np. wysłać mu
AUTH_FALSE  oznacza, że podano nieprawidłowy login lub nowe hasło (ponieważ to w bazie jest zapisane w postaci zakodo-
hasło, wanej, co jest jednoznaczne z niemożnoScią jego odzyskania).
AUTH_OK  oznacza, że użytkownik istnieje i podał poprawne Takie podejScie wydaje się być rozsądne  wielu użytkowników
hasło, używa jednego hasła we wszelkich możliwych sytuacjach.
AUTH_3TIMES_ERROR  oznacza, że użytkownik o podanym Umieszczając w bazie hasło w postaci zakodowanej poprzez funk-
loginie istnieje, jednak trzy razy pod rząd podał niepoprawne cję md5(..), mamy pewnoSć, że w razie włamania się kogoS do na-
hasło. szej bazy danych osoba ta i tak nie pozna (w szybki sposób) haseł
naszych użytkowników.
define( AUTH_3TIMES_ERROR , 32);
define( AUTH_FALSE , 16); function check($login, $passwd) {
define( AUTH_OK , 8); $login = mysql_escape_string($login);
$passwd = mysql_escape_string(md5($passwd));
Przyszła kolej na definicję klasy. Nazwą klasy będzie cLogin. Po-
czątkowa literka c oznacza, że jest to klasa (przy dużych projektach ta- Gdy zmienne przechowujące hasło i login mają już postać pozwala-
kie nazewnictwo ma ułatwić pracę, ale wszystko zależy od przyjętych jącą bezpiecznie je wykorzystać w zapytaniu SQL, wydobywamy z ba-
wzorców). zy informację o użytkowniku, który taki login posiada. Nie zwracamy
Na początku definiujemy zmienne, w których będą przechowywa- uwagi na to, czy podane hasło pasuje do tego znajdującego się w ba-
ne: identyfikator połączenia z bazą MySQL ($dbConnection), znacz- zie, ponieważ po trzech nieudanych próbach logowania się na okreSlo-
nik informujący o tym czy użytkownik przeszedł autoryzację ne konto chcemy je zablokować na np. 5 minut.
($isLogin), informacje o użytkowniku ($id, $name, $surename, Następnie sprawdzamy ilu użytkowników w naszej bazie ma
$eMail, $lastLogin, $authority) oraz trzy zmienne, których znaczenie login taki sam, jak podany w parametrze wejSciowym funkcji
poznamy nieco dalej. check(..). JeSli liczba takich użytkowników jest różna od jedynki,
wówczas uznajemy, że autoryzacja nie powiodła się (ze względu na
class cLogin { ograniczenie UNIQUE założone w tabeli login na polu login może
var $dbConnection; istnieć tylko jeden użytkownik o tym samym loginie), w przeciw-
var $isLogin; nym razie możemy przystąpić do kolejnych testów. W tym celu
var $id; odczytujemy kilka informacji o logującym się użytkowniku: jego id,
var $name; liczbę nieudanych prób logowania oraz datę ostatniej nieudanej pró-
var $surename; by logowania.
var $eMail;
var $lastLogin; $record = mysql_query( SELECT * FROM login WHERE
var $authority; login= $login  , $this->dbConnection)
var $lastTry; or die( Problem z baza danych );
var $tryCount;
var $nextTry; if(mysql_num_rows($record)===1) {
$res = mysql_fetch_assoc($record);
Konstruktor klasy cLogin jest bardzo prosty. Przyjmuje on jeden $this->id = $res[ iduser ];
argument, którym jest identyfikator połączenia z bazą danych (klasa $this->tryCount = $res[ trycount ];
sama nie nawiązuje takiego połączenia), przekazuje ten identyfikator $this->lastTry = $res[ lasttry ];
do zmiennej $dbConnection oraz ustawia początkowe wartoSci zmien-
nych $isLogin oraz $nextTry. Sprawdzamy czy hasło podane jako parametr funkcji jest iden-
tyczne z tym, które znajduje się w bazie. Sprawdzamy również czy
function cLogin($dbConnection) { liczba prób logowania na sprawdzane konto nie osiągnęła już licz-
$this->dbConnection = $dbConnection; by 3. JeSli hasło jest niepoprawne lub nastąpiła trzecia nieudana
$this->isLogin = false; próba logowania na konto, zwracamy wartoSć AUTH_3TI-
$this->nextTry = false; MES_ERROR (zobacz dalej). W przeciwnym razie przypisujemy
} zmiennym $name, $surename, $authority oraz $eMail poprawne
wartoSci (odczytane wczeSniej z bazy danych). Następnie aktuali-
Najważniejszą funkcją całej klasy jest check(..). Przyjmuje zujemy informację w tabeli. Ustalamy odpowiednią wartoSć pola
ona dwa parametry: login użytkownika oraz jego hasło. Ze lastlogin oraz zerujemy pola trycoun i lasttry. Zmiennej $isLogin
względu na długoSć oraz złożonoSć tej funkcji zostanie ona opi- można przypisać wartoSć true i zakończyć funkcję check(..) z war-
sana fragmentami. toScią AUTH_OK.
INTERNET.grudzień.2004 99
CMYK
NA CD NEWSY Z OKŁADKI FIRMA MAGAZYN PROGRAMY WARSZTAT
PHP
if((strcmp($res[ passwd ], $passwd)===0) && if(($this->tryCount>=3) && (($this->lastTry+600)(($this->tryCount<3) || (($this->lastTry+300) $record = mysql_query( UPDATE login SET lasttry= .
id,
$this->name = $res[ name ]; $this->dbConnection) or die( Problem z baza danych );
$this->surename = $res[ surename ]; }else
$this->lastLogin = $res[ lastlogin ]; $record = mysql_query( UPDATE login SET lasttry= .
$this->authority = $res[ authority ]; time(). , trycount= .($this->tryCount+1). WHERE
$this->eMail = $res[ email ]; iduser= .$this->id, $this->dbConnection)
or die( Problem z baza danych );
//update daty ostatniego logowania }
$record = mysql_query( UPDATE login SET return AUTH_FALSE;
lastlogin= .time(). , trycount=0, lasttry=0 }
WHERE iduser= .$this->id, $this->dbConnection) } else { //użytkownik nie istnieje
or die( Problem z baza danych ); return AUTH_FALSE;
}
$this->isLogin = true; }
return AUTH_OK;
} else { //niepoprawny login lub hasło Gdy autoryzacja powiodła się, kolejne pięć funkcji będzie zwracało
wartoSć odpowiednich zmiennych z klasy  getName()  $name,
JeSli jednak okazało się, że liczba prób logowania na dane konto getSurename()  $surename, getLastLogin()  $lastLogin (sformato-
przekroczyła właSnie liczbę 3, a nie minęło jeszcze 5 minut od ostat- wane do postaci dzień.miesiąc.rok godzina:minuta:sekunda),
niej próby, wówczas obliczymy czas, po którym będzie można się za- getAuthority()  $authority, getEmail()  $email. Gdy autoryzacja nie
logować (przez jaki czas konto będzie jeszcze zablokowane), a następ- powiodła się, wówczas funkcje te zwracają false.
nie zwracamy wartoSć AUTH_3TIMES_ERROR i kończymy działanie
funkcji check(..). function getName() {
if($this->isLogin)
if(($this->tryCount>=3) && (($this->lastTry+300)>time())) { return $this->name;
$this->nextTry = (int)((($res[ lasttry ]+300) else
-time())/60)+1; return false;
return AUTH_3TIMES_ERROR; }
} else { function getSurename() {
if($this->isLogin)
Gdy liczba nieudanych prób logowania osiągnęła już 3, nato- return $this->surename;
miast minęło już 5 minut zawieszenia konta, a podane hasło po- else
nownie jest niepoprawne, wówczas liczbę prób ustawiamy na 1, return false;
a datę ostatniej nieudanej próby logowania ustawiamy na aktual- }
ną. W ten sposób ta nieudana próba jest zliczona jako pierwsza function getLastLogin() {
z trzech. Gdyby dwie kolejne też okazały się nieudane, zapełnio- if($this->isLogin)
ny zostanie warunek opisany wczeSniej i konto ponownie zostanie return date( d.m.Y G:i:s ,$this->lastLogin);
zablokowane na 5 minut. Wówczas zwiększamy liczbę prób else
o jeden i ustawiamy aktualną datę jako datę ostatniego nieudane- return false;
go logowania. }
function getAuthority() {
if($this->isLogin)
return $this->authority;
else
return false;
}
function getEMail() {
if($this->isLogin)
return $this->eMail;
else
return false;
}
Ostatnia funkcja klasy cLogin, w przypadku blokady konta, zwraca
czas do jego odblokowania. JeSli konto nie jest zablokowane, zwraca
wartoSć false.
function getNextTry() {
if($this->nextTry)
return $this->nextTry;
Ekran pokazujący okienko logowania z zablokowanym kontem
 pozostały 3 min do odblokowania else
100 INTERNET.grudzień.2004
CMYK
WARSZTAT PROGRAMY MAGAZYN FIRMA Z OKŁADKI NEWSY NA CD
PHP
return false; $flag =  3times ;
} break;
}
?> JeSli autoryzacja się powiodła, metoda check(..) zwraca wartoSć
AUTH_OK. Zapisujemy więc do tablicy $info wszystkie istotne informacje
Korzystanie z klasy cLogin o logującym się użytkowniku, następnie tablicę tę przypisujemy do zmiennej
Gdy klasa cLogin została już napisana, pora zaprezentować sposób sesyjnej info. Ustawiamy odpowiednio zmienną $_SESSION[ test_login ],
na korzystanie z niej. Jak już wspomniałem, autoryzacja będzie opar- przypisując jej adres komputera z którego nastąpiło logowanie. Na koniec
ta o sesje, których obsługa z poziomu PHP nie sprawia najmniej- przekierowujemy użytkownika do strony, do której chciał się zalogować.
szych problemów. Sesje uruchamia się za pomocą funkcji ses-
sion_start(), która powinna być wywołana na początku pliku, w któ- case AUTH_OK:
rym chcemy mieć do nich dostęp. W przykładowym kodzie użyłem $info = array(
biblioteki szablonów Smarty.  authority => $login->getAuthority(),
Na początku sprawdzamy czy mamy ustawioną sesję (zmienna  e-mail => $login->getEMail(),
sesyjna, którą sprawdzamy ma nazwę test_login). JeSli sesja jest  lastLogin => $login->getLastLogin(),
ustawiona, sprawdzamy czy zawiera odpowiednią wartoSć (tj. po-  name => $login->getName(),
winna być identyczna z adresem IP komputera użytkownika wcho-  surename => $login->getSurename()
dzącego na naszą stronę). W przypadku spełnienia obu warunków );
przekierowujemy użytkownika na stronę index.php (na nią chcemy
się zalogować). $_SESSION[ info ] = $info;
JeSli $_SESSION[ test_login ] jest ustawiona na odpowiednią war- $_SESSION[ test_login ] = $ip;
toSć, oznacza to, że użytkownik dokonał już wczeSniej autoryzacji.
header( Location: index.php );
if(isset($_SESSION[ test_login ])) { exit;
if($_SESSION[ test_login ]==$ip) { break;
header( Location: index.php );
exit; Ostatnią wartoScią, którą może zwrócić metoda check(..), jest
} AUTH_FALSE, która oznacza, że użytkownik podał niepoprawny
} login lub hasło. WySwietlamy więc odpowiedni komunikat.
$flag =   ;
case AUTH_FALSE:
JeSli zmienna sesyjna nie była ustawiona, nasz skrypt wykona się $template->assign( tpl_loginError , true);
dalej. Sprawdzamy czy użytkownik kliknął w formularzu logowania $flag =  error ;
input Zaloguj się. JeSli tak zrobił, będą ustawione zmienne break;
$_POST[ login ] oraz $_POST[ passwd ]. }
}
if(isset($_POST[ login ]) && isset($_POST[ passwd ])) {
if(!($dbConnection = mysql_connect($mysql_host, Na koniec wySwietlamy ekran do logowania. Zostanie on wySwie-
$mysql_user, $mysql_passwd))) tlony, gdy nie są ustawione zmienne $_POST[ login ] oraz
die( Nieudane połączenie z bazą danych ); $_POST[ passwd ] (czyli użytkownik nie kliknął na input zaloguj się),
gdy wystąpił błąd podczas logowania lub gdy nastąpiły pod rząd 3 nie-
if(!(mysql_select_db($mysql_db))) udane próby logowania na jeden login.
die( Nieudane połączenie z bazą danych );
$template->display( login.tpl , $flag);
Tworzymy obiekt klasy cLogin, która została opisana wczeSniej.
Następnie korzystając z jej metody chack(..) sprawdzamy, czy podany
login i hasło są poprawne.
$login = new cLogin($dbConnection);
switch($login->check($_POST[ login ],
$_POST[ passwd ])) {
JeSli metoda check(..) zwraca AUTH_3TIMES_ERROR, ozna-
cza to, że ktoS wykonał 3 nieudane próby logowania na ten sam
login. Spowodowało to zablokowanie loginu na 5 minut. Musimy
więc wySwietlić stosowną informację (wraz z czasem za jaki
konto zostanie odblokowane  czas podany z dokładnoScią co do
minuty).
case AUTH_3TIMES_ERROR:
$template->assign( tpl_3times , true);
$template->assign( tpl_tryTime ,
$login->getNextTry()); Przykładowy ekran służący do logowania
INTERNET.grudzień.2004 101
CMYK
NA CD NEWSY Z OKŁADKI FIRMA MAGAZYN PROGRAMY WARSZTAT
PHP
Zabezpieczona strona wraz z informacjami o zalogowanym użytkowniku. Informacje pobrane przez klasę cLogin
Tak wygląda proces logowania się. Należy jeszcze zabezpieczyć }
każdą ze stron, która nie powinna być dostępna dla osób niezalogowa-
nych. Robi się to bardzo łatwo. Kod tutaj umieszczony wykona się, gdy użytkownik nie jest zalo-
gowany lub gdy zmienna sesyjna ma niepoprawną wartoSć.
session_start(); header( Location: login.php );
?>
if(isset($_SERVER[ REMOTE_ADDR ]))
$ip = ip2long($_SERVER[ REMOTE_ADDR ]); Wylogowanie polega na zniszczeniu sesji, a najprostszy wykonują-
cy to skrypt przedstawia się następująco:
if(isset($_SESSION[ test_login ])) {
if($_SESSION[ test_login ]==$ip) { session_unset();
Cały zabezpieczony kod strony powinien być umieszczony w tym session_destroy();
miejscu, jednak jeszcze przed instrukcją exit. Można też umieScić tu header( Location: login.php );
wywołanie własnej funkcji i przenieSć stąd do niej kod generujący ?>
stronę.
Propozycje rozbudowy
echo  zalogowany ; Zaprezentowaną tu klasę można jeszcze rozbudować. Na przykład
exit; każde logowanie, nieudaną próbę logowania, wylogowanie itd. powin-
} no się zapisywać w logu (może to być dodatkowa tabela w bazie da-
nych lub plik, jednak niedostępny z poziomu przeglądarki, czyli
To wykona się, gdy zmienna sesyjna test_login będzie ustawio- umieszczony poniżej katalogu domowego przeznaczonego na strony,
na, lecz już niekoniecznie na złą wartoSć, co może oznaczać próbę np. public_http). Można także dodać opcję banowania (blokowania)
włamania. wybranych adresów IP czy użytkowników. n
102 INTERNET.grudzień.2004
CMYK
WARSZTAT PROGRAMY MAGAZYN FIRMA Z OKŁADKI NEWSY NA CD
CMS
SYSTEMY CMS:
PHP-Nuke
Tworzenie rozbudowanych witryn w oparciu o języki skryptowe (PHP, ASP, Java Server
Pages), bazy danych oraz szablony daje wprawdzie ogromne możliwoSci, jednak efekt
końcowy jest uwarunkowany wieloma czynnikami. IloSć pracy, jakiej wymaga realizacja
projektu, nakłady finansowe oraz niezbędna wiedza to argumenty, które często eliminują
takie rozwiązanie. PodejSciem alternatywnym jest wykorzystanie jednej z aplikacji typu CMS.
Włodzimierz Gajda
Systemy CMS specjalistycznej wiedzy z dziedziny webmasteringu. Jego rola
Systemy CMS (ang. Content Management System  system zarządza- sprowadza się do instalacji pakietu oraz ustalenia zawartoSci i wy-
nia treScią) pojawiły się w Internecie pod koniec lat 90. ubiegłego stu- glądu witryny.
lecia i od tamtej pory stale zyskują popularnoSć. Serwisy internetowe,
początkowo tworzone w języku HTML, zostały dozbrojone poprzez Możliwości PHP-Nuke
skrypty CGI. Następnie pojawiły się języki PHP oraz ASP, osadzane PHP-Nuke jest jednym z bardziej znanych i rozpowszechnionych apli-
bezpoSrednio w kodzie HTML. Kolejnym interesującym pomysłem kacji typu CMS. Wprawdzie nie wykorzystuje szablonów, przez co
okazało się wprowadzenie szablonów. Ułatwiło to nie tylko lepszą or- modyfikacja szaty serwisu może sprawiać pewne trudnoSci, jednak ze
ganizację dużych projektów, ale także umożliwiło dostosowywanie względu na wszechobecnoSć z pewnoScią zasługuje na uwagę.
cech wizualnych serwisu bez ingerencji w oprogramowanie. Informacje publikowane na witrynie są podzielone na trzy niezależ-
ne kategorie: tematy (ang. topics), sekcje (sections) oraz zawartoSć
(content). Możemy z nich korzystać wedle uznania. Dodatkowo w por-
Zadaniem systemu CMS jest kompleksowa administracja portalem inter-
talu możemy publikować newsy  wiadomoSci informujące o spra-
netowym, od publikowania wiadomości i artykułów, poprzez organizację
wach bieżących.
struktury serwisu, aż po zarządzanie kontami użytkowników.
Najważniejszą kategorią są tematy. Każdy temat jest identyfiko-
wany tytułem oraz ikoną i może zawierać dowolną liczbę artykułów.
Od takiego podejScia już tylko krok do systemów zarządzania Artykuły dodawane do serwisu trafiają do tematu wybranego przez
treScią. Systemy CMS umożliwiają swobodną konfigurację zawar- administratora.
toSci serwisu, a więc dostępnych opcji menu, artykułów, wiadomo- Kategoria sekcje wygląda podobnie. Sekcje identyfikujemy tytułem
Sci, jak również wyglądu. Administrator systemu nie musi mieć oraz ikoną i umieszczamy w nich artykuły.
Wszystkie przykłady omawiane w artykule znajdują się na dołączonej płycie CD w katalogu Warsztat_PHP_Nuke. Ponadto w podkatalogach są:
PHP-Nuke 7.3 oraz instrukcja obsługi w języku angielskim.
Plik portal-dane.zip zawiera dane potrzebne do uruchomienia portalu opisanego w artykule. Wykonując krok po kroku procedurę zawartą
w pliku opis.txt utworzymy przykładowy portal.
INTERNET.grudzień.2004 103
CMYK
NA CD NEWSY Z OKŁADKI FIRMA MAGAZYN PROGRAMY WARSZTAT
CMS
W zawartoSci, podobnie jak w tematach i sekcjach, występuje po- GRANT SELECT,INSERT,DELETE,UPDATE ON nuke.*
dział na kategorie. W kategoriach umieszczamy strony. TO nukeuser@localhost IDENTIFIED BY  tajnehaslo ;
Portal prowadzony przy użyciu systemu PHP-Nuke jest zatem
podzielony na: Instrukcje te należy umieScić na końcu pliku nuke.sql. Użytkownik
wiadomoSci bieżące, nukeuser otrzyma uprawnienia SELECT, INSERT, DELETE oraz
tematy, a w nich artykuły, UPDATE do wszystkich tabel bazy nuke.
sekcje, w nich również artykuły, Tak zmodyfikowany plik nuke.sql wykonujemy, wydając polecenie:
zawartoSć, w której pojawiają się kategorie zawierające strony.
OczywiScie podstawowa funkcjonalnoSć systemu polega na tworze- c:\mysql\bin\mysql -uroot < nuke.sql
niu, usuwaniu i modyfikacji tematów, sekcji, zawartoSci, artykułów i ka-
tegorii. PHP-Nuke umożliwia ponadto komentowanie artykułów, prowa- lub
dzenie statystyki odsłon, rejestrację użytkowników, podział użytkowni-
ków na grupy i dostęp do artykułów na podstawie uprawnień. c:\mysql\bin\mysql -uroot -phasło < nuke.sql
Zanim przejdziemy do ćwiczeń praktycznych warto zwrócić uwagę
na główną wadę pakietu. Jest nią bezpieczeństwo  sprytny haker mo- Baza została utworzona, przechodzimy więc do kolejnych czynno-
że uzyskać uprawnienia administracyjne w niecałe pięć minut. Sci. Rozpakowujemy archiwum PHP-Nuke-7.3.zip do folderu htdocs
W związku z tym pakiet PHP-Nuke należy potraktować raczej jako lub jego odpowiednika. W pliku config.php wprowadzamy następują-
ćwiczenie przedstawiające mechanizm działania systemu CMS, niż ce zmiany:
jako praktyczną platformę prowadzenia portalu korporacyjnego. Luki
w bezpieczeństwie pakietu dotyczą głównie ataków typu database $dbhost =  localhost ;
injection, zatem poprawę bezpieczeństwa systemu możemy osiągnąć $dbuname =  nukeuser ;
ograniczając uprawnienia dostępu do bazy danych dla konta, na $dbpass =  tajnehaslo ;
którym działa aplikacja. OczywiScie spowoduje to istotne utrudnienia $dbname =  nuke ;
w administracji serwisem.
Teraz włączamy przeglądarkę internetową i odwiedzamy plik
Instalacja html/index.php zawarty w rozpakowanym archiwum. PowinniSmy
System PHP-Nuke wykorzystuje PHP oraz MySQL. Zatem instalację ujrzeć stronę przedstawioną na rysunku 1.
samego pakietu PHP-Nuke należy poprzedzić sprawdzeniem działania
serwera WWW, maszyny PHP oraz bazy danych. Funkcja phpinfo()
zwraca wszystkie konieczne informacje. Należy pamiętać, by zmniej-
szyć iloSć informacji diagnostycznych wysyłanych przez interpretator
PHP. W pliku php.ini modyfikujemy parametr error_reporting nadając
mu wartoSć:
error_reporting = E_ALL & ~E_NOTICE
Warto zwrócić uwagę, by rzeczywiste serwisy działające w Interne-
cie (nazywane w dokumentacji  Production web sites ) w ogóle nie
produkowały żadnych informacji diagnostycznych na stronie WWW.
Informacje takie mogą ułatwiać uzyskiwanie niepowołanego dostępu
przez osoby trzecie. Drukowanie komunikatów diagnostycznych wyłą-
czamy wprowadzając w pliku php.ini wpis:
display_errors = Off
Pakiet instalacyjny PHP-Nuke znajdziemy pod adresem
http://phpnuke.org. Instalację rozpoczynamy od utworzenia bazy danych.
W skompresowanym archiwum PHP-Nuke-7.3.zip znajdziemy (w fol-
derze sql) plik nuke.sql. Plik ten zawiera szereg poleceń SQL, które
utworzą odpowiednie tabele bazy danych. Tworzenie tabeli musimy
jednak poprzedzić utworzeniem samej bazy danych. Najłatwiej to
osiągniemy dodając na samym początku pliku nuke.sql trzy linijki:
DROP DATABASE IF EXISTS nuke;
CREATE DATABASE nuke;
USE nuke;
Pierwsza z nich usuwa bazę danych nuke, jeSli takowa istnieje.
Druga linijka zakłada nową (pustą) bazę danych, zaS trzecia ustala na-
zwę bazy danych, której będą dotyczyły dalsze operacje.
Z racji na bezpieczeństwo bazy danych, najlepiej założyć konto
użytkownika bazy MySQL. Poniższe dwie linijki zakładają konto
o nazwie nukeuser i haSle tajnehasło: Rys. 1. System PHP-Nuke po zainstalowaniu
104 INTERNET.grudzień.2004
CMYK
WARSZTAT PROGRAMY MAGAZYN FIRMA Z OKŁADKI NEWSY NA CD
CMS
Ostatnim etapem instalacji systemu jest ustalenie hasła administra- Fizyka, Chemia, Cząsteczki oraz Mikroskop. W przypadku tematu
tora. Na stronie głównej serwisu jest dostępny odsyłacz do panelu Fizyka w formularzu wprowadzamy:
administracyjnego. Podążając za tym odwołaniem dotrzemy do strony,
na której zakładamy nowe konto administratora systemu. System jest nazwa tematu: fizyka
gotowy do pracy. tekst tematu: Fizyka
ikona tematu: fizyka.png
Panel administracyjny Możemy również usunąć temat PHP-Nuke, domySlnie zawarty
Panel administracyjny portalu umożliwia wykonywanie wszystkich w portalu. Po przejSciu do panelu administracyjnego klikamy ikonę
czynnoSci administracyjnych. Nie musimy ręcznie modyfikować Tematy, następnie wybieramy temat, który chcemy usunąć. Poniżej
żadnych plików czy danych zawartych w bazie. Cały proces admi- formularza umożliwiającego modyfikację danych tematu znajduje się
nistracji jest realizowany za poSrednictwem odpowiednich formula- hiperłącze Skasuj (na prawo od przycisku Zapisz zmiany). Kliknięcie
rzy dostępnych w serwisie. Wyjątkiem jest dołączanie plików gra- hiperłącza Skasuj należy potwierdzić na następnej stronie odpowiada-
ficznych z ikonami. Pliki te musimy przegrać do odpowiedniego jąc Tak. W opisany powyżej sposób możemy dodawać i usuwać tema-
folderu. ty zawarte w portalu.
Następnym etapem jest dodawanie do portalu artykułów. Przecho-
dzimy do panelu administracyjnego (na stronie głównej znajduje się
hiperłącze Administration), po czym wybieramy pierwszą ikonę podpi-
saną Dodaj artykuł.
Formularz dodający kolejny artykuł do portalu zawiera znacznie
więcej pól. Polami kluczowymi są: tytuł artykułu, temat (lista roz-
wijana zawiera wszystkie tematy dostępne w portalu) oraz treSć.
Lista rozwijana umieszczona na końcu formularza zawiera dwie
wartoSci Podgląd artykułu oraz WySlij artykuł. Dzięki temu admini-
strator ma możliwoSć przejrzenia artykułu zanim go doda do bazy
danych.
Dodajmy do bazy danych kilka artykułów, a następnie przejdxmy
do tematów zawartych w portalu (nie do administracji tematami, a do
przeglądania tematów dostępnych w portalu). Rys. 4 przedstawia listę
czterech tematów, jakie dodaliSmy do portalu. Obok ikony tematu wi-
dać tytuły artykułów dotyczących danego tematu.
Rys. 2. Panel administracyjny portalu
Po przestawieniu języka na polski (odpowiedni formularz znajduje
się na dole lewej kolumny menu na stronie głównej) panel administra-
cyjny będzie miał postać przedstawioną na rysunku 2.
Tematy i artykuły
Ikona Tematy (ang. topic) umożliwia dodawanie nowych tematów
do portalu. Po kliknięciu ikony pojawi się formularz służący do do-
dania nowego tematu. Formularz ten zawiera trzy pola: nazwa tema-
tu, tekst tematu oraz ikonę. Pliki ikon umieszczamy w katalogu
html/images/topics. Po zapisaniu pliku z ikoną w tym folderze ikona
pojawi się na liScie rozwijanej. Przykładowe ikony zawarte w serwi-
sie mają wymiar 69x69 pikseli. Stosując te rozmiary unikniemy
ewentualnych kłopotów związanych z niedopasowaniem rozmiaru
ikony do układu witryny.
Rys. 3. Formularz dodający nowy temat
Dodajemy do systemu cztery przykładowe ikony: chemia.png, fizy-
ka.png, czasteczki.png oraz mikroskop.png. Następnie czterokrotnie
korzystamy z formularza i dodajemy do systemu cztery tematy: Rys. 4. Lista dostępnych tematów z widocznymi artykułami
INTERNET.grudzień.2004 105
CMYK
NA CD NEWSY Z OKŁADKI FIRMA MAGAZYN PROGRAMY WARSZTAT
CMS
Po kliknięciu wybranego artykułu przejdziemy do strony przedsta- Po dodaniu sekcji możemy przystąpić do dopisywania nowych
wiającej tekst wybranego artykułu. Rys. 5 przedstawia artykuł Trzecia artykułów. Dodajemy dwa nowe wpisy dotyczące pielęgnacji kotów.
zasada dynamiki. Wybierając sekcję Koty ujrzymy teraz listę dostępnych artykułów
przedstawioną na rys. 8.
Rys. 5. Artykuł wybrany z tematu Fizyka
JeSli natomiast w widoku z rys. 4 przedstawiającego wszystkie do-
stępne tematy klikniemy ikonę jednego z tematów, na przykład
Cząsteczki, wówczas przejdziemy do strony przedstawiającej wszystkie Rys. 8. Wszystkie artykuły sekcji Koty
artykuły dotyczące tematu. Przykład takiej strony jest widoczny na rys. 6.
Po wybraniu jednego z artykułów przejdziemy do strony z rys. 9.
Rys. 9. Artykuł p.t. Czesanie kotów zawarty w sekcji Koty
Zawartość: kategorie i strony
Ostatnią metodą dodawania informacji do portalu jest wykorzystanie
ikony ZawartoSć, dostępnej w panelu administracyjnym. Po kliknięciu
ikony ujrzymy kilka formularzy. Pierwszy z nich służy do definiowa-
nia kategorii. Kategorie posiadają nazwę oraz opis. Dodajemy katego-
rie Język PHP oraz Język HTML. Następnie w każdej kategorii dodaje-
my po kilka przykładowych stron. Użytkownicy odwiedzający sekcje
ujrzą strony przedstawione na rys. 10.
Rys. 6. Lista artykułów dotyczących tematu Cząsteczki
Sekcje i artykuły
Sekcje również są identyfikowane za pomocą ikon, lecz tym razem
ikony mają wymiar 222x69. Ikony sekcji umieszczamy w folderze
html/images/sections.
Sekcjami i artykułami dostępnymi w sekcjach zarządzamy za po-
mocą ikony administracyjnej Manager sekcji. Dodając sekcję poda-
jemy jedynie nazwę sekcji oraz nazwę pliku z ikoną (niestety tym ra-
zem do ustalenia nazwy pliku ikony jest wykorzystane pole edycyj-
ne, a nie lista rozwijana). Dodajemy do artykułu dwie sekcje Koty
oraz Psy, oznaczone odpowiednimi ikonami. Sekcje portalu są do-
stępne na stronie p.t. Sections. Odsyłacz do tej strony znajdziemy
w lewym menu portalu. Wygląd strony z dodanymi sekcjami jest wi-
Rys. 10.
doczny na rys. 7.
Kategorie
zawartoSci,
dostępne
artykuły
i jeden
wybrany
artykuł
Rys. 7. Dwie sekcje Koty oraz Psy
106 INTERNET.grudzień.2004
CMYK
WARSZTAT PROGRAMY MAGAZYN FIRMA Z OKŁADKI NEWSY NA CD
CMS
Wiadomości W centralnej kolumnie portalu widoczne są wiadomoSci i artykuły
Oprócz artykułów zawartych w tematach i sekcjach oraz stron zawar- dodane do działu Tematy.
tych w kategoriach sekcji w portalu możemy umieszczać wiadomoSci
bieżące (news). Do administracji wiadomoSciami służy ikona Wiado-
moSci panelu administracyjnego. Gdy dodamy do serwisu kilka przy-
kładowych informacji na temat spraw bieżących, pojawiają się one na
stronie głównej portalu.
Dostosowywanie wyglądu portalu: bloki i moduły
Bloki i moduły to dwa kluczowe pojęcia, jeSli chodzi o dostosowywa-
nie portalu do potrzeb indywidualnych. Bloki to prostokątne menu
obecne z prawej oraz z lewej strony serwisu. Rys. 11 przedstawia trzy
bloki: Oczekująca treSć, Who s Online oraz Languages. Natomiast
moduły są osobnymi, funkcjonalnymi podstronami serwisu. Przykła-
dami modułów są dział download, tematy, sekcje, zawartoSć, FAQ,
encyklopedia czy forum.
Rys. 11. Bloki Oczekująca treSć, Who s
Online oraz Languages
Dostosowując portal możemy ustalić
liczbę, położenie oraz zawartoSć blo-
ków, jak również dostępnoSć konkret-
nych modułów.
W naszym portalu wprowadzili-
Smy pewne artykuły w tematach, sek-
cjach oraz zawartoSci, jak również
dodaliSmy kilka newsów. Zatem tak
skonfigurujmy portal, by dostępne
były jedynie moduły odpowiedzialne
za tematy, sekcje, zawartoSć oraz
wiadomoSci.
Przechodzimy do zarządzania mo-
dułami. W tabelce dostępnych modu-
łów deaktywujemy kolejno wszyst-
kie moduły poza wspomnianymi te-
matami (moduł Topics), sekcjami
(moduł Sections), zawartoScią (mo-
duł Content) oraz wiadomoSciami
(moduł News). JeSli popatrzymy te-
raz na menu znajdujące się z lewej
strony na górze (w bloku zatytułowa-
nym Modules), wówczas powinni-
Smy w nim ujrzeć opcje Strona głów-
na, Content, Sections oraz Topics.
Rys. 13. Portal otrzymany po wykonaniu ćwiczeń omówionych
ZawartoSć bloku została przedsta- w artykule
wiona na rysunku 12.
Podsumowanie
Jak widać, instalacja pakietu i administracja w podstawowym za-
Rys. 12. Blok zawierający
kresie nie stwarzają niemal żadnych trudnoSci. Nakładem kilkuna-
moduły Strona główna,
stu minut nauki i pracy możemy uruchomić rozbudowaną witrynę.
Content, Sections
Jednak system PHP-Nuke nie jest pozbawiony wad. Poza wspo-
oraz Topics
mnianymi problemami z bezpieczeństwem, kłopoty sprawia mody-
fikacja wyglądu witryny. Wprawdzie dostępnych jest kilka warian-
Następnie przechodzimy tów układu portalu, jednak nie różnią się one istotnie między sobą.
do administracji bloka- JeSli zechcemy w znacznym stopniu zmodyfikować układ portalu,
mi. W tabeli przedsta- to dużą częSć zmian musimy wykonać modyfikując pliki xródłowe.
wiającej wszystkie bloki Dodatkową wadą jest brak możliwoSci tworzenia drzewiastych
deaktywujemy kolejno struktur informacyjnych. Cała klasyfikacja zawartoSci portalu pole-
wszystkie bloki oprócz Modules oraz Administration (blok ten wi- ga na wykorzystaniu omówionych działów: tematów, sekcji, zawar-
dzą tylko administratorzy). Następnie wylogowujemy się z syste- toSci oraz newsów. n
mu i odwiedzamy stronę główną. Nasz portal zawiera teraz jedy-
Ćwiczenia przedstawione w artykule są dostępne na stronie domowej autora
nie trzy działy, w których umieSciliSmy artykuły. Na stronie
pod adresem http://www.gajdaw.pl
głównej zobaczymy menu główne zawierające blok Modules.
INTERNET.grudzień.2004 107


Wyszukiwarka

Podobne podstrony:
Historia bezpieczeństwa 21 12 14r
Alternator 2200SRM0002 (12 2004) US EN
AM POI Fotoradary 12 2004 fotoradary opis
w sprawie szczegolowych warunkow i trybu wydawania zezwolen na przejazdy pojazdow nienormatywnych 16
HTML Tabele HTML 12 2004
zwierciadlo 12 2004
PHP Co nowego Co nowego w piątej wersji PHP 02 2004
php howto 12
Przemek Sobstel Bezpieczenstwo php mysql zagrozenia
PHP Co nowego w PHP 5 (cz 3) 11 2004
Technologie ADOdb kluczem do każdej bazy Jak pisać uniwersalne skrypty PHP 08 2004
php 2
Biblioteka PHP Wysyłanie pliku na serwer
k php

więcej podobnych podstron