Avatar
pgarsky
Člen
Avatar
pgarsky:

Ahoj, omlouvám se, že tu přidávám tak často vlákna. Chtěl jsem se jen zeptat, je bezpečné do $_SESSION ukládat heslo, co uživatel zadal do přihlášení?

 
Odpovědět 3. září 15:56
Avatar
Nahoru Odpovědět 3. září 16:27
Hlupák nie je ten kto niečo nevie, hlupákom sa stávaš v momente keď sa na to bojíš opýtať.
Avatar
pgarsky
Člen
Avatar
Odpovídá na Dominik Gavrecký
pgarsky:

A kód by nebyl ? Tam tomu moc nerozumim.

 
Nahoru Odpovědět 3. září 16:51
Avatar
Oxtimus
Člen
Avatar
Odpovídá na pgarsky
Oxtimus:

Pracovat s heslem ve své čiré podobě není bezpečné už ze své podstaty. Čitelné heslo by nemělo být ani v PHP (a tedy ani v $_SESSION), ani v databázi a nemělo by se ani posílat nikam na email. Heslo by neměl znát nikdo jiný, než uživatel (ani administrátor webu).

Ideálně by si to měl vyřešit tak, že jakmile uživatel zadá heslo (např. pro registraci), tak ho hned po odeslání na server zahashuješ pomocí password_hash() a dál budeš pracovat už jen s tímto hashem.

Tento způsob tedy není bezpečný, protože v databázi je klasické heslo (např. 123456789):

if ($hesloZDatabaze === $_POST['heslo']) {
   // Uživatel přihlášen
}

Takhle by to bylo mnohem lepší, protože se neporovnávají hesla, ale pouze jejich otisky (hashe):

if (password_verify($_POST['heslo'], $hashZDatabaze)) {
   // Uživatel přihlášen
}

Pokud chceš umístit do $_SESSION otisk hesla, pak je to mnohem lepší, než kdyby si tam umístil samotné heslo, ale stále je lepší ho tam vůbec neumisťovat, pokud to není vyloženě nutné (což většinou není, protože heslo nikde nevypisuješ a potřebuješ ho pouze při autentifikaci).

Editováno 3. září 17:17
 
Nahoru Odpovědět  +3 3. září 17:14
Avatar
pgarsky
Člen
Avatar
Odpovídá na Oxtimus
pgarsky:

Mám v nastavení možnost deaktivace účtu, a tam mám napsáno, že musí zadat heslo, ale je to samostatná stránka, takže bych se musel složitě připojovat k DB, vypisovat údaje atd. A do toho se mi zrovna moc nechce.

 
Nahoru Odpovědět 3. září 17:20
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na pgarsky
Marek Z.:

Proč toto vlastně řešíš, k čemu to potřebuješ/vy­užiješ? (Napsáno před tvým komentářem)

EDIT: Jak složitě?

Editováno 3. září 17:23
Nahoru Odpovědět 3. září 17:21
Chybami se člověk učí, běžte se učit jinam!
Avatar
Oxtimus
Člen
Avatar
Odpovídá na pgarsky
Oxtimus:

Ale pokud uživatel deaktivuje účet, tak se stejně musíš k databázi připojit, aby si k danému uživateli přidal nějakou značku toho, že se jedná o deaktivovaný účet (popř. smazal řádek úplně). Nebo to řešíš nějak bez databáze?

 
Nahoru Odpovědět  +2 3. září 17:24
Avatar
Odpovídá na pgarsky
Michal Štěpánek:

takže bych se musel složitě připojovat k DB...

jak složitě? Připojíš se do DB, zkontroluješ, jestli hash zadaného hesla je shodný s hashem hesla v DB a je to...

Nahoru Odpovědět  +2 3. září 17:27
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
pgarsky
Člen
Avatar
Odpovídá na Michal Štěpánek
pgarsky:

Ale to já ještě neumím.

 
Nahoru Odpovědět  -2 3. září 17:41
Avatar
pgarsky
Člen
Avatar
Odpovídá na Oxtimus
pgarsky:
<?php
session_start();
require('Db.php');
Db::connect('127.0.0.1', 'uzivatele', 'root', '');
if (!isset($_SESSION['id']))
{
    header('Location: http://localhost:63342/ucet/index.php');
    exit();
}
if ($_POST)
{
    if ($_POST['heslo'] != $_SESSION['heslo'])
    {
        echo('<p style="text-align: center; font-size: 25px;">Nesprávné heslo.</p>');
    }
    else
    {
        session_destroy();
        Db::query('
        DELETE from uzivatele
        WHERE id=?
        ', $_SESSION['id']);
        header('Location: http://localhost:63342/ucet/index.php');
        exit();
    }
}
?>

Zde vidíš kód, přes který bych to nejraději udělal.

 
Nahoru Odpovědět  +1 3. září 17:43
Avatar
Oxtimus
Člen
Avatar
Odpovídá na pgarsky
Oxtimus:

Nemusel by ses nijak složitě připojovat do databáze, vždyť tam už připojení máš. Když tedy pominu ty hashe a zaměříme se pouze na funkčnost, nestačilo by dotaz upravit na něco takového?

Db::query('
DELETE from uzivatele
WHERE id = ? AND heslo = ?
', [$_SESSION['id'], $_POST['heslo']]);
 
Nahoru Odpovědět  +1 3. září 17:49
Avatar
pgarsky
Člen
Avatar
Odpovídá na Oxtimus
pgarsky:

Ale to tam pořád musí být ta podmínka if, ne ? Ta pokud se hesla rovnají.

 
Nahoru Odpovědět 3. září 17:56
Avatar
Oxtimus
Člen
Avatar
Odpovídá na pgarsky
Oxtimus:

Nemusí, dotaz na vymazání se provede v každém případě. Vymaže všechny uživatele, kteří mají určité ID a zároveň určité heslo. Pokud ale uživatel zadá chybné heslo, tak se sice dotaz provede, ale nikdo se nevymaže, jelikož bude souhlasit pouze ID, ale heslo bude chybné.

A pokud chceš vypsat hlášku o úspěšnosti smazání, pak nevím přesně, jak ten wrapper funguje a jestli metoda Db::query vrací počet ovlivněných (smazaných) záznamů, ale pokud ano, mohlo by to vypadat nějak takto:

if(Db::query('DELETE from uzivatele WHERE id = ? AND heslo = ?', [$_SESSION['id'], $_POST['heslo']]) {
   echo 'Účet byl deaktivován.';
} else {
   echo 'Špatné heslo.';
}
Editováno 3. září 18:02
 
Nahoru Odpovědět 3. září 18:00
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.