Adatbázis


A rendszer mysql adatbázist használ ezért le kell futtatnom a következő parancsot:

CREATE TABLE IF NOT EXISTS `tag` (
`id` int(11) NOT NULL auto_increment,
`nev` varchar(20) NOT NULL,
`jelszo` varchar(20) NOT NULL,
`utlog` int(11) NOT NULL,
`mail` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
)

Ezzel létrehozok egy táblát az adatbázisban amibe a következő mezők találhatóak:
id - Automatikusan növekvő szám.
nev - Maximum 20 karakter hosszú szöveg.
jelszo - Maximum 20 karakter hosszú szöveg.
utlog - Maximum 11 karakter hosszú számsor.
mail - Maximum 30 karakter hosszú szöveg.

Csatlakozás


Mielőtt elkezdeném magát a regisztrációt írni szükségem van egy fájlra amiben csatlakozik az adatbázishoz. Ez lesz a config.php .

<?php
$felh = "felhasznalonev";
$jelszo = "jelszo";
$base = "adatbazis";
$host = "host";
$conn = mysql_connect( $host, $felh, $jelszo) or die("Hiba");
mysql_select_db( $base, $conn ) or die("Adatbázis hiba") ;
?>

Ebben a fájlban meghatározom a felhasználónevet, a jelszót, az adatbázis nevét (gyakran ugyan az mint a felhasználónév) és a hostot (pl.:proba.extra.sql).
Ezekután a mysql_connect fügvénnyel kapcsolódunk az adatbázishoz, sikertelen kapcsolódás során a Hiba hibaüzenet fogad minket.
Ezekután kiválasztjuk az adatbázist a fennt látható módon.

Regisztráció


Mindennél fontosabb, hogy regisztrálni lehessen, épp ezért ezzel kezdjük a cikk érdekesebb részét.
A regisztrációhoz csatlakozni kell az adatbázishoz, tehát betöltöm a config.php fájlt. Ezután szükségem van űrlapra amiben a következő adatokat kérem a felhasználótól:
-felhasználónév
-jelszó
-jelszó újra
-e-mail cím

Tehát a regisztrációnk eddig így néz ki:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
include ("config.php");
print "<form method=post action='$php_self'>";
print "Név:<input type=text name='nev'>";
print "Jelszó:<input type=password name='jelszo'>";
print "Jelszó újra:<input type=password name='jelszo2'>";
print "E-mail cím:<input type=text name='mail'>";
print "<input type=submit value=Regisztráció></form>";
?>


Most jön az ellenőrzése az űrlapnak. Ezt inkább előbb leírom és csak aztán magyarázom:

<?php
if (isset($_POST)){
if ($_POST != $_POST ){
print "Nem egyezik meg a két jelszó!";
}else{
$nev = htmlspecialchars($_POST);
$mail = htmlspecialchars($_POST);
$nevegyez = mysql_query("select * from tag where nev = '$nev'");
$mailegyez = mysql_query("select * from tag where mail = '$mail'");
$szam = mysql_num_rows($nevegyez);
$szam2 = mysql_num_rows($mailegyez);
if ($szam == 0 ){
if ($szam2 == 0 ){

if ( $_POST != "" && $_POST != "" && $_POST != "" ){
$jelszo = md5($_POST);
$jelszo = substr($jelszo, 0,20);
$reg = time();
$parancs = mysql_query("insert into tag values ('', '$nev', '$jelszo', '$reg', '$mail')");
print "Sikeres regisztráció!";

}else{
print "Nem töltöttél ki minden mezőt!";
}

}else{
print "Foglalt e-mail cím!";
}
}
else
{
print "Foglalt név!";
}
}
}
?>
</body></html>
Mit is csináltam?


Elősször ellenőrzöm, hogy elküldték-e az űrlapot.
Ezután ellenőrzöm, hogy a két jelszó megegyezik, különben kiíratom a hibát. Ha egyezik akkor lekérdezem azoknak a tagoknak a számát akiknek a beviteli mezőben megadott neve és e-mail címe van. Ezeket egy-egy változóban tárolom. Fonntos ügyelni arra, hogy a nevet és az e-mail címet a megfelelő módon konvertáljuk, úgy mint ahogy az adatbázisba kerülnek. Én a htmlspecialchars() fügvényt használtam, mert ez kicseréli a <, >, ', " és & karaktereket html elemekre. Íly módon megnehezíthetjük a Hackerek dolgát, mivel a beviteli mező az egyik legkönnyebben támadható felület. Így viszont nem lehet kódokat írni a beviteli mezőkbe.
Most ellenőrizzük, hogy hány felhasznló van erre az e-mail címre vagy erre a felhasználónévre regisztrálva. Ezt az előbbi lekéréssel meg is tettük. Ha az eredmény mindkét esetben nulla, tehát nincs ilyen nevű és e-mail című felhasználó, akkor már csak ellenőrizzük se a jelszó se a név se az e-mail cím nem üres. Ha mégis valamelyik üres lenne újabb hibaüzenetet küldünk a felhasználónak. De ha ez a feltétel is teljesül akkor már csak a jelszót kell visszafejthetetlenné tenni. Ezt úgy oldaottam emg, hogy md5-ös titkosítást használtam, majd ennek a karaktersorozatnak az első húsz elemét vettem, mivel az adatbázis is csak a 20. karakterig tudja tárolni. Nem maradt más hátra, mint a time() fügvény eredményét eltárolni egy újabb változóban, ez lesz az utlog első értéke. Most felveszem az adatbázisba az adatokat. Az id mezőt üresen hagyom majd sorban: nev, jelszo, reg és mail változókat tárolom. A reg változó ahoz kell, hogy az utlog mezőnek legyen egy alap értéke, ebben tárolom majd az utolsó bejelentkezést. Kiíratom a sikeres regisztrációt.Ezekután már csak a hibaüzenetek vannak hátra.
Most már kész vana regisztráció.

Bejelentkezés


A következőkben leírom, hogy működik a bejelentkezés.
Rögtön a kóddal kezdeném, mert utólag könnyebb magyarázni.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
if ($_GET == kilep){
session_unset();
session_destroy();
}


if ( isset($_POST) ){
include("config.php");
$nev = htmlspecialchars($_POST);
$jelszo = md5($_POST);
$jelszo = substr($jelszo, 0,20);
$lekerdezes = mysql_query("SELECT * FROM tag where nev = '$nev' and jelszo = '$jelszo'");
$vanelekerdezes = mysql_num_rows($lekerdezes);
if ($vanelekerdezes==1)//Ha van ilyen felhasználónév, jelszó páros
{
session_register( "nev" );
$time = time();
$frissit= mysql_query("UPDATE tag SET utlog = '$time' where nev = '$_POST'");
header("Location: log.php");
}else{
print 'Rossz név és jelszó páros!';
print '<form action="log.php" method="post">Név:<input type="text" name="nev" size="25">Jelszó:<input type=password name="jelszo" size="25"<input type="submit" value="Belépés">';
}

}else if (session_is_registered(nev)){
print "Üdvözöllek ".$_SESSION."<a href=log.php?csinal=kilep>Kilépés</a>";
}else {
print '<form action="log.php" method="post">Név:<input type="text" name="nev">Jelszó:<input type=password name="jelszo"><input type="submit" value="Belépés">';
}


ob_end_flush();
?>
</body></html>

Nem az elejéről kezdem, hanem onnan ahol ellenőrzöm, hogy van-e kimenete a bejelentkező űrlapnak. Ha nincs megnézem van-e definiálva nev nevű Session. Ha regisztrálva van akkor köszöntöm és kiírtaom a kilépés linket. Ha nem lenne regisztrálva, akkor kiíratoma bejelentkező űrlapot.
A kijelentkező link feldolgozása az odal elején történik, ez az egyik amit kihagytam. Itt ellenőrzöm, hogy a csinal nevű változó értéke kilep, ha igen törlöm a sessionöket. De vissza térek arra, ha elküldte az űrlapot a felhasználó. Ekkor ismét szükségem van az adatbázishoz való csatlakozásra ezért itt is betöltöm config.php-t. Most a nev változóban tárolom a betöltött felhasználónév konvertált változatát. A jelszóval már a regisztrációnál említett lépéseket elvégzem, tehát titkosítom, majd lerövidítem a jelszót. Most lekérdezem azoknak a felhasználóknak a számát, ahol ez a név és jelszó páros található.
Ha van ilyen és jól működik a regisztráció, csak egy lehet. Tehát ha egy van akkor regisztrálom a sessiont, frissítem az adatbázisban az utolsó bejelentkezés dátumát és újratöltöm a lapot. Itt megint a program elejére utalok vissza mivel header() fügvényt használtam késleltetni kell a kimenetet, az ob_start() fügvénnyel és a fájl végére az ob_end_flush()fügvényt kell beilleszteni, ennek miértjét nem részletezném, mert már ebben a cikkben megtalálható.
Ha viszont nem lenne ilyen név és jelszó páros, akkor kiíratom a hibát és az űrlapot mégegyszer.

Összefoglalva

Ez a login rendszer véleményem szerint könnyen bővíthető, biztonságos és így, hogy részletesen le van írva nem kell töprengeni rajta hogyan is működik. Remélem sokatoknak segítettem ezzel a cikkel. A fájlokat tömörítve mellékelem.

bejelentkezés