Diskuze: Heslo v SESSION
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 13 zpráv z 13.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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).
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.
Proč toto vlastně řešíš, k čemu to potřebuješ/využiješ? (Napsáno před tvým komentářem)
EDIT: Jak složitě?
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?
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...
<?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.
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']]);
Ale to tam pořád musí být ta podmínka if, ne ? Ta pokud se hesla rovnají.
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.';
}
Zobrazeno 13 zpráv z 13.