PHP PHP i bezpieczne logowanie 12 2004

background image

C

M

Y

K

I

stnieje przynajmniej kilka podejϾ do tematu autoryzacji. Najprost-
sze z nich to wykorzystanie autoryzacji HTTP (co opisano dok³ad-
nie w MI 9/04, str. 94). Jednak sposób ten jest ma³o elegancki,

a dodatkowo czêsto niedostêpny ze wzglêdu na koniecznoœæ utworze-
nia oraz modyfikowania pliku .htaccess. W artykule zaproponujê im-
plementacjê klasy autoryzacji opartej o bazê MySQL oraz przedstawiê
sposób jej wykorzystania z u¿yciem sesji, a na koniec podsunê kilka
pomys³ów na rozbudowê zaprezentowanej tu klasy.

Przygotowania

Zanim zaczniemy pisanie naszej klasy, musimy siê zastanowiæ, jakie
informacje chcemy przechowywaæ w bazie. Ju¿ na samym pocz¹tku
nasuwa siê myœl o loginie i haœle. Ale nie musimy siê ograniczaæ tylko
do tych dwóch informacji. W konstruowanej tu klasie bêdziemy prze-
chowywali imiê i nazwisko u¿ytkownika, jego adres e-mail. Dodatko-
wo zapiszemy poziom uprawnieñ, co pozwoli na podzia³ serwisu opar-
tego na tej klasie na modu³y, do których dostêp bêd¹ mieli jedynie
u¿ytkownicy z odpowiednimi uprawnieniami.

A oto polecenie SQL tworz¹ce tabelê u¿ywan¹ w naszej klasie:

CREATE TABLE login
(

iduser INT NOT NULL auto_increment,
login varchar(25) NOT NULL,
passwd varchar(32) NOT NULL,

name varchar(30) NOT NULL,
surename varchar(50) NOT NULL,
email varchar(200) NOT NULL,

lastlogin INT NOT NULL,
lasttry INT NOT NULL,
trycount INT NOT NULL,
authority INT NOT NULL,

UNIQUE(login),
PRIMARY KEY(iduser)

);

!

iduser – unikatowy identyfikator u¿ytkownika,

!

login, passwd, name, surename, email – odpowiednio: login
u¿ytkownika, jego has³o, imiê, nazwisko oraz e-mail,

!

authority – poziom uprawnieñ u¿ytkownika.

Nic nie wiadomo jeszcze o polach lastlogin, lasttry oraz trycount.

Pierwsze z nich bêdzie s³u¿y³o do przechowywania daty ostatniego lo-
gowania. Dlaczego w takim razie lasttry jest typu INT? OdpowiedŸ
jest prosta – data bêdzie przechowywana w bazie w postaci uniksowe-
go znacznika czasu, czyli w postaci liczby bêd¹cej iloœci¹ sekund jakie
up³ynê³y od 1 stycznia 1970 roku. O znaczeniu pozosta³ych pól
(lasttry, trycount) napiszê podczas analizy kodu klasy autoryzacji.

Klasa cLogin

Pora na przyjrzenie siê klasie odpowiedzialnej za przeprowadzanie au-
toryzacji. Na pocz¹tku zabezpieczamy plik z nasz¹ klas¹ przed wpisa-
niem go w adresie przegl¹darki. Jeœli ktoœ chcia³by to uczyniæ (i wpisaæ
w przegl¹darce stronê o adresie np. http://adres_strony/include/login.class.php, zo-
stanie przekierowany na stronê g³ówn¹ serwisu). Nie mo¿emy zapo-
mnieæ o zmianie w razie koniecznoœci adresu, na który ma zostaæ prze-

PHP

INTERNET.grudzieñ.2004

98

NA CD

NEWSY

Z OK£ADKI

FIRMA

MAGAZYN

PROGRAMY

WARSZTAT

!

Ka¿dy programista PHP prêdzej czy póŸniej stanie przed problemem stworzenia systemu

logowania do serwisu internetowego. Dziœ internauci s¹ ju¿ przyzwyczajeni do tego,

¿e coraz czêœciej 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 koniecznoœci zapewnienia bezpieczeñstwa, np. panel administracyjny

sklepu internetowego lub systemu CMS powinien byæ dostêpny jedynie dla œciœle

okreœlonego grona u¿ytkowników.

Marcin Staniszczak

PHP

i

bezpieczne

logowanie

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,

który zakłada niezbędną bazę i tabele do funkcjonowania przykładów.

background image

C

M

Y

K

kierowany taki u¿ytkownik (w linii Header nale¿y zmieniæ wpis
../index.php).

<?php
if (eregi(”login.class.php”,$_SERVER[’PHP_SELF’])) {

Header(”Location: ../index.php”);
die();

}

Nastêpnie definiujemy trzy sta³e. Takie wartoœci bêdzie zwraca³a

nasza funkcja autoryzuj¹ca:

!

AUTH_FALSE – oznacza, ¿e podano nieprawid³owy login lub
has³o,

!

AUTH_OK – oznacza, ¿e u¿ytkownik istnieje i poda³ poprawne
has³o,

!

AUTH_3TIMES_ERROR – oznacza, ¿e u¿ytkownik o podanym
loginie istnieje, jednak trzy razy pod rz¹d poda³ niepoprawne
has³o.

define(’AUTH_3TIMES_ERROR’, 32);
define(’AUTH_FALSE’, 16);
define(’AUTH_OK’, 8);

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-
kie nazewnictwo ma u³atwiæ pracê, ale wszystko zale¿y od przyjêtych
wzorców).

Na pocz¹tku definiujemy zmienne, w których bêd¹ przechowywa-

ne: identyfikator po³¹czenia z baz¹ MySQL ($dbConnection), znacz-
nik informuj¹cy o tym czy u¿ytkownik przeszed³ autoryzacjê
($isLogin), informacje o u¿ytkowniku ($id, $name, $surename,
$eMail, $lastLogin, $authority
) oraz trzy zmienne, których znaczenie
poznamy nieco dalej.

class cLogin {

var $dbConnection;
var $isLogin;
var $id;
var $name;
var $surename;
var $eMail;
var $lastLogin;
var $authority;
var $lastTry;
var $tryCount;
var $nextTry;

Konstruktor klasy cLogin jest bardzo prosty. Przyjmuje on jeden

argument, którym jest identyfikator po³¹czenia z baz¹ danych (klasa
sama nie nawi¹zuje takiego po³¹czenia), przekazuje ten identyfikator
do zmiennej $dbConnection oraz ustawia pocz¹tkowe wartoœci zmien-
nych $isLogin oraz $nextTry.

function cLogin($dbConnection) {

$this->dbConnection = $dbConnection;
$this->isLogin = false;
$this->nextTry = false;

}

Najwa¿niejsz¹ funkcj¹ ca³ej klasy jest check(..). Przyjmuje

ona dwa parametry: login u¿ytkownika oraz jego has³o. Ze
wzglêdu na d³ugoœæ oraz z³o¿onoœæ tej funkcji zostanie ona opi-
sana fragmentami.

Ju¿ na pocz¹tku zabezpieczamy siê przed przemyceniem przez

u¿ytkownika instrukcji SQL, które mog³yby narobiæ ba³aganu
w bazie (w najgorszym razie nawet j¹ usun¹æ). S³u¿y do tego
funkcja mysql_escape_string(..), która analizuje tekst podany jako
parametr oraz modyfikuje go tak, aby by³ w pe³ni bezpieczny
i móg³ zostaæ wykorzystany w zapytaniu SQL. Podczas zabezpie-
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-
nych za jej pomoc¹ nie da siê odzyskaæ has³a. Z tego powodu
w razie utraty has³a przez u¿ytkownika, musimy np. wys³aæ mu
nowe has³o (poniewa¿ to w bazie jest zapisane w postaci zakodo-
wanej, co jest jednoznaczne z niemo¿noœci¹ jego odzyskania).
Takie podejœcie wydaje siê byæ rozs¹dne – wielu u¿ytkowników
u¿ywa jednego has³a we wszelkich mo¿liwych sytuacjach.
Umieszczaj¹c w bazie has³o w postaci zakodowanej poprzez funk-
cjê md5(..), mamy pewnoœæ, ¿e w razie w³amania siê kogoœ do na-
szej bazy danych osoba ta i tak nie pozna (w szybki sposób) hase³
naszych u¿ytkowników.

function check($login, $passwd) {

$login = mysql_escape_string($login);
$passwd = mysql_escape_string(md5($passwd));

Gdy zmienne przechowuj¹ce has³o i login maj¹ ju¿ postaæ pozwala-

j¹c¹ bezpiecznie je wykorzystaæ w zapytaniu SQL, wydobywamy z ba-
zy informacjê o u¿ytkowniku, który taki login posiada. Nie zwracamy
uwagi na to, czy podane has³o pasuje do tego znajduj¹cego siê w ba-
zie, poniewa¿ po trzech nieudanych próbach logowania siê na okreœlo-
ne konto chcemy je zablokowaæ na np. 5 minut.

Nastêpnie sprawdzamy ilu u¿ytkowników w naszej bazie ma

login taki sam, jak podany w parametrze wejœciowym funkcji
check(..). Jeœli liczba takich u¿ytkowników jest ró¿na od jedynki,
wówczas uznajemy, ¿e autoryzacja nie powiod³a siê (ze wzglêdu na
ograniczenie UNIQUE za³o¿one w tabeli login na polu login mo¿e
istnieæ tylko jeden u¿ytkownik o tym samym loginie), w przeciw-
nym razie mo¿emy przyst¹piæ do kolejnych testów. W tym celu
odczytujemy kilka informacji o loguj¹cym siê u¿ytkowniku: jego id,
liczbê nieudanych prób logowania oraz datê ostatniej nieudanej pró-
by logowania.

$record = mysql_query(”SELECT * FROM login WHERE

!

login=’$login’”, $this->dbConnection)

!

or die(’Problem z baza danych’);

if(mysql_num_rows($record)===1) {

$res = mysql_fetch_assoc($record);
$this->id = $res[’iduser’];
$this->tryCount = $res[’trycount’];
$this->lastTry = $res[’lasttry’];

Sprawdzamy czy has³o podane jako parametr funkcji jest iden-

tyczne z tym, które znajduje siê w bazie. Sprawdzamy równie¿ czy
liczba prób logowania na sprawdzane konto nie osi¹gnê³a ju¿ licz-
by 3. Jeœli has³o jest niepoprawne lub nast¹pi³a trzecia nieudana
próba logowania na konto, zwracamy wartoœæ AUTH_3TI-
MES_ERROR (zobacz dalej). W przeciwnym razie przypisujemy
zmiennym $name, $surename, $authority oraz $eMail poprawne
wartoœci (odczytane wczeœniej z bazy danych). Nastêpnie aktuali-
zujemy informacjê w tabeli. Ustalamy odpowiedni¹ wartoœæ pola
lastlogin oraz zerujemy pola trycoun i lasttry. Zmiennej $isLogin
mo¿na przypisaæ wartoœæ true i zakoñczyæ funkcjê check(..) z war-
toœci¹ AUTH_OK.

PHP

INTERNET.grudzieñ.2004

99

WARSZTAT

PROGRAMY

MAGAZYN

FIRMA

Z OK£ADKI

NEWSY

NA CD

"

background image

C

M

Y

K

if((strcmp($res[’passwd’], $passwd)===0) &&

!

(($this->tryCount<3) || (($this->lastTry+300)

!

<time()))) {

$this->name = $res[’name’];
$this->surename = $res[’surename’];
$this->lastLogin = $res[’lastlogin’];
$this->authority = $res[’authority’];
$this->eMail = $res[’email’];

//update daty ostatniego logowania
$record = mysql_query(”UPDATE login SET

!

lastlogin=”.time().”, trycount=0, lasttry=0

!

WHERE iduser=”.$this->id, $this->dbConnection)

!

or die(’Problem z baza danych’);

$this->isLogin = true;
return AUTH_OK;
} else { //niepoprawny login lub has³o

Jeœli jednak okaza³o siê, ¿e liczba prób logowania na dane konto

przekroczy³a w³aœnie liczbê 3, a nie minê³o jeszcze 5 minut od ostat-
niej próby, wówczas obliczymy czas, po którym bêdzie mo¿na siê za-
logowaæ (przez jaki czas konto bêdzie jeszcze zablokowane), a nastêp-
nie zwracamy wartoœæ AUTH_3TIMES_ERROR i koñczymy dzia³anie
funkcji check(..).

if(($this->tryCount>=3) && (($this->lastTry+300)>time())) {

$this->nextTry = (int)((($res[’lasttry’]+300)

!

-time())/60)+1;

return AUTH_3TIMES_ERROR;

} else {

Gdy liczba nieudanych prób logowania osi¹gnê³a ju¿ 3, nato-

miast minê³o ju¿ 5 minut zawieszenia konta, a podane has³o po-
nownie jest niepoprawne, wówczas liczbê prób ustawiamy na 1,
a datê ostatniej nieudanej próby logowania ustawiamy na aktual-
n¹. W ten sposób ta nieudana próba jest zliczona jako pierwsza
z trzech. Gdyby dwie kolejne te¿ okaza³y siê nieudane, zape³nio-
ny zostanie warunek opisany wczeœniej i konto ponownie zostanie
zablokowane na 5 minut. Wówczas zwiêkszamy liczbê prób
o jeden i ustawiamy aktualn¹ datê jako datê ostatniego nieudane-
go logowania.

if(($this->tryCount>=3) && (($this->lastTry+600)<time())) {
$record = mysql_query(”UPDATE login SET lasttry=”.

!

time().”, trycount=1 WHERE iduser=”.$this->id,

!

$this->dbConnection) or die(’Problem z baza danych’);
}else
$record = mysql_query(”UPDATE login SET lasttry=”.

!

time().”, trycount=”.($this->tryCount+1).” WHERE

!

iduser=”.$this->id, $this->dbConnection)

!

or die(’Problem z baza danych’);

}

return AUTH_FALSE;

}

} else { //u¿ytkownik nie istnieje

return AUTH_FALSE;

}

}

Gdy autoryzacja powiod³a siê, kolejne piêæ funkcji bêdzie zwraca³o

wartoœæ odpowiednich zmiennych z klasy – getName() – $name,
getSurename() – $surename, getLastLogin() – $lastLogin
(sformato-
wane do postaci dzieñ.miesi¹c.rok godzina:minuta:sekunda),
getAuthority() – $authority, getEmail() – $email. Gdy autoryzacja nie
powiod³a siê, wówczas funkcje te zwracaj¹ false.

function getName() {

if($this->isLogin)

return $this->name;

else

return false;

}
function getSurename() {

if($this->isLogin)

return $this->surename;

else

return false;

}
function getLastLogin() {

if($this->isLogin)

return date(’d.m.Y G:i:s’,$this->lastLogin);

else

return false;

}
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. Jeœli konto nie jest zablokowane, zwraca
wartoϾ false.

function getNextTry() {

if($this->nextTry)

return $this->nextTry;

else

PHP

INTERNET.grudzieñ.2004

100

NA CD

NEWSY

Z OK£ADKI

FIRMA

MAGAZYN

PROGRAMY

WARSZTAT

!

"

Ekran pokazuj¹cy okienko logowania z zablokowanym kontem

– pozosta³y 3 min do odblokowania

background image

return false;

}

}
?>

Korzystanie z klasy cLogin

Gdy klasa cLogin zosta³a ju¿ napisana, pora zaprezentowaæ sposób
na korzystanie z niej. Jak ju¿ wspomnia³em, autoryzacja bêdzie opar-
ta o sesje, których obs³uga z poziomu PHP nie sprawia najmniej-
szych problemów. Sesje uruchamia siê za pomoc¹ funkcji ses-
sion_start()
, która powinna byæ wywo³ana na pocz¹tku pliku, w któ-
rym chcemy mieæ do nich dostêp. W przyk³adowym kodzie u¿y³em
biblioteki szablonów Smarty.

Na pocz¹tku sprawdzamy czy mamy ustawion¹ sesjê (zmienna

sesyjna, któr¹ sprawdzamy ma nazwê test_login). Jeœli sesja jest
ustawiona, sprawdzamy czy zawiera odpowiedni¹ wartoœæ (tj. po-
winna byæ identyczna z adresem IP komputera u¿ytkownika wcho-
dz¹cego na nasz¹ stronê). W przypadku spe³nienia obu warunków
przekierowujemy u¿ytkownika na stronê index.php (na ni¹ chcemy
siê zalogowaæ).

Jeœli $_SESSION[’test_login’] jest ustawiona na odpowiedni¹ war-

toœæ, oznacza to, ¿e u¿ytkownik dokona³ ju¿ wczeœniej autoryzacji.

if(isset($_SESSION[’test_login’])) {

if($_SESSION[’test_login’]==$ip) {

header(’Location: index.php’);
exit;

}

}
$flag = ’’;

Jeœli zmienna sesyjna nie by³a ustawiona, nasz skrypt wykona siê

dalej. Sprawdzamy czy u¿ytkownik klikn¹³ w formularzu logowania
input Zaloguj siê. Jeœli tak zrobi³, bêd¹ ustawione zmienne
$_POST[’login’] oraz $_POST[’passwd’].

if(isset($_POST[’login’]) && isset($_POST[’passwd’])) {

if(!($dbConnection = mysql_connect($mysql_host,

!

$mysql_user, $mysql_passwd)))

die(’Nieudane po³¹czenie z baz¹ danych’);

if(!(mysql_select_db($mysql_db)))
die(’Nieudane po³¹czenie z baz¹ danych’);

Tworzymy obiekt klasy cLogin, która zosta³a opisana wczeœniej.

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’])) {

Jeœli metoda check(..) zwraca AUTH_3TIMES_ERROR, ozna-

cza to, ¿e ktoœ wykona³ 3 nieudane próby logowania na ten sam
login. Spowodowa³o to zablokowanie loginu na 5 minut. Musimy
wiêc wyœwietliæ stosown¹ informacjê (wraz z czasem za jaki
konto zostanie odblokowane – czas podany z dok³adnoœci¹ co do
minuty).

case AUTH_3TIMES_ERROR:

$template->assign(’tpl_3times’, true);
$template->assign(’tpl_tryTime’,

!

$login->getNextTry());

$flag = ‘3times’;

break;

Jeœli autoryzacja siê powiod³a, metoda check(..) zwraca wartoœæ

AUTH_OK. Zapisujemy wiêc do tablicy $info wszystkie istotne informacje
o loguj¹cym siê u¿ytkowniku, nastêpnie tablicê tê przypisujemy do zmiennej
sesyjnej info. Ustawiamy odpowiednio zmienn¹ $_SESSION[’test_login’],
przypisuj¹c jej adres komputera z którego nast¹pi³o logowanie. Na koniec
przekierowujemy u¿ytkownika do strony, do której chcia³ siê zalogowaæ.

case AUTH_OK:

$info = array(

’authority’ => $login->getAuthority(),
’e-mail’ => $login->getEMail(),
’lastLogin’ => $login->getLastLogin(),
’name’ => $login->getName(),
’surename’ => $login->getSurename()

);

$_SESSION[’info’] = $info;
$_SESSION[’test_login’] = $ip;

header(’Location: index.php’);
exit;

break;

Ostatni¹ wartoœci¹, któr¹ mo¿e zwróciæ metoda check(..), jest

AUTH_FALSE, która oznacza, ¿e u¿ytkownik poda³ niepoprawny
login lub has³o. Wyœwietlamy wiêc odpowiedni komunikat.

case AUTH_FALSE:

$template->assign(’tpl_loginError’, true);
$flag = ’error’;

break;

}

}

Na koniec wyœwietlamy ekran do logowania. Zostanie on wyœwie-

tlony, gdy nie s¹ ustawione zmienne $_POST[‘login’] oraz
$_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-
udane próby logowania na jeden login.

$template->display(’login.tpl’, $flag);

PHP

INTERNET.grudzieñ.2004

101

WARSZTAT

PROGRAMY

MAGAZYN

FIRMA

Z OK£ADKI

NEWSY

NA CD

"

C

M

Y

K

"

Przyk³adowy ekran s³u¿¹cy do logowania

background image

C

M

Y

K

PHP

INTERNET.grudzieñ.2004

102

NEWSY

Z OK£ADKI

FIRMA

MAGAZYN

PROGRAMY

WARSZTAT

!

NA CD

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.

<?php
session_start();

if(isset($_SERVER[’REMOTE_ADDR’]))

$ip = ip2long($_SERVER[’REMOTE_ADDR’]);

if(isset($_SESSION[’test_login’])) {

if($_SESSION[’test_login’]==$ip) {

Ca³y zabezpieczony kod strony powinien byæ umieszczony w tym

miejscu, jednak jeszcze przed instrukcj¹ exit. Mo¿na te¿ umieœciæ tu
wywo³anie w³asnej funkcji i przenieœæ st¹d do niej kod generuj¹cy
stronê.

echo ’zalogowany’;
exit;

}

To wykona siê, gdy zmienna sesyjna test_login bêdzie ustawio-

na, lecz ju¿ niekoniecznie na z³¹ wartoœæ, co mo¿e oznaczaæ próbê
w³amania.

}

Kod tutaj umieszczony wykona siê, gdy u¿ytkownik nie jest zalo-

gowany lub gdy zmienna sesyjna ma niepoprawn¹ wartoœæ.

header(’Location: login.php’);
?>

Wylogowanie polega na zniszczeniu sesji, a najprostszy wykonuj¹-

cy to skrypt przedstawia siê nastêpuj¹co:

<?php
session_unset();
session_destroy();
header(’Location: login.php’);
?>

Propozycje rozbudowy

Zaprezentowan¹ tu klasê mo¿na jeszcze rozbudowaæ. Na przyk³ad
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
umieszczony poni¿ej katalogu domowego przeznaczonego na strony,
np. public_http). Mo¿na tak¿e dodaæ opcjê banowania (blokowania)
wybranych adresów IP czy u¿ytkowników.

n

"

Zabezpieczona strona wraz z informacjami o zalogowanym u¿ytkowniku. Informacje pobrane przez klasê cLogin

background image

Systemy CMS

Systemy CMS (ang. Content Management System – system zarz¹dza-
nia treœci¹) pojawi³y siê w Internecie pod koniec lat 90. ubieg³ego stu-
lecia i od tamtej pory stale zyskuj¹ popularnoœæ. Serwisy internetowe,
pocz¹tkowo tworzone w jêzyku HTML, zosta³y dozbrojone poprzez
skrypty CGI. Nastêpnie pojawi³y siê jêzyki PHP oraz ASP, osadzane
bezpoœrednio w kodzie HTML. Kolejnym interesuj¹cym pomys³em
okaza³o siê wprowadzenie szablonów. U³atwi³o to nie tylko lepsz¹ or-
ganizacjê du¿ych projektów, ale tak¿e umo¿liwi³o dostosowywanie
cech wizualnych serwisu bez ingerencji w oprogramowanie.

Od takiego podejœcia ju¿ tylko krok do systemów zarz¹dzania

treœci¹. Systemy CMS umo¿liwiaj¹ swobodn¹ konfiguracjê zawar-
toœci serwisu, a wiêc dostêpnych opcji menu, artyku³ów, wiadomo-
œci, jak równie¿ wygl¹du. Administrator systemu nie musi mieæ

Zadaniem systemu CMS jest kompleksowa administracja portalem inter−
netowym, od publikowania wiadomości i artykułów, poprzez organizację
struktury serwisu, aż po zarządzanie kontami użytkowników.

specjalistycznej wiedzy z dziedziny webmasteringu. Jego rola
sprowadza siê do instalacji pakietu oraz ustalenia zawartoœci i wy-
gl¹du witryny.

Możliwości PHP−Nuke

PHP-Nuke jest jednym z bardziej znanych i rozpowszechnionych apli-
kacji typu CMS. Wprawdzie nie wykorzystuje szablonów, przez co
modyfikacja szaty serwisu mo¿e sprawiaæ pewne trudnoœci, jednak ze
wzglêdu na wszechobecnoœæ z pewnoœci¹ zas³uguje na uwagê.

Informacje publikowane na witrynie s¹ podzielone na trzy niezale¿-

ne kategorie: tematy (ang. topics), sekcje (sections) oraz zawartoϾ
(content). Mo¿emy z nich korzystaæ wedle uznania. Dodatkowo w por-
talu mo¿emy publikowaæ newsy – wiadomoœci informuj¹ce o spra-
wach bie¿¹cych.

Najwa¿niejsz¹ kategori¹ s¹ tematy. Ka¿dy temat jest identyfiko-

wany tytu³em oraz ikon¹ i mo¿e zawieraæ dowoln¹ liczbê artyku³ów.
Artyku³y dodawane do serwisu trafiaj¹ do tematu wybranego przez
administratora.

Kategoria sekcje wygl¹da podobnie. Sekcje identyfikujemy tytu³em

oraz ikon¹ i umieszczamy w nich artyku³y.

CMS

INTERNET.grudzieñ.2004

103

WARSZTAT

PROGRAMY

MAGAZYN

FIRMA

Z OK£ADKI

NEWSY

NA CD

"

C

M

Y

K

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¿liwoœci, jednak efekt

koñcowy jest uwarunkowany wieloma czynnikami. Iloœæ pracy, jakiej wymaga realizacja

projektu, nak³ady finansowe oraz niezbêdna wiedza to argumenty, które czêsto eliminuj¹

takie rozwi¹zanie. Podejœciem alternatywnym jest wykorzystanie jednej z aplikacji typu CMS.

W³odzimierz Gajda

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.

background image

W zawartoœci, podobnie jak w tematach i sekcjach, wystêpuje po-

dzia³ na kategorie. W kategoriach umieszczamy strony.

Portal prowadzony przy u¿yciu systemu PHP-Nuke jest zatem

podzielony na:

!

wiadomoœci bie¿¹ce,

!

tematy, a w nich artyku³y,

!

sekcje, w nich równie¿ artyku³y,

!

zawartoœæ, w której pojawiaj¹ siê kategorie zawieraj¹ce strony.

Oczywiœcie podstawowa funkcjonalnoœæ systemu polega na tworze-

niu, usuwaniu i modyfikacji tematów, sekcji, zawartoœci, artyku³ów i ka-
tegorii. PHP-Nuke umo¿liwia ponadto komentowanie artyku³ów, prowa-
dzenie statystyki ods³on, rejestracjê u¿ytkowników, podzia³ u¿ytkowni-
ków na grupy i dostêp do artyku³ów na podstawie uprawnieñ.

Zanim przejdziemy do æwiczeñ praktycznych warto zwróciæ uwagê

na g³ówn¹ wadê pakietu. Jest ni¹ bezpieczeñstwo – sprytny haker mo-
¿e uzyskaæ uprawnienia administracyjne w nieca³e piêæ minut.
W zwi¹zku z tym pakiet PHP-Nuke nale¿y potraktowaæ raczej jako
æwiczenie przedstawiaj¹ce mechanizm dzia³ania systemu CMS, ni¿
jako praktyczn¹ platformê prowadzenia portalu korporacyjnego. Luki
w bezpieczeñstwie pakietu dotycz¹ g³ównie ataków typu database
injection, zatem poprawê bezpieczeñstwa systemu mo¿emy osi¹gn¹æ
ograniczaj¹c uprawnienia dostêpu do bazy danych dla konta, na
którym dzia³a aplikacja. Oczywiœcie spowoduje to istotne utrudnienia
w administracji serwisem.

Instalacja

System PHP-Nuke wykorzystuje PHP oraz MySQL. Zatem instalacjê
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æ iloœæ informacji diagnostycznych wysy³anych przez interpretator
PHP. W pliku php.ini modyfikujemy parametr error_reporting nadaj¹c
mu wartoϾ:

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, jeœli takowa istnieje.

Druga linijka zak³ada now¹ (pust¹) bazê danych, zaœ 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 haœle tajnehas³o:

GRANT SELECT,INSERT,DELETE,UPDATE ON nuke.*
TO nukeuser@localhost IDENTIFIED BY ’tajnehaslo’;

Instrukcje te nale¿y umieœciæ na koñcu pliku nuke.sql. U¿ytkownik

nukeuser otrzyma uprawnienia SELECT, INSERT, DELETE oraz
UPDATE do wszystkich tabel bazy nuke.

Tak zmodyfikowany plik nuke.sql wykonujemy, wydaj¹c polecenie:

c:\mysql\bin\mysql -uroot < nuke.sql

lub

c:\mysql\bin\mysql -uroot -phas³o < nuke.sql

Baza zosta³a utworzona, przechodzimy wiêc do kolejnych czynno-

œci. Rozpakowujemy archiwum PHP-Nuke-7.3.zip do folderu htdocs
lub jego odpowiednika. W pliku config.php wprowadzamy nastêpuj¹-
ce zmiany:

$dbhost = ”localhost”;
$dbuname = ”nukeuser”;
$dbpass = ”tajnehaslo”;
$dbname = ”nuke”;

Teraz w³¹czamy przegl¹darkê internetow¹ i odwiedzamy plik

html/index.php zawarty w rozpakowanym archiwum. Powinniœmy
ujrzeæ stronê przedstawion¹ na rysunku 1.

Rys. 1. System PHP-Nuke po zainstalowaniu

CMS

INTERNET.grudzieñ.2004

104

NEWSY

Z OK£ADKI

FIRMA

MAGAZYN

PROGRAMY

WARSZTAT

!

NA CD

C

M

Y

K

background image

Ostatnim etapem instalacji systemu jest ustalenie has³a administra-

tora. Na stronie g³ównej serwisu jest dostêpny odsy³acz do panelu
administracyjnego. Pod¹¿aj¹c za tym odwo³aniem dotrzemy do strony,
na której zak³adamy nowe konto administratora systemu. System jest
gotowy do pracy.

Panel administracyjny

Panel administracyjny portalu umo¿liwia wykonywanie wszystkich
czynnoœci administracyjnych. Nie musimy rêcznie modyfikowaæ
¿adnych plików czy danych zawartych w bazie. Ca³y proces admi-
nistracji jest realizowany za poœrednictwem odpowiednich formula-
rzy dostêpnych w serwisie. Wyj¹tkiem jest do³¹czanie plików gra-
ficznych z ikonami. Pliki te musimy przegraæ do odpowiedniego
folderu.

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 liœcie 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:

Fizyka, Chemia, Cz¹steczki oraz Mikroskop. W przypadku tematu
Fizyka w formularzu wprowadzamy:

nazwa tematu: fizyka
tekst tematu: Fizyka
ikona tematu: fizyka.png

Mo¿emy równie¿ usun¹æ temat PHP-Nuke, domyœlnie zawarty

w portalu. Po przejœciu do panelu administracyjnego klikamy ikonê
Tematy, nastêpnie wybieramy temat, który chcemy usun¹æ. Poni¿ej
formularza umo¿liwiaj¹cego modyfikacjê danych tematu znajduje siê
hiper³¹cze Skasuj (na prawo od przycisku Zapisz zmiany). Klikniêcie
hiper³¹cza Skasuj nale¿y potwierdziæ na nastêpnej stronie odpowiada-
j¹c Tak. W opisany powy¿ej sposób mo¿emy dodawaæ i usuwaæ tema-
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 treœæ.
Lista rozwijana umieszczona na koñcu formularza zawiera dwie
wartoœci Podgl¹d artyku³u oraz Wyœlij artyku³. Dziêki temu admini-
strator ma mo¿liwoœæ przejrzenia artyku³u zanim go doda do bazy
danych.

Dodajmy do bazy danych kilka artyku³ów, a nastêpnie przejdŸmy

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 dodaliœmy do portalu. Obok ikony tematu wi-
daæ tytu³y artyku³ów dotycz¹cych danego tematu.

Rys. 4. Lista dostêpnych tematów z widocznymi artyku³ami

CMS

INTERNET.grudzieñ.2004

105

WARSZTAT

PROGRAMY

MAGAZYN

FIRMA

Z OK£ADKI

NEWSY

NA CD

"

C

M

Y

K

background image

Po klikniêciu wybranego artyku³u przejdziemy do strony przedsta-

wiaj¹cej tekst wybranego artyku³u. Rys. 5 przedstawia artyku³ Trzecia
zasada dynamiki
.

Rys. 5. Artyku³ wybrany z tematu Fizyka

Jeœli 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
artyku³y dotycz¹ce tematu. Przyk³ad takiej strony jest widoczny na rys. 6.

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-
doczny na rys. 7.

Rys. 7. Dwie sekcje Koty oraz Psy

Po dodaniu sekcji mo¿emy przyst¹piæ do dopisywania nowych

artyku³ów. Dodajemy dwa nowe wpisy dotycz¹ce pielêgnacji kotów.
Wybieraj¹c sekcjê Koty ujrzymy teraz listê dostêpnych artyku³ów
przedstawion¹ na rys. 8.

Rys. 8. Wszystkie artyku³y sekcji Koty

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 Zawartoœæ, 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. 10.

Kategorie

zawartoœci,

dostêpne

artyku³y

i jeden

wybrany

artyku³

CMS

INTERNET.grudzieñ.2004

106

NEWSY

Z OK£ADKI

FIRMA

MAGAZYN

PROGRAMY

WARSZTAT

!

NA CD

C

M

Y

K

background image

Wiadomości

Oprócz artyku³ów zawartych w tematach i sekcjach oraz stron zawar-
tych w kategoriach sekcji w portalu mo¿emy umieszczaæ wiadomoœci
bie¿¹ce (news). Do administracji wiadomoœciami s³u¿y ikona Wiado-
moœci
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, jeœli 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 treœæ, Who’s Online oraz Languages. Natomiast
modu³y s¹ osobnymi, funkcjonalnymi podstronami serwisu. Przyk³a-
dami modu³ów s¹ dzia³ download, tematy, sekcje, zawartoœæ, FAQ,
encyklopedia czy forum.

Rys. 11. Bloki Oczekuj¹ca treœæ, Who’s

Online oraz Languages

Dostosowuj¹c portal mo¿emy ustaliæ
liczbê, po³o¿enie oraz zawartoœæ blo-
ków, jak równie¿ dostêpnoœæ konkret-
nych modu³ów.

W naszym portalu wprowadzili-

œmy pewne artyku³y w tematach, sek-
cjach oraz zawartoœci, jak równie¿
dodaliœmy kilka newsów. Zatem tak
skonfigurujmy portal, by dostêpne
by³y jedynie modu³y odpowiedzialne
za tematy, sekcje, zawartoϾ oraz
wiadomoœci.

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), zawartoœci¹ (mo-
du³ Content) oraz wiadomoœciami
(modu³ News). Jeœli popatrzymy te-
raz na menu znajduj¹ce siê z lewej
strony na górze (w bloku zatytu³owa-
nym Modules), wówczas powinni-
œmy w nim ujrzeæ opcje Strona g³ów-
na, Content, Sections
oraz Topics.
Zawartoœæ bloku zosta³a przedsta-
wiona na rysunku 12.

Rys. 12. Blok zawieraj¹cy
modu³y Strona g³ówna,
Content, Sections
oraz Topics

Nastêpnie przechodzimy
do administracji bloka-
mi. W tabeli przedsta-
wiaj¹cej wszystkie bloki
deaktywujemy kolejno

wszystkie bloki oprócz Modules oraz Administration (blok ten wi-
dz¹ tylko administratorzy). Nastêpnie wylogowujemy siê z syste-
mu i odwiedzamy stronê g³ówn¹. Nasz portal zawiera teraz jedy-
nie trzy dzia³y, w których umieœciliœmy artyku³y. Na stronie
g³ównej zobaczymy menu g³ówne zawieraj¹ce blok Modules.

W centralnej kolumnie portalu widoczne s¹ wiadomoœci i artyku³y
dodane do dzia³u Tematy.

Rys. 13. Portal otrzymany po wykonaniu æwiczeñ omówionych

w artykule

Podsumowanie

Jak widaæ, instalacja pakietu i administracja w podstawowym za-
kresie nie stwarzaj¹ niemal ¿adnych trudnoœci. Nak³adem kilkuna-
stu minut nauki i pracy mo¿emy uruchomiæ rozbudowan¹ witrynê.
Jednak system PHP-Nuke nie jest pozbawiony wad. Poza wspo-
mnianymi problemami z bezpieczeñstwem, k³opoty sprawia mody-
fikacja wygl¹du witryny. Wprawdzie dostêpnych jest kilka warian-
tów uk³adu portalu, jednak nie ró¿ni¹ siê one istotnie miêdzy sob¹.
Jeœli zechcemy w znacznym stopniu zmodyfikowaæ uk³ad portalu,
to du¿¹ czêœæ zmian musimy wykonaæ modyfikuj¹c pliki Ÿród³owe.
Dodatkow¹ wad¹ jest brak mo¿liwoœci tworzenia drzewiastych
struktur informacyjnych. Ca³a klasyfikacja zawartoœci portalu pole-
ga na wykorzystaniu omówionych dzia³ów: tematów, sekcji, zawar-
toœci oraz newsów.

n

Ćwiczenia przedstawione w artykule są dostępne na stronie domowej autora
pod adresem

http://www.gajdaw.pl

CMS

INTERNET.grudzieñ.2004

107

WARSZTAT

PROGRAMY

MAGAZYN

FIRMA

Z OK£ADKI

NEWSY

NA CD

"

C

M

Y

K


Wyszukiwarka

Podobne podstrony:
PHP Bezpieczne programowanie phpbep
php bezpieczenstwo
PHP Bezpieczne programowanie phpbep
Poradnik Bezpieczeństwo sieci bezprzewodowych 12 2004
PHP Bezpieczne programowanie 3
PHP Bezpieczne programowanie phpbep
PHP Bezpieczne programowanie
PHP Bezpieczne programowanie
PHP Bezpieczne programowanie
PHP Bezpieczne programowanie phpbep
PHP Bezpieczne programowanie phpbep
PHP Bezpieczne programowanie
HTML Tabele HTML 12 2004
download Zarzadzanie Logistyka wykład na dzień 18.12.2004-[ www.potrzebujegotowki.pl ], Ściągi i wyp
Rozp MON z 12 2004 r w sprawie wzorów noszenia umundurowania odznak i oznak wojskowych oraz uzbro
14. Podstawowe aspekty bezpieczeństwa informacji (12.01.09), PODSTAWOWE ASPEKTY BEZPIECZEŃSTWA INFOR

więcej podobnych podstron