Jednoduché prihlasovanie, registrácia užívateľov
Prejdime priamo k veci. Vytvoríme si v databáze tabuľku ‘uzivatelia’:
CREATE TABLE `uzivatelia` ( `id` int NOT NULL auto_increment primary key, `meno` tinytext NOT NULL, `heslo` tinytext NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_slovak_ci AUTO_INCREMENT=1;
ID bude primárny kľúč a budeme s ním môcť identifikovať jednotlivých užívateľov. Stĺpec ‘meno’ bude obsahovať vždy nick užívateľa a ‘heslo’ bude obsahovať heslo uvedené pri registrácii v zašifrovanej podobe. Heslo budeme “šifrovať” tak, že určeným hashovacím algoritmom vypočítame hash hodnotu hesla, ktorú uložíme do databáze a pri prihlasovaní len overíme, či prihlasovacie heslo (teda tiež jeho zašifrovaná hodnota) zodpovedá tej uvedenej pri registrácii, uloženej v databáze.
Najprv si zhotovíme jednoduchú registráciu (upozorňujem, že v tomto článku sa nezaoberám filtrovaním vstupu a nezapezpečujem svoj kód; účel článku je úplne iný) . Formulár budeme mať v súbore, ktorý pomenujeme napríklad registracia.html . Kód je nasledovný…
<h2>Registrácia</h2> <form action="registracia.php" method="post"> <p>Meno: <input type="text" name="meno"/></p> <p>Heslo: <input type="password" name="heslo"/></p> <p><input type="submit" /></p> </form>
Teraz si napíšeme súbor, ktorý spracuje požiadavok z registračného formulára a pomenujeme ho registracia.php . Kód…
<?php
// deklarujeme si vstupne premenne
$meno = $_POST['meno'];
$heslo = sha1($_POST['heslo']); # sha1 je hashovacia f-cia. Viac na php.net
mysql_query("INSERT INTO uzivatelia(meno,heslo) VALUES('$meno','$heslo' )")
or die("Užívateľa sa nepodarilo registrovať.");
?>
Týmto sme vyriešili registráciu (odfiltrovanie nebezpečného vstupu a iné bezpečnostné veci nechám na vás). Teraz by sme si mohli spraviť prihlasovací dialóg. Keď užívateľ zadá platné meno a zodpovedajúce heslo, jeho status (pomocou SESSION) sa zmení na ‘prihlásený’. V inom prípade sa zobrazí škaredá hláška, že zadal neplatné údaje.
Kód prihlasovacieho dialógu login.html:
<h2>Prihlásenie</h2> <form action="login.php" method="post"> <p>Prihlasovacie meno: <input type="text" name="meno"/></p> <p>Prihlasovacie heslo: <input type="password" name="heslo"/></p> <p><input type="submit" value="Prihlásiť" /></p> </form>
Súbor login.php obsahuje nasledujúci kód…
<?php
// deklarujeme uzivatelsky vstup
$meno = $_POST['meno'];
$heslo = sha1($_POST['heslo']); # ziskame heslo v sifrovanej podobe
// ziskame heslo pre urcene meno
$result = mysql_query("SELECT heslo FROM uzivatelia WHERE meno='$meno'");
$row = mysql_fetch_row($result); // v $row[0] je ulozene heslo
// overime spravnost hesla
if($heslo == $row[0])
{
$_SESSION['prihlaseny'] = 'ano';
}
else
{
echo "Zadali ste neplatné meno alebo heslo!";
}
?>
Ak sa užívateľ úspešne prihlásil, môže pristupovať na stránky, ktoré zabezpečíme týmto kódom (vkladajte pred chránený kód):
<?php
if($_SESSION['prihlaseny'] != 'ano')
die("Nepovolený vstup! Najprv sa prihláste.");
?>
Pred použitím SESSION budeme musieť použiť direktívu session_start() na začiatku dokumentu. Popis hashovacích funkcií a teóriu šifrovania skúsim rozobrať v samostatnom článku. Ale zásadné pravidlo, ktoré platí pri vývoji webových aplikácií, je bezpečnosť. Nezabezpečená webová aplikácia s citlivými dátami môže narobiť viac škody, než žiadna.
Cieľom tohto článku bolo vysvetliť princípy registrácie a následného prihlasovania užívateľov za využitia SESSIONs. Aby bol článok úplný, pridávam kód, ktorý spôsobí odhlásenie užívateľa. Stačí, ak pridáte kdekoľvek na stránku odkaz v tvare:
<a href="logout.php">Odhlásiť užívateľa</a>
a súbor logout.php bude obsahovať tento kód…
<?php unset($_SESSION['prihlaseny']); // znicime zaznam o prihlaseni ?>















dobry den, chcel by som sa spytat ci by ste mi nemohli poradit, stale mi vyhadzuje chybu v riadku $row = mysql_fetch_row($result); a neviem preco, toto mi tam pise Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in
Samozrejme, poradiť vám skúsiť môžem…
Tak za 1. nie je to chyba. Je to warning, teda varovanie. Niekedy to môže naznačovať niečo vážne a niekedy to vyhodí hocijakú blbosť, ale je dobré to ošetriť. Vo vašom prípade neviem, čo to môže byť.
2. Ako ste si mohli všimnúť, $result je VALID RESULT RESOURCE(!) a preto neviem, prečo to robí problémy.
Poprosím vás, ak máte záujem o riešenie, ozvite sa mi na email. Potreboval by som vidieť celý kód. Niekedy je chybička krásy nejaký zabudnutý detail. Napadá ma pár vecí, ktoré by mohli robiť problémy, ale sú to len dohady a nechcem ich sem vypisovať. Potom sem postnem riešenie. Pekný deň.
dobry den chcela by som sa spytat ci by ste mi nepomohli potrebujem pomoct lebo mi ta registracia nejde skopirujem ten html kod ale nejde mi to dam nick aj heslo ale ked dam ok nic mi nenacita len cistu stranku a to iste sa stane s prihlasenim mohli by ste mi pomoct za odpoved wopred dakujem a inac krasna stranka
Zdravím. Je veľmi ťažké vám pomôcť, pokiaľ neuvediete nič konkrétne. Spôsobov, ako niečo “pokašlať” je viac a môj kód je “v pohode”. Ak si želáte, môžete mi poslať tie súbory v rare na e-mail (opakujem, v RARe!, aby v tom nebol bordel), ktorý je uvedený v kontakte. Užívateľ rann14 sa mi zatiaľ neozval. Okrem toho tento článok vás mal len naviesť, ako to funguje v praxi. Nebolo účelom poskytnúť hotový kód, ktorý stačí použiť štýlom Copy&Paste
Pekný deň.
ASI NEWIETE CO OD VAS CHCEM POTREBUJEM ABY MI TO SLO KLIKNITE NA MOJU STRANKU A TAM MATE NAPISANU REGISTRACIU A AK UVEDIETE MENO A HESLO NEJDE TO?? CO S TYM MAM ROBIT??
A CO JE RAR?? NEWIEM CO JE RAR AJ BY SOM VAM TO POSLALA TO SI MAM TEN RAR STIAHNUT??
Bože. V prvom rade vás poprosím, aby ste mi tu nepísali kapitálkami, lebo to beriem ako kričanie a to nie je slušné. RAR je formát komprimovaného súboru, viď wikipediu: LINK
Keď hovorím, že mi to pošlite na mail, tak mi ide o to, aby to neskončilo tu. Dúfam, že ma chápete?! Potom existuje napríklad WinRAR, ktorý dokáže s týmito súbormi pracovať (je to program, software).
Predpokladám, že ste si kód aspoň prečítali, predtým, než ste ho bezhlavo skopírovali (to je často najväčšou chybou). Pozrite si súbor login.php –> keď overí heslo, ktoré je správne
if($heslo == $row[0])
… nevypíše NIČ. Len vás zaregistruje do sessions ako prihláseného užívateľa.
A keď sa pozriete na súbor registracia.php –> taktiež nemá nič vypísať. LEN PRI NEÚSPECHU (to platí pre oba prípady). Žiadna chyba, žiadny problém, len stačí trošku zapojiť zmysly a mozog. Ako som povedal, tento článok má za úlohu vás len naviesť. Hotové kódy robím na zákazku (samozrejme nie zadarmo).
PS: Ešte raz použijete kapitálky (VŠETKY PÍSMENÁ VEĽKÉ), budem musieť váš príspevok nemilosrdne zmazať. Stačí si naštudovať tzv. netiketu.
V prvom rade Dakujem Adminovi za to ze vobec niekto takyto navod zostavil.
V podstate mu rozumiem celemu sam som ho este neskusal ale pride mi velmi
dobry a logicky. Jedina otazka direktiva session_start() ma bt umiestena na
zaciatku dokumentu znamena na zaciatku scriptu login.php tj v tom scripte kde
sa pouziva funkcia session? alebo nieke inde? Este raz vdaka..
To ondre: Ano, tak ako hovoríš: na začiatku toho skriptu, kde pracujeme sessions (aby sme si sprístupnili prácu s týmito premennými).
Ďakujem za pochvalu
Nazdar, mám jeden problém s tvojím skriptom, a to ten, že pokial vložím kod ktorý má ochrániť nepovolený vstup nepríhlásených uživateľov, tak sa mi nedá dostať na chránenú stránku, aj ked sa prihlásim. Nevieš kde môže byť problém? Ďakujem
Ahoj, skús sa uistiť, či máš v danom skripte spomínanú direktívu session_start(); na začiatku skriptu. Inak nemôžeš používať SESSIONs a tým pádom pracuješ s neexistujúcimi premennými. Dúfam, že rozumieš…
Toto som spravil hneď na začiatku, avšak chyba neustále pretrváva. Poslal som ti mail tak sa na to pozri prosím ťa, díky
Hej, pozrel som si mail, pozrel som si kód a našiel som chybu. Neviem, či to rieši tvoj problém, ale dal som ti ďalší tip. Potom napíš, či funguje.
Super skripty idu skvele, skutocne takyto clanok chybal na slovenskom webe. skripty som si prekopal ako osetrenie vstupov a tak, a teraz ho pouzijem vo svojom cms ktory mam v plane doleta dat dokopy:-)
Ahoj. Som veľmi rád, že som pomohol
Je to zároveň nejaká tá motivácia, aby som napísal niečo ďalšie. Neviem, čo by pre vás, užívateľov, mohlo byť tak prínosné, takže uvítam návrhy na námety v návštevnej knihe.
Zdravim,
mam par dotazov:
1) Ako je to s dalsou pracou s udajmi prihlaseneho uzivatela, napr. ak by som chcel do svojho guestbooku pridat ako autora meno uzivatela?
2) Ako je to s bezpecnostou, co vsetko by som mal pouzit resp. osetrit. Napada ma akurat nejaky MD5 na heslo, escapeshallarg(); escapeshallcmd(); htmlentities(); mozno aj strip_tags(); nejako este osetrit XSS, ci MySQL Injection. Co este, na co by som si mal dat pozor?
Dufam, ze mi odpustis dvojity prispevok, ale nasiel som par chybiciek v tvojom kode:
1) Pri CREATE TABLE ti za polozkou heslo chyba ciarka.
2) Pri login.html ti chyba submit tlacidlo
To Piko: Jo, díky. Drobné chybičky som opravil.
Čo sa týka guestbooku, môžeš použiť v tabuľke (napr. guestbook) id užívateľa ako autora, teda odkaz na druhú tabuľku, v ktorej sú podrobné informácie o danom užívateľovi (meno, priezvisko…). Pri výpise len cez sql príkaz (union alebo iný vhodný) vyberieš meno uživ. na základe zvoleného id, ktoré je v tabuľke (napr. guestbook). Neviem, či rozumieš, ale takto sa to robí. Ukladať na dvoch miestach to isté meno uživ. je nevhodné. Ide o duplicitný obsah.
Ošetriť? Mňa napadajú podobné veci ako teba. HTML vstup užívateľa, ktorý sa bude kdekoľvek na stránke znovu vypisovať, treba prehnať funkciou htmlspecialchars() (alebo ktoroukoľvek, ktorá zvládne podobnú vec), mal by si dať pozor na apostrofy, ktoré sa môžu dostať do sql query (teda napríklad addslashes() a stripslashes() ) a to “šifrovanie” hesla predsa vidíš v článku. Použil som sha1, ale je to tiež len hashovacia funkcia, ako md5. Tiež by som to heslo “posolil” niečím, napr. údajom zo stĺpca datum, či ktoroukoľvek inou jedinečnou hodnotou. Aby nebolo zahashované len samotné heslo. Viac o solení hesiel v google (možno o tom napíšem článok, ale mám nápady na toľko článkov, no nestíham ich písať
).
Môžeš ešte pouvažovať o možnostiach zabezpečenia, ale myslím, že taký bežný guestbook netreba chrániť nejakými brutálnymi algoritmami, je to veľmi jednoduchá aplikácia a možností “hacknutia” nie je veľa.
Ked som to pisal, este som nemal cely kod zbehnuty, takze za to sha1 sa ospravedlnujem. S tym zavedenim mena do guestbooku som to myslel trocha inak, slo mi o to, ako tam tu hodnotu napasovat. Napadlo ma jedine, ze spolu s prihlasenim vytvorim dalsi session, napr. $_SESSION['id'], kde ulozim hodnotu z tabulky uzivatelia a potom s tym budem narabat.
Inak vynikajuci clanok, ktory to cloveku vysvetli od zakladu a bez zbytocneho sumu. Rady ohladne zabezpecenia urcite vyuzijem.
“Napadlo ma jedine, ze spolu s prihlasenim vytvorim dalsi session, napr. $_SESSION['id'], kde ulozim hodnotu z tabulky uzivatelia a potom s tym budem narabat.”
…no vidíš. Už si si aj odpovedal
…díky za pochvalu. Využijem ju ako motiváciu k ďalším článkom
Ok, mam všetko úspešne ošetrené, zaviedol som si aj také finty ako dátum Posledného prihlásenia a pod. avšak mám menší problém. Zakaždým, keď refreshnem stránku, spýta sa ma Firefox, či má znova odoslať dáta. Nebude to tým, že som do login.php napchal všetky časti (teda aj ten formulár). Ten mam includnutý do hlavičky, takže je to furt “na očiach”.
Jo, môžeš si ten skript rozdeliť na viac častí. Jedna časť môže byť formulár, ktorý odošle dáta na skript, ktorý údaje spracuje a potom ho presmeruje na nejakú stránku, napr. na takú, kde vypíše, že všetko prebehlo úspešne… Tak tam tie POST dáta neostanú a nebude vypisovať FF nič
Hoj Admin mam jednu pripomienku nechyba ti tam jedna malickost? Teda pripojenie do databazy???
Chýba
Teda ani tam nemá byť. Sú to len ukážkové kusy kódu na pochopenie princípu takej registrácie a prihlasovania. Akýsi hrubý základ. Zvyšok si čitateľ dorobí sám.
Ozaj pekný článok aj pre nechápavých ako som ja:) Ide to len neviem, prečo keď uvediem na začiatok session_start(); tak mi to zobrazí aj v zdrojáku teda aj v prehliadači.
Aha už viem prečo… Ja som tam dal 1 navyše omylom do includovaného súboru jedného:)
Som rád, že si to vyriešil
Zdravím,
máte pekný tutoriál ale mne furt vypisuje že “Zadali ste neplatné meno alebo heslo! “…neviete mi poradiť?
Určite viem, len by som musel vidieť, kde konkrétne máte chybu v kóde. Ak ste všetko urobili presne podľa tutoriálu, chyby by sa nemali vyskytovať. Je to odskúšané.
Ahoj
Kód som dorobil podľa svojich predstáv naincludoval som pripojenie do DB atd…. ale prihlásim sa normálne ale hned ako dám inú stránku už mi píše že nemám na tú stránku prístup…. Pridal som si ťa už aj na ICQ. Ako keby sa to session neukladalo….
Tak už som zistil prečo
Nedal som tam session start