LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP (72) - Hrátky s uživateli

Dnes se na našem výcvikovém portále naučíme odesílat zapomenutá hesla, měnit hesla a rušit uživatelské registrace.

29.11.2004 15:00 | Petr Zajíc | Články autora | přečteno 52137×

Komerční sdělení: Pořádáme Kurzy PHP

Na našem výukovém hudebním portále již umíme uživatele zaregistrovat, přihlásit jej a odhlásit. Dnes dokončíme práci na správě uživatelů tím, že se zamyslíme nad odesíláním zapomenutého hesla, změnou hesla a nad zrušením registrace.

Zapomenuté heslo

U zapomenutého hesla bude nejlepší, když se pokusíme uvažovat jako uživatel. Kdy vlastně bude chtít uživatel odeslat zapomenuté heslo? Bude to pochopitelně v momentě, kdy není přihlášen, a pečlivým rozborem zjistíme, že to může nastat minimálně ve dvou případech:

  • když se uživatel pokusí přihlásit pod správným jménem, ale špatným heslem
  • když se uživatel pokusí znovu se registrovat na již existující e-mail

Jak mu heslo připomeneme? Heslo je v databázi uloženo v tabulce uzivatele společně s přezdívkou a e-mailem, přičemž přezdívka i e-mail musejí být v rámci tabulky uživatelů jednoznačné. To hlídá již skript registrace.php. Takže k připomenutí hesla nám stačí znát přezdívku nebo e-mail a můžeme zapomětlivému uživateli jeho heslo poslat.

Uvědomme si, že aby byl celý skript trochu uživatelsky přítulný, neměl by požadovat vyplnění většího množství informací, než je nutné. V praxi nám postačí sestavit formulář s jedním polem, a programátorsky z něj pak zjistit, zda obsahuje přezdívku nebo zda jde o e-mail. Použijeme přitom následující úvahu: Pokud v předaném řetězci není zavináč, nemůže to být e-mail (protože to jsme již kontrolovali při založení účtu) a budeme tudíž prohledávat přezdívky. Na druhou stranu, pokud předaný řetězec bude obsahovat zavináč, může to být jak e-mail, tak i přezdívka. Prohledáme nejprve e-maily, a když nic nenajdeme podíváme se v druhém kole na přezdívky. V každém případě vrátíme buď ID nalezeného uživatele, nebo hodnotu false pokud se nic nenašlo.

Pozn.: Vracení ID nebo hodnoty false si klidně můžeme dovolit, neb bezpečně víme, že žádný uživatel nemůže mít ID rovnající se nule (což by s hodnotou false kolidovalo). Víme to proto, že jsme v definici tabulky uživatelů nastavili automatické číslování, a to začíná ve výchozím stavu od jedničky.

Celý skript si můžete prohlédnout zde. Mohla by Vás tam překvapit funkce pripomenutozid, která z databáze zjišťuje údaj o tom, zda a kdy jsme uživateli naposledy odesílali zapomenuté heslo. My to chceme dělat maximálně jednou denně. Jak můžete vidět, je při odeslání hesla údaj o čase do databáze ukládán jako výsledek funkce now(). Ta není tak dobrá, jak bychom potřebvali, protože ukládá datumy de facto jako čísla reprezentující řetězec. Jejich rozdíl vracíme pomocí mysql funkce unix_timestamp, která je převede na vzájemně porovnatelná čísla.

Pozn.: Další dobré řešení je ukládat rovnou datumy jako unixová časová razítka. Asi se ptáte, proč jsem to neudělal. Ono to má zase nevýhodu - na první juknutí nelze tento údaj přepočítat na datum, takže funkce se dost špatně ladí.

Navíc může nastat situace, kdy se heslo nepřipomínalo ještě nikdy a údaj pripomenuto z tabulky uživatelů vrátí hodnotu NULL. Hodnota NULL bude v databázi z toho prostého důvodu, že to je výchozí hodnota a žádnou hodnotu jsme při registraci uživatele nespecifikovali. V takovém případě samozřejmě chceme zapomenuté heslo odeslat.

Pozn.: Hodnota NULL se rozšiřuje skrze výrazy. Proto si můžeme dovolit předpokládat, že rozdíl číslo-NULL = NULL a na to náš skript spoléhá.

Zbývá jediné - vložit odkaz pro skript na ta "správná" místa. To bude jednak při špatném přihlášení ve skriptu prihlaseni.php, kam přidáme jeden řádek kódu:

<?
  
//...
  
if (!isset($_SESSION["id"]))
  {
    echo
"Uživatelské jméno a/nebo heslo nesouhlasí ";
    echo
"(<a href=\"index.php?clanek=zapomenuteheslo\">připomenout heslo</a>)";
  }
  else
  {
    
$BudemeZobrazovat=false;
    echo
"Přihlášen ".$_POST["prezdivka"];
  }  
  
// atd...
?>

A jednak při pokusu použít existující login pro novou registraci. To bude v souboru registrace.php v části, v níž kontrolujeme jednoznačnost přezdívky:

<?
  
//...
    
elseif (prezdivkavdb ($_POST["prezdivka"], $link))
    {
      echo
"Uvedená přezdívka je již registrována ";
      echo
"(<a href=\"index.php?clanek=zapomenuteheslo\">připomenout heslo</a>)";
    }
  
// atd...
?>

Změna hesla

Tuto část portálu nebudeme nijak komplikovat; postačí nám, když uživatel zadá nové heslo a odešle formulář - to provede aktualizační skript v databázi a je to. V praxi bývá zvykem připojit ještě dvě vychytávky, a to:

  1. Nové heslo se musí zadat dvakrát a skript kontroluje, zda to souhlasí. Což je ochrana proti překlepu.
  2. Před zadáním nového hesla se ještě musí zadat to původní, aby se náhodou nestalo, že přihlášený uživatel odběhne od svého stroje a škodolibý kolega mu mezitím heslo změní.

My se spokojíme s jednoduchým formulářem, který bude uložen a zpracováván ve skriptu zmenahesla.php. Jediný problém je, kam odkaz na změnu hesla na stránce umístit - prozatím jej dáme například před odkaz Odhlášení a budeme jej zobrazovat JEN PRO PŘIHLÁŠENÉ uživatele. Změna se tedy týká souboru navigace.php.

Mohlo by se zdát, že postačí mít "výkonný" příkaz skriptu zmenahesla.php ve tvaru:

mysql_query ("update uzivatele set heslo = '".$_POST["heslo"]."' where id=".$_SESSION["id"].";", $link);

a spoléhat na to, že pokud nebude bude proměnná $_SESSION["id"] nastavena, zaktualizuje databáze nulový počet řádků. Je však lepší "hrát na jistotu" a pojistit se podmínkou:

if (isset($_SESSION["id"])) mysql_query ("update uzivatele set heslo = '".$_POST["heslo"]."' where id=".$_SESSION["id"].";", $link);

protože nikdy nevíme, jak se v tomto ohledu budou chovat nově vydané verze databází.

Zrušení registrace

Rovněž zrušení registrace uděláme jednoduché. Prostě smažeme z databáze řádek s údaji o daném uživateli, takže se následně nebude moci přihlásit. Musíme přitom ale dát pozor na jednu věc - uživatele musíme rovněž odhlásit a uzavřít jeho session. Jinak by se aplikace mohla chovat nevypočitatelně.

Celé se to provede hned ve skriptu index.php, takže zbytek stránky již bude vědět, že uživatel není přihlášen. Ovšem odpovídající odkaz v souboru navigace.php nepovede na zrušení registrace rovnou, nejprve bude uživatel nasměrován na stránku, kde se ho zeptáme, zda to opravdu myslí vážně. Pokud ano, poskytneme mu teprve odkaz na zrušení registrace.

Pozn.: Ve firemní praxi by se zcela určitě záznam nemazal. Namísto toho by se mu dal nějaký příznak (např. pole DELETED), který by představoval informaci o tom, že uživatel se odregistroval, ale záznam v databázi by se uschoval. Důvodů je více - napadá mě statistika, bezpečnost nebo návaznost na jiná data v systému. My si však nebudeme komplikovat život a řádek odstraníme.

Změny na portálu

Nové soubory:

Změněné soubory:

Na současný stav projektu se můžete na našem webu podívat nebo si jej můžete stáhnout.

Pozn.: Aby Vám stažená verze fungovala na lokálním stroji, upravte si hodnotu konstant SQL_HOST, SQL_USERNAME, SQL_PASSWORD a SQL_DBNAME. Případně si je můžete včlenit do konfiguračního souboru podobně, jako jsem to udělal v souboru func.php.

Verze pro tisk

pridej.cz

 

DISKUZE

Drobná zmena 25.10.2006 13:53 Peter Rožnay
L Re: Drobná zmena 25.10.2006 15:50 Petr Zajíc
chyba v suboroch k stiahnutiu 9.3.2008 21:40 vesp
Heslo 23.10.2009 12:51 Martin Krivos
L Re: Heslo 2.5.2011 02:27 Patrick "Kusoš" Kusebauch
Odesílání zapomenutého hesla? 2.5.2011 02:31 Patrick "Kusoš" Kusebauch




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

27.2.2017 22:12 /František Kučera
Pozvánka na 137. sraz OpenAlt – Praha: Tentokrát jsme si pro vás připravili neobvyklou akci. Ve středu 1.3. v 17:30 nás přivítá sdružení CZ.NIC ve svých prostorách v Milešovské ulici číslo 5 na Praze 3, kde si pro nás připravili krátkou prezentaci jejich činnosti. Následně navštívíme jejich datacentrum pod Žižkovskou věží. Provedou nás prostory, které jsou běžnému smrtelníkovi nedostupné!
Po ukončení prohlídky se všchni odebereme do hostince U vodoucha, Jagelonská 21, Praha 3 pochutnat si na některém z vybraných piv či dát si něco na zub. Rezervaci máme od 19:30, heslo je OpenAlt.
Ale pozor! Do prostor datového centra máme omezený přístup, dostane se tam pouze 10 lidí! Takže kdo přijde dříve, ten má přednost, a občanky s sebou! Kdo nebude chtít na prohlídku datového centra, může se pomalu přesunout do hostince U vodoucha a u nepřeberné nabídky piv počkat na ostatní.
Přidat komentář

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

8.1.2017 17:51 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 19. ledna od 18:30 v pražském hackerspacu Brmlab. Tentokrát je tématem srazu ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. K vidění bude mechanická klávesnice dasKeyboard, trackball Logitech nebo grafický tablet (a velký touchpad) Wacom. Přineste i vy ukázat svoje zajímavé klávesnice a další HW. V 18:20 je sraz před budovou, v 18:30 jdeme společně dovnitř, je tedy dobré přijít včas. Podle zájmu se později přesuneme do nějaké restaurace v okolí.
Přidat komentář

1.12.2016 22:13 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.
Komentářů: 1

4.9.2016 20:13 /Pavel `Goldenfish' Kysilka
PR: Dne 22.9.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, provozování ERP v cloudu, o hostování různých typů softwaru, ale třeba i o zálohování dat nabízeném podnikům formou služby.
Přidat komentář

1.9.2016 11:27 /Honza Javorek
Česká konference o Pythonu, PyCon CZ, stále hledá přednášející skrz dobrovolné přihlášky. Máte-li zajímavé téma, neváhejte a zkuste jej přihlásit, uzávěrka je již 12. září. Konference letos přijímá i přednášky v češtině a nabízí pomoc s přípravou začínajícím speakerům. Řečníci mají navíc vstup zadarmo! Více na webu.
Přidat komentář

27.8.2016 8:55 /Delujek
Dnes po 4 letech komunitního vývoje vyšla diaspora 0.6.0.0
diaspora* je open-source, distribuovaná sociální síť s důrazem na soukromý
Více v oficiálním blog-postu
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

24.3.2017 11:54 / Hui
country cottages

16.3.2017 16:33 / BezvaDesign.cz
Re: Hledám grafika do teamu

9.3.2017 11:44 / Jaromir Obr
Re: chyba

18.1.2017 20:18 / martin horky
Spolupraca linuxu a microsoftu

17.1.2017 9:57 / Pavel Hrubeš
Re: Externí USB televizní karta

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze