Izrada sustava za prijavu u PHP blogu: Detaljan vodič kroz implementaciju

Kreiranje vlastitog bloga pomoću PHP-a omogućuje programerima duboko razumijevanje načina na koji web aplikacije komuniciraju s bazama podataka. Jedan od najvažnijih koraka u razvoju bilo koje aplikacije je implementacija sustava za prijavu, koji služi kao prvi sloj sigurnosti i omogućuje kontroliran pristup administratorskom dijelu stranice. Ovaj vodič predstavlja nastavak serijala o izradi bloga, stoga pretpostavljamo da već imate instaliran PHP i MySQL te osnovnu strukturu baze podataka. U nastavku ćemo detaljno proći kroz proces izrade funkcionalnog sustava za prijavu, od pripreme baze podataka do provjere korisničkih vjerodajnika.

Priprema baze podataka za korisnike

Prije nego što počnemo pisati PHP kod, moramo pripremiti mjesto gdje će se pohranjivati podaci o korisnicima. Za potrebe ovog primjera, kreirat ćemo tablicu pod nazivom users. Ova tablica će biti jednostavna i sadržavati tri ključna polja: jedinstveni identifikator (ID), korisničko ime i lozinku.

U nastavku se nalazi SQL upit koji možete izvršiti putem phpMyAdmin-a ili izravno kroz MySQL command prompt. Važno je napomenuti da u ovom osnovnom primjeru lozinke ne enkriptiramo kako bismo jasno prikazali mehanizam provjere, no u stvarnim produkcijskim sustavima enkripcija (npr. pomoću password_hash() funkcije) je obavezna za zaštitu privatnosti korisnika.

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;

Kreiranje korisničkog sučelja za prijavu

Korisničko sučelje za prijavu predstavlja se u obliku HTML forme. Ova forma omogućuje korisniku da unese svoje vjerodajnike, koji se zatim šalju na server obradom putem HTTP POST metode. Korištenje POST metode je ključno jer se podaci ne prikazuju u URL-u, što je osnovni zahtjev za sigurnost pri unosu lozinki.

Napravite datoteku login.php i dodajte sljedeći HTML kod:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8"/>
<title>PHP Blog - Prijava</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="Prijavi se"/></p>
</form>
</body>
</html>

Obrada podataka i validacija unosa

Kada korisnik klikne gumb “Prijavi se”, PHP mora preuzeti te podatke i provjeriti jesu li ispravno uneseni. Prvi korak je provjera je li forma uopće poslana pomoću funkcije isset(). Nakon toga, preuzimamo vrijednosti iz $_POST polja i čistimo ih od nepotrebnih razmaka pomoću funkcije trim().

Da bismo osigurali da korisnik ne šalje prazna polja ili prekratke lozinke, koristimo regularne izraze (Regular Expressions). U ovom primjeru koristimo izraz /^\w{5,}$/. Simbol \w označava bilo koji “word character”, što u praksi znači velika i mala slova, brojeve i donju crtu (_). Broj u vitičastim zagradama definira minimalnu duljinu unosa.

Kriteriji validacije u ovom primjeru:

  • Korisničko ime: Mora imati najmanje 5 znakova i smije sadržavati samo slova, brojeve i donju crtu (_).
  • Lozinka: Mora imati najmanje 8 znakova kako bi se osigurala osnovna razina sigurnosti.

Umjesto jednostavnog ispisa pogrešaka, preporučuje se korištenje niza (array) za pohranu svih pogrešaka. Na taj način, ako korisnik pogriješi i u korisničkom imenu i u lozinki, sustav će mu prikazati popis svih grešaka odjednom, što značajno poboljšava korisničko iskustvo (UX).

Integracija s bazom podataka putem modela

Kako bismo izbjegli pisanje kompleksnih SQL upita svaki put kada nam zatreba korisnik, koristimo model. U datoteci blog.php, definirimo klasu User koja nasljeđuje ActiveRecord\Model. Ovo nam omogućuje da komuniciramo s tablicom users koristeći jednostavne PHP metode umjesto pisanja sirovog SQL-a.

class User extends ActiveRecord\Model
{ static $table_name = 'users'; static $primary_key = 'ID'; static $connection = 'development'; static $db = 'blog';
}

Nakon što smo definirali model, potrebno je dodati testnog korisnika u bazu podataka kako bismo mogli isprobati sustav. To možemo učiniti sljedećim SQL upitom:

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

Provjera vjerodajnika i završna implementacija

Zadnji korak u ovom dijelu razvoja je povezivanje validacije i baze podataka. Kada su podaci prošli validaciju regularnim izrazima, pozivamo metodu find_by_username_and_password(). Ova metoda automatski pretražuje bazu podataka i provjerava postoji li zapis koji odgovara oba unesena podatka.

Ako metoda vrati rezultat, korisnik je uspješno prepoznat i može mu se dopustiti pristup. U suprotnom, sustav ispisuje poruku da kombinacija korisničkog imena i lozinke nije ispravna. Važno je ne precizirati točno koji od dva podatka je pogrešan (npr. “lozinka je pogrešna”) kako bismo otežali posao potencijalnim napadačima koji pokušavaju pogoditi postojeća korisnička imena.

Česte pogreške pri izradi sustava za prijavu

Čak i iskusni programeri mogu napraviti propuste pri implementaciji sustava za prijavu. Evo nekoliko najčešćih pogrešaka koje treba izbjegavati:

  • Slanje podataka putem GET metode: Lozinke nikada ne smiju biti vidljive u URL-u jer ostaju zapisane u povijesti preglednika.
  • Nedostatak trim() funkcije: Korisnici često slučajno dodaju razmak na kraju korisničkog imena, što može dovesti do neuspješne prijave ako se razmaci ne uklone.
  • Slabi regularni izrazi: Previše labavi kriteriji za lozinke olakšavaju brute-force napade.
  • Izravno pisanje SQL-a bez zaštite: Korištenje Active Record modela ili pripremljenih izjava (prepared statements) sprječava SQL injekciju.

Zaključak

U ovom vodiču implementirali smo temelje sustava za prijavu u PHP blogu. Prošli smo put od kreiranja tablice u bazi podataka

Odgovori

Vaša adresa e-pošte neće biti objavljena. Obavezna polja su označena sa * (obavezno)