NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Heslo v SESSION

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
pgarsky
Člen
Avatar
pgarsky:3.9.2016 15:56

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.9.2016 15:56
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Nahoru Odpovědět
3.9.2016 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:3.9.2016 16:51

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

Nahoru Odpovědět
3.9.2016 16:51
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Michal
Člen
Avatar
Odpovídá na pgarsky
Michal:3.9.2016 17:14

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.9.2016 17:17
 
Nahoru Odpovědět
3.9.2016 17:14
Avatar
pgarsky
Člen
Avatar
Odpovídá na Michal
pgarsky:3.9.2016 17:20

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.9.2016 17:20
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Odpovídá na pgarsky
Uživatel sítě :3.9.2016 17:21

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.9.2016 17:23
Nahoru Odpovědět
3.9.2016 17:21
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal
Člen
Avatar
Odpovídá na pgarsky
Michal:3.9.2016 17:24

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
3.9.2016 17:24
Avatar
Odpovídá na pgarsky
Michal Štěpánek:3.9.2016 17:27

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
3.9.2016 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:3.9.2016 17:41

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

Nahoru Odpovědět
3.9.2016 17:41
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
pgarsky
Člen
Avatar
Odpovídá na Michal
pgarsky:3.9.2016 17:43
<?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
3.9.2016 17:43
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Michal
Člen
Avatar
Odpovídá na pgarsky
Michal:3.9.2016 17:49

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
3.9.2016 17:49
Avatar
pgarsky
Člen
Avatar
Odpovídá na Michal
pgarsky:3.9.2016 17:56

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

Nahoru Odpovědět
3.9.2016 17:56
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Avatar
Michal
Člen
Avatar
Odpovídá na pgarsky
Michal:3.9.2016 18:00

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.9.2016 18:02
 
Nahoru Odpovědět
3.9.2016 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.