Zaščita strani pomeni, da do določenih delov aplikacije lahko dostopajo samo prijavljeni uporabniki. Takšne strani navadno vsebujejo občutljive podatke ali pa omogočajo spreminjanje podatkov v bazi.
Zaščita strani v spletni aplikaciji
Če želimo preprečiti dostop nepooblaščenim obiskovalcem, moramo na začetku zaščitene strani preveriti, ali je uporabnik uspešno prijavljen. To najpogosteje naredimo s pomočjo seje.
Osnovna logika zaščite strani je:
<?php
session_start();
if (!isset($_SESSION['user_id'], $_SESSION['logged_in'])) {
header('Location: 15_login.php');
exit();
}
?>
Če podatki o prijavi v seji ne obstajajo, uporabnika preusmerimo na prijavno stran. Če obstajajo, lahko nadaljuje delo na zaščiteni strani.
Zaščita strani je posebej pomembna pri:
- administrativnih straneh,
- obrazcih za dodajanje, urejanje in brisanje zapisov,
- straneh z osebnimi ali občutljivimi podatki.
Osnovni primer z mysqli
Spodnji zgled prikazuje klasično zaščito strani. Preden izvedemo
katerokoli poizvedbo z mysqli, najprej preverimo,
ali je uporabnik prijavljen.
<?php
session_start();
define('DB_SERVER', 'localhost');
define('DB_USER', 'uporabnik');
define('DB_PASS', 'skritoGeslo');
define('DB_NAME', 'knjiznica');
// Če uporabnik ni prijavljen, ga preusmerimo
if (!isset($_SESSION['user_id'], $_SESSION['logged_in'])) {
header('Location: 15_login.php');
exit();
}
// Šele nato odpremo povezavo z bazo
$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() . ')'
);
}
// Zaščitena vsebina strani
echo 'Dobrodošli na zaščiteni strani.';
mysqli_close($connection);
?>
Osnovni primer s PDO
Enako zaščito lahko uporabimo tudi pri delu z PDO.
Seja je pri zaščiti strani pomembnejša od tega, kateri vmesnik
uporabljamo za povezavo s podatkovno zbirko.
<?php
session_start();
$streznik = 'localhost';
$baza = 'knjiznica';
$uporabnik = 'uporabnik';
$geslo = 'skritoGeslo';
// Če uporabnik ni prijavljen, ga preusmerimo
if (!isset($_SESSION['user_id'], $_SESSION['logged_in'])) {
header('Location: 15_login.php');
exit();
}
try {
$pdo = new PDO("mysql:host=$streznik;dbname=$baza;charset=utf8mb4", $uporabnik, $geslo);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo 'Dobrodošli na zaščiteni strani.';
}
catch (PDOException $e) {
echo 'Zaščitene strani trenutno ni mogoče prikazati.';
}
?>
Dodatna zaščita dejanj na strani
Sama zaščita strani ni vedno dovolj. Če stran vsebuje obrazce za dodajanje, urejanje ali brisanje podatkov, moramo zaščititi tudi posamezna dejanja.
- obrazce zaščitimo s CSRF žetonom,
- brisanje in podobna dejanja dovolimo samo prek POST,
- vhodne podatke dodatno validiramo,
- za delo z bazo uporabljamo pripravljene poizvedbe.
Pomembnosti pri zaščiti strani
- zaščita strani se začne s preverjanjem $_SESSION,
- neprijavljenega uporabnika vedno preusmerimo,
- zaščititi moramo tudi posamezna dejanja na strani,
- za občutljive obrazce uporabimo CSRF zaščito,
- zaščitene strani naj uporabniku omogočajo tudi odjavo.
📘Aplikacija Knjige
V priloženih datotekah administrativnega dela aplikacije je zaščita
strani izvedena enotno. Na začetku strani se zažene seja in preveri,
ali sta v seji nastavljena podatka user_id in
logged_in. Če uporabnik ni prijavljen, se takoj
preusmeri na prijavno stran.
Takšno zaščito uporabljajo obrazci za dodajanje knjige, dodajanje z izpisom zadnjega ID-ja, večkratni vnos ter obrazec za urejanje zapisa. Na vrhu zaščitenih strani se nato izpiše tudi prijavljeni uporabnik in povezava za odjavo.
Posebej pomembno je tudi varno brisanje, kjer je dejanje dovoljeno
samo prek metode POST, zahtevek pa mora imeti veljaven
csrf_token. Če zaščita ni veljavna, se uporabnik vrne
na administrativno stran z opozorilom.
Navodila za izdelavo zaščite strani
- Na začetku strani zaženemo sejo s
session_start(). - Preverimo, ali v seji obstajajo podatki o prijavi uporabnika.
- Če uporabnik ni prijavljen, ga preusmerimo na prijavno stran.
- Šele nato prikažemo zaščiteno vsebino ali odpremo povezavo z bazo.
- Za obrazce in dejanja uporabimo še CSRF zaščito.
- Pri brisanju in podobnih dejanjih dovolimo samo metodo
POST. - Na zaščitenih straneh dodamo tudi možnost odjave.
Pri učenju je smiselno poznati oba pristopa:
- mysqli za klasično zaščito strani in nato delo z bazo,
- PDO za sodobnejši pristop pri povezavi z bazo,
- aplikacijski pristop, kjer zaščita strani, CSRF zaščita in validacija skupaj tvorijo varen sistem dostopa.