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


Zobrazeno 13 zpráv z 13.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.