Většina webů má místo, které je jen pro přihlášené: administraci, účet zákazníka nebo členskou sekci. Přihlášení v PHP má tři kroky: ověřit heslo, zapamatovat si uživatele v session a na chráněných stránkách kontrolovat, zda je přihlášen.
Hesla se neukládají jako text
Heslo nikdy neukládejte do databáze tak, jak ho uživatel napsal. Použijte jednosměrný otisk: při registraci funkci password_hash a při přihlášení funkci password_verify.
// při registraci
$hash = password_hash($heslo, PASSWORD_DEFAULT);
// $hash uložte do sloupce hesla
// při přihlášení
if (password_verify($zadaneHeslo, $ulozenyHash)) {
echo "Heslo sedí.";
}
Funkce password_verify porovná zadané heslo s otiskem. Původní text se tak nedá zjistit ani z databáze. Pro sloupec s otiskem je vhodná délka VARCHAR(255).
Session: paměť mezi stránkami
HTTP je bezstavový, takže každá stránka je nová. Session umožňuje serveru poznat stejného návštěvníka při dalším kliknutí. Spustí se funkcí session_start(), která musí být na úplném začátku skriptu, před jakýmkoli výstupem:
<?php
session_start();
// ... zbytek stránky ...
Přihlášení: uložení do session
<?php
session_start();
// $uzivatel = řádek z tabulky podle e-mailu (viz návod o databázi)
if ($uzivatel && password_verify($heslo, $uzivatel['heslo'])) {
session_regenerate_id(true); // nové ID proti zneužití staré session
$_SESSION['uzivatel_id'] = $uzivatel['id'];
header('Location: /administrace.php');
exit;
}
Funkce session_regenerate_id(true) při každém přihlášení vytvoří nové ID session. Do $_SESSION ukládáme jen to nejnutnější, tedy identifikátor uživatele.
Kontrola na chráněné stránce
<?php
session_start();
if (!isset($_SESSION['uzivatel_id'])) {
header('Location: /prihlaseni.php');
exit;
}
// ... obsah jen pro přihlášené ...
Důležité je exit za přesměrováním. Přesměrování samo o sobě skript nezastaví, takže bez exit by se citlivá část kódu dál provedla.
Odhlášení
<?php
session_start();
$_SESSION = [];
session_destroy();
header('Location: /');
exit;
Časté chyby
- Výstup před session_start(). Prohlížeč pak hlásí chybu „headers already sent“ a session nefunguje. Před
<?phpani mezi ním asession_start()nesmí být žádný text ani mezera. - Chybějící exit za přesměrováním. Skript pokračuje dál a může provést chráněnou část.
- Heslo v čistém textu. Porovnávat heslo přímo v SQL dotazu je riziko. Použijte password_hash a password_verify.
- Stejné ID po přihlášení. Bez session_regenerate_id(true) může útočník zneužít starou session.
Teď umíte udělat přihlášení, které hesla bezpečně ověří, a stránky, které uvidí jen přihlášený návštěvník. Na tomhle stavíte administraci webu. 👍
Všechny návodyNechcete web řešit sami a chcete ho mít hotový a profesionální?
Podívejte se na tvorbu webů →© Ondřej Šteigl. Návody vznikají ve spolupráci s Claude (AI) a jsou upravovány autorem. Autorská práva k vlastním úpravám a příkladům náleží Ondřeji Šteiglovi. Kopírování nebo šíření celých textů bez písemného souhlasu je zakázáno. Výukové použití je vítáno, uveďte prosím zdroj (osteigl.cz).