Kako napraviti PHP Blog 5.dio – Login sustav

Kako napraviti PHP Blog 5.dio – Login sustav

U prošlom tutorijalu naučili smo teoriju osnovnog login sustava. U ovome tutorijalu napraviti ćemo koristeći neke od koraka iz prošlog tutorijala.

Tablica usera

Prvo što je potrebno napraviti jeste tablicu naših korisnika u koju će se spremati username i lozinka. Tablicu ćemo nazvati users i imati će tri polja ID,username i password. Password jednako tako nećemo sada enkriptirati kako bi pokazali običan login, inače pri registraciji svakog korisnika bilo bi potrebno napraviti enkripciju takvih podataka.

Sljedeći SQL upit možete upisati u phpmyadmin kod naše baze ‘blog’ ili putem command prompta ukoliko ste ulogirani u mysql server.

CREATE TABLE IF NOT EXISTS `users` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(40) NOT NULL,
  `password` varchar(40) NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 

Login

Sada je potrebno napraviti i jedan login.php kako bi mogli doći do naše forme za upit korisničkih podataka. Napravite zasebnu datoteku login.php unutar foldera od bloga i ukucajte sljedeći html:

<!DOCTYPE HTML>
<html>
    <head>
    <meta charset="utf-8"/>
        <title>Učionica Blog - Login</title>
    </head>
    <body>
        <form action="" method="post">
            <p>Korisničko ime: <input type="text" name="user" value=""/></p>
            <p>Lozinka: <input type="password" name="pass" value=""/></p>
            <p><input type="submit" name="submit" value="Submit"/></p>
        </form>
    </body>
</html>

Sada smo napravili osnovnu strukturu za unos korisničkog računa i lozinke. Prilikom pritiska na Submit forma će nas poslat na istu stranicu tj. na datoteku login.php, ali će biti drugačiji HTTP Request, a to je POST.

Dohvaćanje unosa

Sada ukoliko odemo na našu stranice npr. localhost/blog/login.php dobiti ćemo formu koja nije funkcionalna. Prvo što ćemo napraviti je dohvat samih podataka. Iznad svega u login.php-u prepišite sljedeći dio koda:

<?php
     if(isset($_POST["submit"])){
         echo "Poslana forma";
     }
?>

Ovdje provjeravamo ako je poslana forma tj. ako je u POST requestu poslan submit. Ukoliko je trebalo bi nam ispisati Poslana forma. To je postavljeno kao test da li nam radi forma. Ovo možete provjeriti bez unosa ikakvih korisničkih podataka.

Nakon što smo provjerili da li nam se forma šalje, potrebno je preuzeti vrijednosti lozinke i korisničkog računa.

<?php
     if(isset($_POST["submit"])){
         $username = $_POST["user"];
         $password = $_POST["pass"];
     }
?>

Nakon što smo preuzeli te vrijednosti, prvo što ćemo napraviti jeste obrisati sve razmake, pa nakon dohvata lozinke i korisničkog računa prepišite sljedeći dio:

         $username = trim($username);
         $password = trim($password);

 

Kada smo to napravili potrebno je napraviti provjeru, a za to ćemo koristiti Regular Expressione:

        if(preg_match('/^\w{5,}$/', $username)) { 
             echo "Dobar username";
        } else echo "Loš username";

        if(preg_match('/^\w{8,}$/', $password)) { 
             echo "Dobar Password";
        } else echo "Loš Password";

Sve šta se tu gleda jeste da je korisničko ime dužine od 5 znakova ili više te da sadrži velika i mala slova te brojeve (moguć je i znak _), to isto se gleda i za lozinku ali ona mora sadržavati barem 8 znakova u sebi. Za testiranje ovdje sam postavio obične ispise da li valja ili ne valja kako bi mogli vidjeti i sami kako to radi.

Kako bi kasnije mogli pratiti da li je došlo do pogreška ili slično napraviti ćemo malu promjenu u gornjem kodu:

$errors = array();

         if(preg_match('/^\w{5,}$/', $username)) { 
             echo "Dobar username";
        } else $errors[] = "Username mora biti minimalno 5 znakova dug";

        if(preg_match('/^\w{8,}$/', $password)) { 
             echo "Dobar Password";
        } else $errors[] = "Password mora biti minimalno 8 znakova dug";

Ovdje se događa sljedeće:

  1. Napravljena je varijabla koja predstavlja polje pod nazivom errors
  2. Ukoliko dolazi do pogreške kod username-a ili passworda punimo polje sa porukama

Sada kada bi imali pogreške pregledali bi da li naše polje ima kakve unose i ukoliko ima tu bi proces logiranja stao. To ćemo napraviti sljedećim dijelom koda:

if(empty($errors)){
            echo "Uspješno logiranje";
        } else {
            echo "Ispravi: ";
            echo "<ul>";
            foreach ($errors as $error) {
                echo "<li>".$error."</li>";
            }
            echo "</ul>";
        }

Tu provjeravamo da li je $errors prazan te ukoliko je šaljemo poruku da je uspješno logiran (samo za testiranje), te ukoliko nije onda šaljemo poruku sa svim podacima koji su krivo uneseni. Probajte sada sami vidjeti da li Vam šalje sve pogreške ukoliko napravite koju.

Model korisnika

Prije nego se krenemo spajati na bazu podataka napraviti ćemo model u našoj datoteci blog.php gdje već postoji klasa koja upravlja sa člancima. Nakon te klase prepišite sljedeći kod:

class User extends ActiveRecord\Model
{
    // explicit table name since our table is not "books"
    static $table_name = 'users';

    // explicit pk since our pk is not "id"
    static $primary_key = 'ID';

    // explicit connection name since we always want production with this model
    static $connection = 'development';

    // explicit database name will generate sql like so => db.table_name
    static $db = 'blog';
}

Sada imamo klasu s kojom možemo laganim pozivima na bazu dobiti korisnike odnosno provjeravati korisnike. Nakon toga poželjno je unijeti kojeg korisnika u našu tablicu users.

Unesite svoje korisničko ime i lozinku u tablicu users.Ja ću za svrhu ovog tutorijala unijeti za username: testUser i za password: testPassword.

SQL koji sam izvršio, a vi ga isto tako možete jednostavno kopirati unutar phpmyadmin-a:

INSERT INTO `users`(username, password) VALUES('testUser', 'testPassword');

Provjera korisnika

Umjesto linije koda u login.php:

echo "Uspješno logiran";

prepišite sljedeće:

if(User::find_by_username_and_password($username,$password)){
                echo "Uspješno logiran";
            } else {
                echo "Nepostojeća kombinacija lozinke i username-a";
            }

Sada se događa sljedeće:

  1. Pretražujemo bazu korisnika sa username-om i lozinkom
  2. Ukoliko je pronađen korisnik, šaljemo poruku uspješno logiran
  3. Ukoliko nije pronađen korisnik javlja se poruka Nepostojeća kombinacija lozinke i username-a

Što je sljedeće?

Sljedeće što je potrebno napraviti je otvoriti Session na serveru i tako zapisati da je korisnik prijavljen. Zatim je potrebno otvoriti i jedan administracijski dio gdje ćemo provjeravati da li je korisnik prijavljen te ukoliko nije šaljemo ga natrag na login.php. Jednako tako na login.php-u, ukoliko je korisnik prijavljen, šaljemo ga odmah dalje na administracijski dio.

Zaključak

U ovome tutorijalu prošli smo jako veliki dio sustava za prijavu te Vam predlažem da nekoliko puta prođete ovaj tutorijal kako bi shvatili sve dijelove koda. Ukoliko postoje nejasnoće, javite to u komentarima te ću Vam pokušati jednostavno objasniti sve dijelove koje ne razumijete.

 

Objavio: , 13.06.2014
Kategorija: Programiranje
Tagovi:
Kako napraviti PHP Blog 4.dio – Teorija osnovnog logina

Kako napraviti PHP Blog 4.dio – Teorija osnovnog logina

Svaki sustav koji zahtjeva nekakva ažuriranja, upisivanja i slično ima svoj sustav za prijavu u administraciju. Bez takvog sustava svaki korisnik stranice mogao bi pristupiti i unositi ili ažurirati podatke na stranici. U ovom tutorijalu kratko ćemo proći kroz sustav prijave kako bi u sljedećim tutorijalima mogli razumijeti što se događa i zašto.

Načini prijava

U digitalnom svijetu postoje razni načini prijava.

Najklasičniji način prijave je unosom korisničkog računa i lozinke (npr. facebook.com). Kod ovog sustava lozinka se sprema u nekakvom enkriptiranom obliku kako nitko ne bi mogao doznati pravu lozinku. Tako da nekakva riječ kao npr. “Lozinka”, koristeći nekakav enkriptirajući algoritam postaje “b4fi459t93vjk8č76k6m5″ ili nešto slično ovome. Time niti administrator naše baze podataka ne može saznati lozinku koju koristi korisnik pri prijavljivanju. Ovakav način prijave ćemo i mi napraviti u sljedećem tutorijalu.

Nadalje, postoje i drugačiji načini kao što su prijavljivanja privremenim lozinkama koje nam sam sustav izgenerira na naš zahtjev te nam pošalje u email, na sms i sl. Postoje i drugi posebni načini dobivanja same lozinke kao što je primjer novih pametnih kartica gdje imamo jednu šifru koja prijavom javlja sustavu da želimo novu privremenu lozinku i zatim nam na kartici ispiše novo izgeneriranu lozinku kojom se možemo prijaviti u npr. NetBanking i sl.

Postoje i prijave koje zahtjevaju duplu autentifikaciju gdje uz računalo možete koristit i mobitel ili nešto slično kako bi si omogućili prijavu u sustav što je malo kompleksnije rješenje koje nećemo prolaziti u ovome tutorijalu.

Načini osiguravanja

Kada se pravi sustav za prijavu mora se misliti na nekoliko slučajeva. Minimalno na što je potrebno misliti jeste provjera svakog unosa kako ne bi došlo do upada u sustav unosom posebnih znakova u formama.

To se radi na način da prilikom slanja podataka odnosno primanja podataka sa login forme, moramo prije spajanja na bazu i izvršavanja upita na bazu podataka, provjeriti sve dobivene podatke koje koristimo u upitu kako ne bi sadržavali znakove koje bi izvršavali neki drugi upit.

Primjer.

Nezaštićena forma prima username:  ‘ or 1=1 ‘–, a SQL je sljedeći: SELECT * FROM users WHERE username = ‘ovdje_ide_userename’ and password=’ovdje_ide_pass’;

Kada se forma pošalje dobiti će se: SELECT * FROM users WHERE username = ” or 1=1 ‘–and password=’pass’ čime smo zakomentirali password, a upit će uspijeti jer 1 je uvijek 1 tako da 1=1 je TRUE, i time je običan SQL Injection izvršen. Naravno tu se može još toga napraviti kao što je unos svojeg username-a i lozinke, brisanje tablica ili zapisa i sl.

Zbog toga je potrebno zaštiti svaki unos koji dolazi sa strane korisnika stranice jer mogu ili namjerno upasti u naš sustav ili slučajno. Niti jedno niti drugo nama ne odgovara.

Još jedan slučaj je kada korisnik koji želi upasti u naš sustav pokušava to izvršavati nekoliko puta. Na primjer, saznao je korisnički račun, samo mu nedostaje lozinka. Ukoliko ima nekakav program ili sl. koji bi mogao lako pronaći lozinku tog korisničkog računa mogao bi jednostavno doći do nje nakon nekoliko pokušaja.

Zbog toga se može napraviti blokada računa nakon tri neuspješna pokušaja. Nakon toga korisnika se može kontaktirati putem emaila, mobitela ili mu dati obavijest prilikom prijave da je njegov račun blokiran te da se javi administraciji kako bi ga odblokirali. Ovo tu možda podsjeća na PINove od kartica ili SIM kartica gdje nakon tri puta, kartice se automatski zablokiraju jer se smatra da se vrši pokušaj upada u mobitel ili sl.

Tijek prijave

Tijek prijave u klasičnom sustavu prijavljivanja koji ćemo mi napraviti u sljedećem tutorijalu opisati će se u sljedećem tekstu.

Prvo korisnik upisuje svoje podatke i pokušava se prijaviti u sustav. Kada on pošalje svoj login podatke, mi pravimo sljedeće:

  • Uzimamo korisnički račun i lozinku u zasebne varijable
  • Provjeravamo ih da li imaju kakve razmake i mičemo razmake
  • Provjeravamo da li su ispravnog formata (npr. lozinka mora sadržavati barem jedno veliko slovo, jedno malo slovo i broj te mora biti najmanje 10 znakova dugačka)
  • Provjeravamo ih da li imaju kakve znakove koji nisu primjereni odnosno zabranjeni
  • Ukoliko provjera ne prođe, prekidamo proces i javljamo korisniku da je pogrešno unio podatka tj. da korisnik ne postoji sa tom kombinacijom, u suprotnom nastavlja se proces
  • Lozinka se pretvara u enkriptirani oblik pomoću algoritma kojeg smo mi odlučili koristiti
  • Spajamo se na bazu te provjeravamo da li postoji korisnik sa tim korisničkim računom i tom enkriptiranom lozinkom
  • Ukoliko dobijemo jedan rezultat, korisnik je dobro unio podatke i prijavio se, u suprotnom opet prekidamo proces i javljamo da ne postoji korisnik sa takvom kombinacijom računa i lozinke
  • Prilikom prijave, šaljemo ga na stranicu administracije (ukoliko to želimo), te spremamo nekakav session na serveru ili cookie u pretraživaču korisnika kako se ne bi prilikom osvježavanja stranice opet morao prijavljivati

Zaključak

U ovome članku upoznali smo se malo sa načinima prijavljivanja, kako jednostavno osigurati sustav prijava te tijek izvođenja prijave na sustav koji ćemo napraviti u sljedećem tutorijalu. Sada kada već znate sam tijek izvođenja probajte i nešto sami napraviti, pa ukoliko ne uspije napraviti ćemo to zajedno u sljedećem tutorijalu. Ukoliko Vam uspije opet ćete moći usporediti svoj način proces prijave sa ovim iz tutorijala.

Kako ukloniti prikaz reklama iz besplatne verzije AVG antivirusa?

Kako ukloniti prikaz reklama iz besplatne verzije AVG antivirusa?

Ovaj vodič smo posvetili svima kojima smeta prikaz reklama u besplatnoj inačici antivirusa AVG.

Kako napraviti backup e-mail poruka?

Kako napraviti backup e-mail poruka?

Ovaj vodič smo posvetili prikazu postupka kako napraviti pričuvu (backup) e-mail poruka tj. cijelog elektronskog sandučića putem besplatnog programa po nazivu MailStore Home.

Kako napraviti PHP Blog 3.dio – Prikazivanje postova

Kako napraviti PHP Blog 3.dio – Prikazivanje postova

U prošlim tutorijalima unijeli smo 2 ili 3 posta odnosno članaka. Ovaj tutorijal pokazati će Vam kako koristiti ActiveRecord iz prethodnog tutorijala te pomoću njega prikazati naše članke.

Kako napraviti PHP Blog 2.dio – ActiveRecord

Kako napraviti PHP Blog 2.dio – ActiveRecord

U prošlom tutorijalu napravili smo temelj za izradu članaka. U ovome tutorijalu upoznati ćemo se sa ActiveRecord-om.

Kako napraviti PHP Blog 1.dio

Kako napraviti PHP Blog 1.dio

Ukoliko ste se često susretali sa raznim web stranicama te se zanimali kako ona radi i kako je moguće dinamički postavljati novosti, događaje i sl. onda ste u istoj poziciji kao što sam i ja bio pred nekoliko godina ( u trenutku pisanja to bi bilo oko 5 godina ). U ovom serijalu tutorijala naučiti ćete kako napraviti svoj blog koristeći se jezikom PHP.