Autor Zpráva
Hitman
Profil
Dobrý podvečer,

celé odpoledne řeším problém s přihlašováním pomocí cookies, tedy spíše s odhlašováním. Přihlašování provedu takto:

SetCookie ("mujweb_cl_login", $_POST['email'], time()+30*60);
SetCookie ("mujweb_cl_klic", $sifrovana_cast_hesla, time()+30*60);

Poté přesměruji (přes headers) na hlavní stránku a tam odhlašuji pomocí GET:

if($_GET['s'] == 'odhlaseni'){
    setcookie ("mujweb_cl_login", "", time()-60*60*24);
setcookie ("mujweb_cl_klic", "", time()-60*60*24);

Pro přesměrování používám:

header("HTTP/1.1 301 Moved Permanently");
        header("Location: http://mujweb.cz/podsekce");
        header("Connection: close");

Celá aplikace běží v podadresáři mujweb.cz/podsekce. Čili podsekce/login.php a index.php.

Pokud za odhlášení neuvedu přesměrování, vše funguje jak má - přesměrování ale potřebuji provést, buď na index celého webu, nebo alespoň na mujweb.cz/podsekce/index.php, protože jinak uživatel nepozná že se něco stalo...

Pokud tam přesměrování nechám, chová se to podivně. Poprvé se většinou odhlásit (smazat cookies) podaří, při dalších pokusech už ne. Pokud to smažu tak musím asi 50x obnovovat stránku (ctrl+F5) než opět funguje...


Měl bych 2 otázky:

1) Proč mi nefunguje odhlášení? Viz. výše

2) Používá se reálně takové přihlašování uživatelů? Myslím ukládání loginu(emailu) a šifrovaného hesla? (heslo šifruji crypt() už do db, potom jej vytáhnu, použiji vlastní algortimus (přeházení znaků, přidání soli atp.) a uložím do cookies.

Díky
Sitole
Profil
Hitman:
Já osobně bych nic podobného nepoužíval. Velice často se používá ukládání tokenu. Klasické sušenky se používají spíše k ukládání nějakých obecných informací jako například nastavení vzhledu, přečtení, zobrazení. K ukládání citlivých údajů se převážně používá Session.

Při přihlášení uživatele si vytvoříš nějaký dostatečně dlouhý a náhodný řetězec znaků, který uložíš pro uživatele do session a to samé vložíš do databáze. Přičemž tabulka bude obsahovat jak řetězec, tak datum expirace. Při ověření přihlášení poté ověříš zda token od uživatele existuje ve tvé tabulce a zda je stále aktivní. Při odhlášení nejlépe deaktivuješ token jak v tabulce, aby nešel použít někým jiným a vymažeš i session.

Ještě dodám, že na ukládání hesla bych používal modernější náhradu password hash.
Hitman
Profil
Byl jsem zvyklý dlouhou dobu právě na sušenky, ale teď jde o větší projekt a tak nechci bezpečnost ohrozit.

Chápu to správně tak že při přihlášení vložím do db speciální řetězec ke každému uživateli, řekněme pro našeho živatele "nahodny_retezec" a datum kdy má exprirovat přihlášení.

Při každém přístupu na stránku kontroloji zda cookie $_SESSION['uzivatel'] obsahuje "nahodny_retezec" a zda nebyla překročena expirace. Pokud je vše v pořádku, expiraci prodloužím.

Uživatel přijde po expiraci - už ho nepustím a zároveň "nahodny_retezec" smažu.

Uživatel se odhlásí - "nahodny_retezec" smažu.

Je to tak?
Keeehi
Profil
Hitman:
Ne, to vůbec není potřeba.

Přihlášení
$_SESSION['login'] = $_POST['email'];

Odhlaseni
$_SESSION['login'] = NULL;

O žádné náhodné řetězce se starat nemusíš.
Hitman
Profil
Takže SESSION není možné nijak uměle vytvořit?

Protože pokud by to možné bylo, stačilo by vyzkoušet vytvořit různé session (login, uzivatel, clovek atp.) a vložit do nich jakoukoliv hodnotu a vypadalo by to že je uživatel přihlášený.

Je dobré ukládat alespoň čas do DB jak psal Sitole, nebo ten můžu také bezpečeně uložit do druhé session? Tak aby ho nemohl nikdo jiný ovlivnit..
Keeehi
Profil
K obsahu pole v proměnné $_SESSION má přístup jen PHP. Tudíž uživatel ho sám nijak změnit nemůže. Jediné, co může uživatel (útočník) ovlivnit je cookie, která identifikuje. Což je nejčastěji asi 32 znakový řetězec? Nevím přesně kolik znaků to má ale je to dost na to, aby se dalo předpokládat, že nejde uhádnout jaký je validní identifikátor nějakého uživatele.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: