Blog o spletnem programiranju in elektroniki
💬 👤
back Nazaj na blog
WEB (HTML, CSS, PHP)

Kako narediti prijavo in registracijo: Celoten vodnik s PHP

Prijava in registracija uporabnikov sta temelj vsake spletne aplikacije, ki zahteva uporabniške račune. Ne glede na to, ali gradite spletno trgovino, blog ali spletno storitev, morate zagotoviti varen postopek registracije in prijave. V tem članku bomo pregledali celoten postopek — od obrazca do varnega shranjevanja gesel in upravljanja sej.

Registracija uporabnika

Registracija je postopek, pri katerem uporabnik ustvari nov račun. Temeljne komponente registracije so:

  1. Obrazec (HTML form): Uporabnik vnese uporabniško ime, e-pošto in geslo
  2. Validacija (server-side): Strežnik preveri, ali so podatki pravilni in ali uporabnik že obstaja
  3. Hash-anje gesla: Geslo se nikoli ne shrani v izvorni obliki — vedno se hash-a
  4. Shranjevanje v bazo: Uporabniški podatki (brez gesla) in hash gesla se shranijo v bazo

HTML obrazec za registracijo

Začnimo z enostavnim obrazcem za registracijo. Uporabili bomo metodo POST, saj je varnejša za pošiljanje občutljivih podatkov:

<!-- registracija.html -->

<form action="registracija.php" method="POST">
    <label for="uporabnisko_ime">Uporabniško ime:</label>
    <input type="text" id="uporabnisko_ime" name="uporabnisko_ime" required>

    <label for="email">E-pošta:</label>
    <input type="email" id="email" name="email" required>

    <label for="geslo">Geslo:</label>
    <input type="password" id="geslo" name="geslo" required>

    <button type="submit">Registriraj se</button>
</form>

PHP obdelava registracije

Ko uporabnik pošlje obrazec, podatke prevzeme datoteka registracija.php. Tu se zgodijo tri ključne stvari: validacija, preverjanje obstoječega uporabnika in hash-anje gesla.

<?php
// registracija.php

// Preveri, ali je obrazec poslan
if ($_SERVER["REQUEST_METHOD"] === "POST") {

    // Prevzem in čiščenje vhodnih podatkov
    $uporabnisko_ime = htmlspecialchars($_POST["uporabnisko_ime"]);
    $email = filter_var($_POST["email"], FILTER_VALIDATE_EMAIL);
    $geslo = $_POST["geslo"];

    // Validacija
    if (!$uporabnisko_ime || !$email || strlen($geslo) < 8) {
        die("Vnesite veljavne podatke. Geslo mora imeti vsaj 8 znakov.");
    }

    // Hash-anje gesla (bcrypt)
    $hash_gesla = password_hash($geslo, PASSWORD_DEFAULT);

    // Priprava SQL poizvedbe (PDO z pripravljenimi stavki)
    $stmt = $pdo->prepare("
        INSERT INTO uporabniki (uporabnisko_ime, email, hash_gesla)
        VALUES (:uporabnisko_ime, :email, :hash_gesla)
    ");

    // Izvedba z vezanimi parametri (preprečuje SQL injection)
    $stmt->execute([
        ":uporabnisko_ime" => $uporabnisko_ime,
        ":email" => $email,
        ":hash_gesla" => $hash_gesla
    ]);

    echo "Registracija uspešna! Lahko se prijavite.";
}
?>

Tu sta dve ključni varnostni funkciji:

Funkcija Namen Kdaj jo uporabimo
password_hash() Ustvari varni hash gesla (bcrypt) Pri registraciji novega uporabnika
htmlspecialchars() Preprečuje XSS napade (Cross-Site Scripting) Pri vsakem izpisu uporabniškega vnosa
filter_var() Preverja obliko e-poštnega naslova Pri validaciji e-pošte
PDO prepared statements Preprečuje SQL injection napade Pri vsaki poizvedbi v bazo z uporabniškimi podatki

Prijava uporabnika

Prijava je postopek, pri katerem uporabnik dostopi do svojega obstoječega računa. Strežnik preveri, ali se vneseno geslo ujema s shranjenim hash-em.

<!-- prijava.html -->

<form action="prijava.php" method="POST">
    <label for="email">E-pošta:</label>
    <input type="email" id="email" name="email" required>

    <label for="geslo">Geslo:</label>
    <input type="password" id="geslo" name="geslo" required>

    <button type="submit">Prijava</button>
</form>

PHP obdelava prijave

<?php
// prijava.php

session_start();

if ($_SERVER["REQUEST_METHOD"] === "POST") {

    $email = filter_var($_POST["email"], FILTER_VALIDATE_EMAIL);
    $geslo = $_POST["geslo"];

    if (!$email || !$geslo) {
        die("Vnesite veljavne podatke.");
    }

    // Iskanje uporabnika po e-pošti
    $stmt = $pdo->prepare("SELECT * FROM uporabniki WHERE email = :email");
    $stmt->execute([":email" => $email]);
    $uporabnik = $stmt->fetch(PDO::FETCH_ASSOC);

    // Preverjanje gesla
    if ($uporabnik && password_verify($geslo, $uporabnik["hash_gesla"])) {

        // Geslo je pravilno — ustvari sejo
        $_SESSION["uporabnik_id"] = $uporabnik["id"];
        $_SESSION["uporabnisko_ime"] = $uporabnik["uporabnisko_ime"];

        echo "Dobrodošli, " . htmlspecialchars($uporabnik["uporabnisko_ime"]) . "!";
        header("Location: nadzorna_plosca.php");
        exit;

    } else {
        // Nepravilno geslo ali uporabnik ne obstaja
        echo "Napačna e-pošta ali geslo.";
    }
}
?>

Pomembno: napaka naj bo vedno enaka, ne glede na to, ali uporabnik ne obstaja ali je geslo napačno. Tako napadalec ne more ugotoviti, ali je e-pošta registrirana ali ne.

Upravljanje sej (Sessions)

Ko je uporabnik prijavljen, mora strežnik zapomniti, kdo je. To se doseže z sejami (sessions). Seja se začne z session_start() na vrhu vsake zaščitene strani:

<?php
// nadzorna_plosca.php — zaščitena stran

session_start();

// Preveri, ali je uporabnik prijavljen
if (!isset($_SESSION["uporabnik_id"])) {
    header("Location: prijava.html");
    exit;
}

echo "Dobrodošli na nadzorni plošči, "
    . htmlspecialchars($_SESSION["uporabnisko_ime"]) . "!";
?>

Odjava uporabnika:

<?php
// odjava.php

session_start();
session_unset(); // Počisti vse spremenljivke seje
session_destroy(); // Uniči sejo

header("Location: prijava.html");
exit;
?>

SQL tabela za uporabnike

Tukaj je primer SQL tabele za shranjevanje uporabnikov:

CREATE TABLE uporabniki (
    id INT AUTO_INCREMENT PRIMARY KEY,
    uporabnisko_ime VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(255) NOT NULL UNIQUE,
    hash_gesla VARCHAR(255) NOT NULL,
    ustvarjen DATETIME DEFAULT CURRENT_TIMESTAMP
);

Varnostna priporočila

  1. Nikoli ne shranjujte gesel v izvorni obliki: Vedno uporabite password_hash() z bcrypt algoritmom
  2. Uporabljajte PDO z pripravljenimi stavki: To je edini varen način za delo z bazo podatkov
  3. Validirajte na strežniški strani: HTML validacija (required, type="email") ni dovolj — vedno preverite tudi v PHP-ju
  4. Uporabljajte HTTPS: Brez HTTPS se vsi podatki, vključno z gesli, prenašajo v izvorni obliki
  5. Omejite število poskusov prijave: Preprečite brute-force napade z omejevanjem poskusov (npr. 5 poskusov v 10 minutah)
  6. Nikoli ne izpisujte uporabniških podatkov brez htmlspecialchars(): Preprečite XSS napade
  7. Uporabljajte močna gesla: Zahtevajte minimalno 8 znakov, kombinacijo črk, številk in posebnih znakov
  8. Razmislite o dvofaktorski avtentikaciji (2FA): Dodatna plast varnosti za občutljive aplikacije

Pogoste napake

Napaka Zakaj je nevarna Pravilna rešitev
Shranjevanje gesla v izvorni obliki Pri vdoru v bazo so vsa gesla kompromitirana password_hash() z bcrypt
Uporaba md5() ali sha1() za gesla Ta algoritma nista varna za gesla password_hash() (uporablja bcrypt)
SQL poizvedbe z konkatenacijo nizov Ranljivo na SQL injection PDO pripravljeni stavki z vezanimi parametri
Izpis uporabniškega vnosa brez čiščenja Ranljivo na XSS napade htmlspecialchars()
Različne napake za "uporabnik ne obstaja" in "napačno geslo" Omogoča ugotavljanje, ali je e-pošta registrirana Vedno enako sporočilo: "Napačna e-pošta ali geslo"

Zaključek

Implementacija varne prijave in registracije ni kompleksna, če upoštevate osnovna varnostna načela: hash-anje gesel, uporaba pripravljenih SQL stavkov, validacija na strežniški strani in zaščita pred XSS napadi. Te komponente so temelj vsake varne spletne aplikacije.

Za podroben primer obrazcev, validacije in zaščite gesel v PHP-ju si oglejte vadnico: PHP obrazci z varno obdelavo in zaščito gesel.

back Nazaj na blog