HOME > HOWTO > WEBCODINGHOWTO

Autorizace pomocí PHP a MySQL III

7. Leden 2002, 00:00 (87624x zobrazeno)

Už se nebudu rozepisovat o výhodách nebo nevýhodách jednotlivých řešení, ty jsem nastínil v minulém dílu (Autorizace pomocí PHP a MySQL II), dnes si ukážeme jen okomentované zdrojové kódy.

Pro všechny 3 způsoby budeme využívat následující MySQL tabulku

CREATE TABLE users 
(
id int(2) NOT NULL auto_increment,
login varchar(20) NOT NULL default '',
password varchar(32) NOT NULL default '',
name varchar(32) NOT NULL default '',
email varchar(32) NOT NULL default '',
PRIMARY KEY  (id),
UNIQUE KEY id (id)
);

1. HTTP Autorizace

Na začátku všech stránek v chráněné části

<?
Header("Pragma: No-cache");
Header("Cache-Control: No-cache, Must-revalidate");
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");

If (!IsSet($PHP_AUTH_USER)): // pokud uživatel právě přišel, zobrazíme formulář
Header("HTTP/1.0 401 Unauthorized");
Header("WWW-Authenticate: Basic realm=\"HTTP Autorizace\"");
echo "Neautorizovaný přístup"; // když nic nevyplní, vypíšeme chybové hlášení
Exit;
Else: // pokud uživatel vyplnil formulář, ověříme data v databázi

$MC = MySQL_Connect("localhost", "username", "password"); // připojíme se k databázi
$MS = MySQL_Select_DB("db");

$password = MD5($PHP_AUTH_PW); // pomocí funkce MD5 zjistíme kódovanou podobu hesla
$MSQ = MySQL_Query("SELECT * FROM users WHERE (login LIKE '$PHP_AUTH_USER') AND (password LIKE
'$password')");

If (MySQL_Num_Rows($MSQ) == 0): // pokud takový uživatel není, vyhodíme ho
Header("HTTP/1.0 401 Unauthorized");
Header("WWW-Authenticate: Basic realm=\"HTTP Autorizace\"");
echo "Neautorizovaný přístup";
Exit;
Endif;
Endif;
MySQL_Close($MC); // uzavřeme spojení s databází
?>
PHP (HTML) kód, který se má provést (vypsat) při úspěšném přihlášení

2. Cookies

Zdrojový kód úvodní (přihlašovací) stránky

<?
Header("Pragma: No-cache");
Header("Cache-Control: No-cache, Must-revalidate");
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");


$MC = MySQL_Connect("localhost", "username", "password"); // připojíme se k databázi
$MS = MySQL_Select_DB("db");

If (IsSet($id)): // pokud existuje proměnná $id, smažeme cookie a tím uživatele odhlásíme
SetCookie("autorizace");
echo "Byl(a) jste odhlášen(a)!"; 
Endif;

If (($login <> "") AND ($password <> "")): // pokud byly zadány login i password
$password = MD5($password);
$MSQ = MySQL_Query("SELECT id FROM users WHERE (login LIKE '$login') AND (password LIKE
'$password')");

If (MySQL_Num_Rows($MSQ) <> 1): // pokud vrátí dotaz jiný počet záznamů než 1, vyhodíme
uživatele 
echo "Neautorizovaný přístup";
Exit;
Else:
SetCookie("autorizace", "true", Date("U") + 15*60); // zašleme cookie s časem expirace o 15 minut
větším než je současný čas
Header("Location: http://www.server.cz/stranka.php"); // přesměrujeme uživatele na první stránku
chráněné části
Endif;
Endif;
MySQL_Close($MC); // uzavřeme spojení s dazabází
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>Autorizace</title>
</head>

<body>
<form action="index.php" method="post">
<input type="Text" name="login" size="20" maxlength="20" value=""><br>
<input type="Password" name="password" size="20" maxlength="20" value=""><br>
<input type="Submit" value="Přihlásit">
</form>  
</body>
</html>

Na začátku všech ostatních stránek v chráněné části

<?
Header("Pragma: No-cache");
Header("Cache-Control: No-cache, Must-revalidate");
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");

$MC = MySQL_Connect("localhost", "username", "password"); // připojíme se k databázi
$MS = MySQL_Select_DB("db");

If (!IsSet($autorizace)): // pokud cookie neexistuje, vyhodíme uživatele
echo "Neautorizovaný přístup";
Exit;
Else:
SetCookie("autorizace", "true", Date("U") + 15*60); // pošleme cookie s novějším časem expirace
Endif;
MySQL_Close($MC); // uzavřeme spojení s databází
?>
PHP (HTML) kód, který se má provést (vypsat) při úspěšném přihlášení
<a href="index.php?id=true">Odhlásit se</a>  

3. Jedinečný identifikátor předávaný v URL

U tohoto způsobu budeme potřebovat ještě navíc tabulku autorizace - budeme do ní ukládat novou hodnotu klíče - více pochopíte ze zrojových kódů...

CREATE TABLE autorizace (
  id int(2) NOT NULL auto_increment,
  dbkey int(3) NOT NULL default '0',
  PRIMARY KEY  (id),
  UNIQUE KEY id (id)
) TYPE=MyISAM;

Zdrojový kód úvodní (přihlašovací) stránky

<?
Header("Pragma: No-cache");
Header("Cache-Control: No-cache, Must-revalidate");
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");

$MC = MySQL_Connect("localhost", "username", "password"); // připojíme se k databázi
$MS = MySQL_Select_DB("db");

If (IsSet($id)): // pokud existuje proměnná $id značící odhlášení, smažeme záznam z databáze
$MSQ = MySQL_Query("DELETE FROM autorizace WHERE id = $id");
echo "Byl(a) jste odhlášen(a)!"; 
Endif;

If (($login <> "") AND ($password <> "")): // pokud byly zadány login i password
$password = MD5($password);
$MSQ = MySQL_Query("SELECT id FROM users WHERE (login LIKE '$login') AND (password LIKE
'$password')");
$id = MySQL_Result($MSQ, 0);

If (MySQL_Num_Rows($MSQ) <> 1): // pokud vrátí dotaz jiný počet záznamů než 1, vyhodíme
uživatele
echo "Neautorizovaný přístup";
Exit;
Else:
SRand ((double)MicroTime()*1e6); // inicializujeme generátor náhodných čísel
$key = Rand (0, 999); // získáme náhodné číslo od 0 do 999
$MSQ = MySQL_Query("DELETE FROM autorizace WHERE id = $id"); // pokud existuje záznam o uživateli,
smažeme ho
$MSQ = MySQL_Query("INSERT INTO autorizace VALUES ($id, $key)"); // vložíme data
$kod = MD5($password.$key); // získáme kód zakódováním řetězce pomocí funkce MD5
Header("Location: http://www.server.cz/stranka.php?id=".$id."&kod=".$kod.""); 
// přesměrujeme uživatele na první stránku chráněné části s potřebnými hodnotami
Endif;
Endif;
MySQL_Close($MC); // uzavřeme spojení s databází
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
<title>Autorizace</title>
</head>

<body>
<form action="index.php" method="post">
<input type="Text" name="login" size="20" maxlength="20" value=""><br>
<input type="Password" name="password" size="20" maxlength="20" value=""><br>
<input type="Submit" value="Přihlásit">
</form>  
</body>
</html>

Na začátku všech ostatních stránek v chráněné části

<?
Header("Pragma: No-cache");
Header("Cache-Control: No-cache, Must-revalidate");
Header("Expires: ".GMDate("D, d M Y H:i:s")." GMT");

$MC = MySQL_Connect("localhost", "username", "password"); // připojíme se k databázi
$MS = MySQL_Select_DB("db");

Function Autorizace ($kod, $id) 
{
$MSQ = MySQL_Query("SELECT u.password AS password, a.dbkey AS dbkey FROM users u, autoriace a 
WHERE (u.id = $id) AND (u.id = a.id)");
// zjistíme heslo a klíč k odpovídajícímu id
$password = MySQL_Result($MSQ, 0, "password");
$dbkey = MySQL_Result($MSQ, 0, "dbkey");
$nkod = MD5($password.$dbkey); // zakódujeme je pomocí funkce MD5

If ($nkod <> $kod): // pokud se starý kód (z URL) a nový kód (z databáze) neshodují, vrátíme
jako výsledek funkce 1, jinak 0
return 1;
Else:
return 0;
Endif;
}  

Function Retezec ($id) 
{
SRand ((double)MicroTime()*1e6); // inicializujeme generátor náhodných čísel
$key = Rand (0, 999); // získáme náhodné číslo od 0 do 999
$MSQ = MySQL_Query("UPDATE autorizace SET dbkey = $key WHERE id = $id"); // aktualizujeme záznam v
databázi
$MSQ = MySQL_Query("SELECT password FROM users WHERE id = $id"); // zjistíme heslo k odpovídajícímu
id
$password = MySQL_Result($MSQ, 0);
$kod = MD5($password.$key); // vygenerujeme nový kód
return $kod; // vrátíme ho jako výsledek funkce
}  

If (Autorizace ($kod, $id) == 1): // pokud neproběhla autorizace korektně, vyhodíme uživatele
echo "Neautorizovaný přístup";
Exit;
Endif;
$kod = Retezec ($id); // získáme nový kód
MySQL_Close($MC); // uzavřeme spojení s databází
?>
PHP (HTML) kód, který se má provést (vypsat) při úspěšném přihlášení
<a href="a.php?id=<?echo $id?>&kod=<?echo $kod?>">Odkaz jinam</a> 
// pomocí odkazů předáváme po celé chráněné části id a kód uživatele
<a href="index.php?id=<?echo $id;?>">Odhlásit se</a> // odkaz pro odhlášení

Uvedená řešení nejsou zdaleka dokonalá a je na nich hodně co vylepšovat (ošetření databázových chyb atd.), nicméně úkolem tohoto miniseriálu nebylo předložit vám dokonale vyřešenou autorizaci, ale spíše vám vysvětlit základní algoritmy, ze kterých lze vycházet při vývoji vlastního, na míru šitého, řešení...

Tím jsme vyčerpali všechna běžně používaná řešení. U mě jsou v pořadí (od nejlepšího k nejhoršímu) sessions, jedinečný identifikátor, HTTP Autorizace, cookies. Máte-li jiný názor, nabízím diskusní fórum...

autor: Jan Šrámek

Líbil se vám článek?

3.29 (7x hodnoceno)12345

Přidejte si článek do oblíbených

Linkuj.cz ico linkuj.czdel.icio.us icodel.icio.usrss icorss - HOWTOrss icorss - HOWTO > WEBCODING

Související články

Komentáře

related

serialy

nejctenejsi clanky

hledas job ?

nejkomentovanejsi clanky

reboot girl

 

POLITICKY ROZCESTNIK a RSS AGREGATOR  SEZNAMKA PRAHA  Politicky magazin JP  POLITICKE INFORMACNI CENTRUM  www.czfree.net  Hack This Page  Vlastenecka politicka strana  Ja PATRIOT | vyberovy magazin  www.BASTARDSERVERS.com  DEBIAN GNU LINUX 
www.blackhole.cz  www.linux.sk  www.abclinuxu.cz  www.underground.cz  MAGAZIN O POLITICE  PATRIOTI - Narodne vlastenecka strana  www.linuxzone.cz  www.root.cz  www.penguin.cz  www.krypta.cz 
AGREGATOR  Mr.NETWOR  POLITIKA PRAHA BRNO OSTRAVA  BASTARD NEWS  G$BIT SERVERS  geek music  www.soom.cz  Novinky z politiky  HackThisPage  Strana ÄŚeskĂ˝ch PatriotĹŻ 
CZECH GEEK FEED  Patrioti CR  photopost.cz  apsara.cz  PODPOR PATRIOTY  sport, outdoor, cyklo obchod  dfklub.cz  www.zi.cz  DOMOBRANA - KOHO ZAVOLAS  PATRIOTI - CESKA NARODNI PRAVICE