Načrtovanje in razvoj spletnih aplikacij

Registracija uporabnika

Registracija uporabnika omogoča ustvarjanje novega računa v aplikaciji. Uporabnik vnese svoje podatke, aplikacija jih preveri, nato pa novega uporabnika shrani v podatkovno zbirko.

Registracija novega uporabnika

Pri registraciji običajno uporabnik izpolni obrazec z osnovnimi podatki, kot so ime, priimek, uporabniško ime, e-poštni naslov in geslo. Aplikacija nato preveri pravilnost vnesenih podatkov in ustvari nov uporabniški račun.

Osnovna sintaksa za vnos novega uporabnika v tabelo je:

INSERT INTO users (ime, priimek, username, mail, password)
VALUES (vrednost1, vrednost2, vrednost3, vrednost4, vrednost5);

Pri registraciji gesla ne shranjujemo v navadnem besedilu. Pred shranjevanjem ga pretvorimo v varen hash, ki ga kasneje pri prijavi preverjamo s funkcijo password_verify().

Osnovni primer z mysqli

Spodnji zgled prikaže osnovno registracijo uporabnika z uporabo mysqli, validacije polj in varnega shranjevanja gesla.

<?php
session_start();

define('DB_SERVER', 'localhost');
define('DB_USER', 'uporabnik');
define('DB_PASS', 'skritoGeslo');
define('DB_NAME', 'knjiznica');

$connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME);

if (!$connection) {
    die(
        'Povezava s podatkovno zbirko ni vzpostavljena: ' .
        mysqli_connect_error() .
        ' (' . mysqli_connect_errno() . ')'
    );
}

$error = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $ime = trim($_POST['ime'] ?? '');
    $priimek = trim($_POST['priimek'] ?? '');
    $username = trim($_POST['uid'] ?? '');
    $email = trim($_POST['mail'] ?? '');
    $password = $_POST['pwd'] ?? '';
    $rePassword = $_POST['re-pwd'] ?? '';

    if ($ime === '' || $priimek === '' || $username === '' || $email === '' || $password === '' || $rePassword === '') {
        $error = 'Vsa polja morajo biti izpolnjena.';
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $error = 'E-poštni naslov ni veljaven.';
    } elseif ($password !== $rePassword) {
        $error = 'Gesli morata biti enaki.';
    } elseif (mb_strlen($password) < 8) {
        $error = 'Geslo mora imeti vsaj 8 znakov.';
    } else {
        $stmtCheck = mysqli_prepare(
            $connection,
            "SELECT id FROM users WHERE username = ? OR mail = ?"
        );
        mysqli_stmt_bind_param($stmtCheck, 'ss', $username, $email);
        mysqli_stmt_execute($stmtCheck);
        $resultCheck = mysqli_stmt_get_result($stmtCheck);

        if (mysqli_fetch_assoc($resultCheck)) {
            $error = 'Uporabniško ime ali e-pošta je že uporabljena.';
        } else {
            $passwordHash = password_hash($password, PASSWORD_BCRYPT);

            $stmtInsert = mysqli_prepare(
                $connection,
                "INSERT INTO users (ime, priimek, username, mail, password)
                 VALUES (?, ?, ?, ?, ?)"
            );
            mysqli_stmt_bind_param($stmtInsert, 'sssss', $ime, $priimek, $username, $email, $passwordHash);

            if (mysqli_stmt_execute($stmtInsert)) {
                $_SESSION['regIme'] = $ime;
                $_SESSION['regPriimek'] = $priimek;

                header('Location: 15_register_OK.php');
                exit();
            } else {
                $error = 'Registracija trenutno ni mogoča.';
            }

            mysqli_stmt_close($stmtInsert);
        }

        mysqli_stmt_close($stmtCheck);
    }
}

mysqli_close($connection);
?>

Osnovni primer s PDO

Tudi z vmesnikom PDO registracijo izvedemo s pripravljeno poizvedbo, preverjanjem enkratnosti uporabnika in shranjevanjem hashiranega gesla.

<?php
session_start();

$streznik = 'localhost';
$baza = 'knjiznica';
$uporabnik = 'uporabnik';
$geslo = 'skritoGeslo';

try {
    $pdo = new PDO("mysql:host=$streznik;dbname=$baza;charset=utf8mb4", $uporabnik, $geslo);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $error = '';

    if ($_SERVER['REQUEST_METHOD'] === 'POST') {
        $ime = trim($_POST['ime'] ?? '');
        $priimek = trim($_POST['priimek'] ?? '');
        $username = trim($_POST['uid'] ?? '');
        $email = trim($_POST['mail'] ?? '');
        $password = $_POST['pwd'] ?? '';
        $rePassword = $_POST['re-pwd'] ?? '';

        if ($ime === '' || $priimek === '' || $username === '' || $email === '' || $password === '' || $rePassword === '') {
            $error = 'Vsa polja morajo biti izpolnjena.';
        } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $error = 'E-poštni naslov ni veljaven.';
        } elseif ($password !== $rePassword) {
            $error = 'Gesli morata biti enaki.';
        } elseif (mb_strlen($password) < 8) {
            $error = 'Geslo mora imeti vsaj 8 znakov.';
        } else {
            $stmt = $pdo->prepare(
                "SELECT id FROM users WHERE username = :username OR mail = :mail"
            );
            $stmt->bindValue(':username', $username, PDO::PARAM_STR);
            $stmt->bindValue(':mail', $email, PDO::PARAM_STR);
            $stmt->execute();

            if ($stmt->fetch(PDO::FETCH_ASSOC)) {
                $error = 'Uporabniško ime ali e-pošta je že uporabljena.';
            } else {
                $passwordHash = password_hash($password, PASSWORD_BCRYPT, array('cost' => 12));

                $query = $pdo->prepare(
                    "INSERT INTO users (ime, priimek, username, mail, password)
                     VALUES (:ime, :priimek, :username, :mail, :password)"
                );
                $query->execute(array(
                    ':ime' => $ime,
                    ':priimek' => $priimek,
                    ':username' => $username,
                    ':mail' => $email,
                    ':password' => $passwordHash
                ));

                $_SESSION['regIme'] = $ime;
                $_SESSION['regPriimek'] = $priimek;

                header('Location: 15_register_OK.php');
                exit();
            }
        }
    }
}
catch (PDOException $e) {
    $error = 'Registracija trenutno ni mogoča.';
}
?>

Preverjanje podatkov pri registraciji

Pri registraciji moramo skrbno preveriti vse podatke, saj le tako preprečimo napačne vnose in podvojene uporabniške račune.

  • vsa polja morajo biti izpolnjena,
  • e-poštni naslov mora biti veljaven,
  • uporabniško ime mora biti ustrezne oblike,
  • obe gesli se morata ujemati,
  • geslo mora biti dovolj dolgo in varno,
  • uporabniško ime in e-pošta morata biti unikatna.

Varnost pri registraciji uporabnika

  • geslo pred shranjevanjem pretvorimo v hash,
  • za hashiranje uporabimo funkcijo password_hash(),
  • pri vnosu v bazo uporabimo pripravljene SQL stavke,
  • ob napaki uporabniku pokažemo prijazno sporočilo,
  • po uspešni registraciji uporabnika pogosto preusmerimo na potrditveno ali prijavno stran.

📘Aplikacija Knjige

V priloženi aplikaciji je registracija izvedena v datoteki 15_register.php. Ob oddaji obrazca aplikacija prebere ime, priimek, uporabniško ime, e-pošto in obe gesli, nato pa preveri pravilnost vseh polj. Posebej preveri veljavnost e-pošte, dovoljene znake v imenu, priimku in uporabniškem imenu, enakost obeh gesel ter minimalno dolžino gesla.

Nato s pripravljeno PDO poizvedbo preveri, ali uporabniško ime ali e-poštni naslov že obstajata v tabeli users. Če uporabnik še ne obstaja, aplikacija geslo pretvori v varen hash z password_hash() in novega uporabnika shrani v bazo.

Po uspešni registraciji aplikacija v sejo shrani ime in priimek, nato pa uporabnika preusmeri na stran 15_register_OK.php, kjer se izpiše potrditveno sporočilo in povezava na prijavo.

Primer: aplikacija – 15_register.php
Primer: aplikacija – 15_register_OK.php

Navodila za izdelavo registracije

  1. Najprej pripravimo obrazec za vnos podatkov novega uporabnika.
  2. Ob oddaji obrazca preberemo vsa polja.
  3. Preverimo, ali so polja pravilno izpolnjena.
  4. V bazi preverimo, ali uporabniško ime ali e-pošta že obstajata.
  5. Geslo pretvorimo v hash s funkcijo password_hash().
  6. Novega uporabnika shranimo v tabelo users.
  7. Po uspešni registraciji uporabnika preusmerimo na potrditveno ali prijavno stran.

Pri učenju je smiselno poznati oba pristopa:

  • mysqli za klasično registracijo s pripravljenimi stavki,
  • PDO za sodobnejši pristop pri delu z bazo,
  • aplikacijski pristop, kjer registracija vključuje validacijo, zaščito gesla in potrditveno stran.