Nic
Nic
 Zoner.cz | Czechia.com | Inshop.cz | Interval.cz
Nic
Logo Interval.cz
Vyhledávání na serveru: Nic
rozšířené vyhledávání
Nic
 Grafika | Tvorba webu | Magazín | Software | E-komerce | Download | Diskuse
Nic
invisible
Reklama Nic Reklama

 Interval.cz > Tvorba webu > PHP > Zajímavé skripty > Autorizace uživatelů v PHP


Podsekce rubriky
Odrážka Začínáme s PHP
Odrážka Aplikace v PHP
Odrážka Zajímavé skripty
Nic
Knihy pro webmastery:
shop.interval.cz
Nic
Interval.cz
Odrážka Volná místa
Odrážka Napište nám
Odrážka Redakce serveru
Odrážka Archív článků
Nic
Reklama na Interval.cz
Nic
invisible
Czechia.com - registrace a web-hosting domén
invisible
Ověřte si doménu
.cz | .com | .net | .org

invisible


Nic
Powered by MS SQL 7.0
Nic
Konference
Přehled článků
HELP konference
Nic
Ochrana osobních údajů
Nic
Reklama
Nic
Pracovní příležitosti
Odrážka Člen týmu firemních analýz
Odrážka Koordinátor/ka útvaru prodeje významným zákazníkům
Odrážka Člen týmu rozvoje vztahů se zákazníky
Odrážka Koordinátor CRM programů
Odrážka Asistent/ka prodeje
Odrážka Manažer podpory prodejních kanálů
Odrážka Asistent/ka prodeje
Odrážka Člen týmu firemních analýz
Nic
Nic Nic Nic Nic Nic
Nic ATLAS.CZ Nic
Nic Nic
Nic Nic
Nic
Doporučujeme
Atlas.cz
DoKina Namodro
inShop.cz Flashland
Czechia Lupa.cz
Sova v síti
Nic Nic
Nic
Nic
Atlas.cz
Nic
Nic
Autorizace uživatelů v PHP
4.9.2001 |  Jiří Semecký |  Náhled pro tisk |  Přidat komentář | 

Programujete-li web a chcete, aby se uživatelé přihlašovali pod svým jménem a heslem, potřebujete při vstupu na stránky (kromě úvodní logovací) mít jistotu, že skutečně přistupuje ten uživatel, za kterého se vydává.

Způsobů, jak toho docílit je hned několik. Předávat heslo v adrese samozřejmě nelze, stejně jako nelze předávat pouze samostatné ID uživatele (kdokoli by si mohl zadat cizí ID, a tak se podívat na cizí účet). Já zde popisuji jeden ze způsobů, který lze použít již v PHP3. Jedná se o řešení předáváním zahashované kombinace uživatelského hesla a náhodného klíče.

Ochrana přístupu

Ochrana přístupu uživatele je v popisovaném řešení zajištěna třemi základními vlastnostmi:

  • není předáváno jméno ani heslo uživatele
  • předávaný autorizační klíč je dostatečně dlouhý, aby se nedal zapamatovat pohledem
  • autorizační klíč se mění při každém přechodu ze stránky na stránku, tedy v momentě jeho zobrazení v poli adresy je již neplatný

Nyní se podívejme, jak se těchto vlastností dosáhne.

Princip řešení

Při přihlášení a úspěšné autorizaci uživatele pomocí jména a hesla na úvodní stránce je vygenerován náhodný klíč (nemusí být nijak dlouhý). Tento klíč se uloží do databáze uživatele (stačí klasický sloupec typu INT - v MySQL). Následně je kombinace hesla a vygenerovaného klíče zahashována do dlouhého těžko zapamatovatelného řetězce - kódu, který se předává následujícím stránkám v adrese jako proměnná.

Při vstupu na další stránku se z databáze přečte heslo a kód odpovídající uživateli s daným ID. Pomocí stejné hashovací funkce se zjistí správný kód a ten se porovná s kódem předaným v adrese. Jestliže jsou stejné, je uživatel kladně ověřen. Dále se vygeneruje nový náhodný klíč, opět uloží do databáze a znovu zahashuje s heslem.

Zahashování znamená jednoznačné zakódování na číslo, popř. řetězec pomocí nějaké funkce. Přitom se předpokládá, že dobrá hashovací funkce bude přiřazovat výsledky rovnoměrně do oboru hodnot, i když vstupní hodnoty rovnoměrně zadávány nebudou. Tedy i pro velmi podobné vstupy funkce vrátí velmi nepodobné hodnoty.

Implementace řešení

Pro implementaci tohoto zabezpečení jsem použil databázi MySQL a předpokládám, že mám tabulku UZIVATELE se sloupci ID, KLIC typu INT.

Jako hashovací funkci jsem použil funkci md5, která je standardní součástí PHP (oddíl Strings). Tato funkce kóduje (hashuje) řetězec na řetězec na základě algoritmu Message-Digest. Ke spojení hesla a kódu je použita klasická konkatenace (spojení) řetězců. Ukázka činnosti funkce md5 je zde:

md5("heslo") = "955db0b81ef1989b4a4dfeae8061a9a6"
md5("veslo") = "4bf643bf3816722ac9cbed5b6bb6c3c6"
md5("veslo2") = "db70577ce6a3772f22170f2a6cd8d171"

Takto vypadá funkce, která vygeneruje klíč, uloží jej do databáze a vrátí kód:

function novy_kod($id) {
   // Vygenerování klíče
   $klic = rand(0,9999);

   // Uložení klíče
   mysql_query("UPDATE UZIVATELE SET KLIC=\"$klic\" WHERE ID=\"$id\";");

   // Vygenerování kódu
   list($heslo) = mysql_fetch_row( mysql_query("SELECT HESLO FROM UZIVATELE WHERE ID=\"$id\";") );
   $kod = md5($heslo.$klic);

   return $kod;
}

Následující funkce provádí autorizaci uživatele a vrací úspěšnost:

function Autorizace($kod, $id) {
   // Načtení hesla a klíče z databáze
   list($db_heslo, $db_klic) = mysql_fetch_row( mysql_query("SELECT HESLO, KLIC FROM UZIVATELE WHERE ID=\"$id\";") );

   // Vygenerování kódu
   $spravny_kod = md5($db_heslo.$db_klic);

   // Test správnosti kódu
   return ($spravny_kod == $kod);
}

Na svých stránkách pak už jen voláte funkci Autorizace a v případě úspěchu vygenerujte nový klíč. Ukázka stránky pak může vypadat následovně:

<?
if (!Autorizace($kod, $id)) {
   Header("Location: chyba.php");
   exit;
   }
$kod = novy_kod($id);
?>
<a href="jinastranka.php?id=<?echo $id?>&kod=<?echo $kod?>">Jiná stránka</a>

Tyto ukázky jsou pouze ilustrační a chybí v nich ošetření databázových chyb.

Uvědomte si, že heslo není nikde posíláno mezi serverem a klientem (samozřejmě kromě úvodního zalogování) a veškerá práce s ním neopustí server. Přesto je vždy ověřeno, že se jedná o téhož uživatele jako minule. Dále je také třeba si uvědomit, že když se uživatel pokusí přihlásit ze svou různých míst (stačí 2 okna prohlížeče na stejném počítači), první session skončí chybou.

Jiná řešení

Další možná řešení problému, která se v praxi používají, je uchováváni IP adresy, ze které se uživatel přihlásí, a její expirace po jisté době nečinnosti (např. 30 min). V PHP4 máte navíc možnost použít tzv. sessions, které umožňují uchovávat hodnoty proměnných v průběhu několika HTTP volání (request) aniž by byly předávány v adrese stránky.

Zaujal vás článek? Pošlete nám přes toto rozhraní dobrovolný příspěvek formou mikroplatby v systému I LIKE Q (vlevo - Q) anebo v DirectPay (vpravo - kredity).
 poslat  Q - 


poslat  kreditů - 


Směnný poměr - 100 Q (I LIKE Q) anebo 100 kreditů (DirectPay) je rovno 1 Kč.

Jiří Semecký - Další články autora

 Diskuse: Autorizace uživatelů v PHP
04.09.01, 07:33 Jenich proc PHP3??
04.09.01, 07:40 Mira Kaas ccproc PHP3??
05.09.01, 08:55 miso ccccproc PHP3??
05.09.01, 09:55 Mira Kaas ccccccproc PHP3??
04.09.01, 07:35 Mira Kaas postreh
04.09.01, 19:23 Honza Šrámek Proč takto?
05.09.01, 09:34 -Ladis- ccProč takto?
07.09.01, 14:54 Jiří Semecký ccccProč takto?
05.09.01, 19:52 zdenek co treba toto..??
06.09.01, 23:07 JS ccco treba toto..??
07.09.01, 14:58 Jiří Semecký ccccco treba toto..??
12.09.01, 14:29 Radek Doležal Vylepšení.
12.09.01, 20:54 tomik ccRE: Vylepšení.
Zobrazit vše |  Přidat nový


Funkce ke článku
Náhled pro tisk
Doporučit článek
Přidat komentář
invisible
Textová inzerce
Odrážka DIRECTPAY - zajímavý mikroplatební systém pro český Internet.
Nic
Nic
Nic
invisible
Známkování článku
Hodnoťte jako ve škole:
Vyber: 1 | 2 | 3 | 4 | 5
Hlasovalo: 356 čtenářů
Výsledek: 2,91

Aktuální články
Odrážka Knihovny skriptů a jejich úskalí
Odrážka Podmíněné komentáře v Internet Exploreru
Odrážka Aby se o vašich stránkách vědělo
Odrážka Vlastný reklamný systém v PHP, 1. diel
Odrážka Řádkový klient a administrátor MySQL
invisible
Oblíbené články
Odrážka Jednoduchá anketa v PHP
Odrážka Univerzální PHP skript pro odesílání formulářů
Odrážka Autorizace uživatelů v PHP
Odrážka Stránko moje, jakou návštěvnost dnes máš?
Odrážka Počet současně připojených uživatelů v PHP
invisible
Další články v rubrice
Odrážka Vlastní indikátor ICQ online/offline v PHP
Odrážka Vícejazyčná verze webových stránek
Odrážka Univerzálny dynamický výber pomocou PHP
Odrážka Jednoduchý internetový obchod v PHP, 2. díl
Odrážka Jednoduchý internetový obchod v PHP, 1. díl
invisible
Vydáno před rokem
Odrážka Macromedia FLASH 5 - základy animace
invisible
Reklama

 Grafika | Tvorba webu | Magazín | Software | E-komerce | Download | Diskuse

Doplněk