vadnica-logo
Editor Moj Blog Moje storitve O projektu Telegram O meni O meni

PHP Obrazci (Forms)

PHP omogoča ustvarjanje dinamičnih spletnih obrazcev, obdelavo uporabniškega vnosa, validacijo podatkov in odzivanje na uporabniške interakcije. Obrazce najpogosteje uporabljamo za zbiranje podatkov, kot so kontaktni obrazci, prijave ali registracije novih uporabnikov. Spodnji primer prikazuje osnovno strukturo HTML obrazca in PHP skripta za varno obdelavo.

  • index.php
  • procesiraj.php
PRIMER
REZULTAT

Pri delu z obrazci sta ključni dve stvari: uporabniška izkušnja in varnost. Poskrbeti moramo za ustrezno validacijo na strani strežnika, da preprečimo vnos napačnih ali zlonamernih podatkov. V spodnji tabeli boste našli napredne primere za registracijo in prijavo. Začnimo s preprostim primerom, ki sprejme ime in e-poštni naslov. Uporabili bomo metodo POST, saj je varnejša za pošiljanje podatkov na strežnik, kjer jih bo obdelala datoteka procesiranje.php.

Pojasnilo obdelave

Za profesionalno validacijo uporabljamo funkcijo filter_var, ki varno preveri obliko e-poštnega naslova. Poglejmo si nadgrajen primer datoteke procesiraj.php:

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // Branje in osnovna zaščita podatkov
    $ime = htmlspecialchars($_POST['ime']);
    $email = htmlspecialchars($_POST['email']);

    // Napredna validacija
    if (empty($ime)) {
        echo "Ime je obvezno polje.";
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        echo "Neveljaven format e-poštnega naslova.";
    } else {
        echo "Hvala, " . $ime . "! Vaši podatki so bili uspešno prejeti.";
    }
} else {
    echo "Neposreden dostop do skripte ni dovoljen.";
}
?>

Celovit vnosni obrazec

Ta primer predstavlja "master" obrazec, ki vključuje praktično vsa pogosta vnosna polja. Naučil se boš, kako s PHP-jem prevzeti besedilo, števila, datume, izbiro iz seznama in potrditvena polja.

  • index.php
  • procesiraj.php
PRIMER
REZULTAT

Zaščita gesel

Zaščita gesel je ključnega pomena za varnost uporabniških računov in aplikacij. V PHP-ju uporabimo funkcijo password_hash, ki nudi robustno in varno hrambo gesel.

  • index.php
  • procesiraj.php
PRIMER
REZULTAT

Ta funkcija privzeto uporablja algoritem bcrypt, ki je zelo učinkovit za to nalogo. Koraki za zaščito gesla:

Funkcija Namen Kdaj jo uporabimo?
password_hash() Ustvari varno šifrirano geslo (hash). Pri registraciji novega uporabnika.
password_verify() Preveri, če se vpisano geslo ujema s hash-em. Pri prijavi obstoječega uporabnika.
  • index.php
  • procesiraj.php
PRIMER
REZULTAT

S temi primeri lahko zagotovimo varno prijavo in registracijo uporabnikov v PHP-ju z uporabo password_hash. S funkcijo password_hash ni mogoče obrniti šifriranega gesla nazaj v njegovo izvirno obliko. password_hash uporablja enosmeren algoritem za ustvarjanje gesel, kar pomeni, da je izvirno geslo nemogoče rekonstruirati iz njegovega hash-a.

Izdelava tabele

Preden lahko začnemo shranjevati uporabnike, moramo v naši SQL bazi pripraviti ustrezno tabelo. Ključnega pomena je, da je stolpec password dovolj dolg (vsaj 255 znakov), saj funkcija password_hash ustvari dolge nize znakov, ki jih ne smemo odrezati.

<?php
$streznik = "localhost";
$uporabniskoIme = "root"; // Uporabniško ime za povezavo z bazo
$geslo = ""; // Geslo za povezavo z bazo
$baza_podatkov = "mysqli_baza_podatkov"; // Ime vaše baze podatkov

// Ustvari povezavo
$povezava = new mysqli($streznik, $uporabniskoIme, $geslo, $baza_podatkov);

// Preveri povezavo
if ($povezava->connect_error) {
    die("Povezava ni uspela: " . $povezava->connect_error);
}

// SQL poizvedba za ustvarjanje tabele
$tabela = "CREATE TABLE uporabniki (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)";

// Ustvari tabelo
if ($povezava->query($tabela) === TRUE) {
    echo "Tabela uporabniki je bila uspešno ustvarjena!";
} else {
    echo "Napaka pri ustvarjanju tabele: " . $povezava->error;
}

// Zapri povezavo
$povezava->close();
?>

Opomba: Nikoli ne uporabljajte starih algoritmov, kot sta md5 ali sha1 za gesla. Ti so danes zastareli in nevarni. Vedno uporabljaj password_hash s privzetim algoritmom PASSWORD_DEFAULT.

Gesla morajo biti vedno ustrezno zgoščena (ang. Hashed) pred shranjevanjem v bazo podatkov, ker, če pride do vdora v bazo, uporabniki ne smejo biti dodatno ogroženi zaradi razkritja novih gesel. PHP je uvedel funkcijo password_hash ravno zaradi tega in uporablja najnovejše in varne algoritme za izdelavo "hash-a". Ta funkcija upravlja tudi s salting-om (soljenjem), kar pomeni, da avtomatsko doda naključne vrednosti k našemu geslu za dodatno varnost. Primer uporabe:

// geslo uporabnika
$geslo = "MojeZeloMocnoGeslo123!";

// zgoščevanje (hash) gesla
$gesloHash = password_hash($geslo, PASSWORD_DEFAULT);

// izhod za shranjevanje v bazo podatkov
echo $gesloHash;

Funkcija PASSWORD_DEFAULT trenutno uporablja algoritem bcrypt, vendar lahko v prihodnosti preide na bolj varen privzeti algoritem, če bo na voljo. Ko uporabnik vpiše svoje geslo (npr. med prijavo), uporabimo funkcijo password_verify, da primerja vneseno geslo z že shranjenim "hash-om". Primer:

// geslo uporabnika
$geslo = "MojeZeloMocnoGeslo123!";

// zgoščevanje (hash) gesla
$shranjenHash = "$2y$10$wYrFr1vZyxE/DoTGMNOxBritish5764JsqzBYzNOdcdWy1zqHmuUG8";

// preverjanje gesla
if (password_verify($geslo, $shranjenHash)) {
    echo "Geslo je pravilno.";
} else {
    echo "Geslo je nepravilno.";
}

Pomembno je vedeti, da password_verify vrne true, če se ujemata, v nasprotnem primeru vrne false. Priporočeno je, da uporabljamo BCRYPT ali močnejše algoritme, kar trenutno uporablja password_hash. Lahko pa se izrecno odločimo za druge algoritme, npr. PASSWORD_ARGON2I ali PASSWORD_ARGON2ID, če potrebujemo višji nivo varnosti.

$hash = password_hash($password, PASSWORD_ARGON2I);

Priporočljivo je redno posodabljati hash. Če nadgradimo na bolj kompleksen algoritem, lahko izkoristimo password_needs_rehash, da preverimo, ali je hash zastarel.

if (password_needs_rehash($shranjenHash, PASSWORD_ARGON2I)) {
    $shranjenHash = password_hash($geslo, PASSWORD_ARGON2I);
}

Tudi najbolj varen hash ne bo pomagal, če bosta baza podatkov ali aplikacija ranljivi. Poskrbeti je potrebno za zaščito baze (npr. PDO in pripravljenih poizvedb za preprečevanje SQL vbrizgov). Brez potrebe ni potrebno implementirati lastnih mehanizmov za dodaten salting (soljenje), ker funkcija password_hash opravi to sama. Kar pa se tiče vdorov priporočam zelo močno geslo za bazo podatkov, ker samo tako se lahko zaščitimo, če pa do vdora pride, je potrebno vsem uporabnikom sporočiti za ponastavitev gesla.

Priporočljivo je tudi implementirati spremljanje sumljivih aktivnosti, kot recimo ponavljajoči poskusi prijave. Funkcija password_hash in spremljajoče funkcije, kot so password_verify in password_needs_rehash, zagotavljajo popolna orodja za varno delo z gesli. Izogibati pa se je potrebno starejšim metodam, kot je md5 ali sha1, ker niso več varne.