Diskuze: Změna hesla
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 19 zpráv z 19.
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.
Nemáš mít jenom $_SESSION['uzivatel']['jmeno'] (místo
uzivatele uzivatel)? Nebo snad vždy měníš název pole? 
Ahoj, když voláš metodu DB:zmen, druhý parametr by měl být asi pole, ale ty předáváš čistě jen heslo. Musíš také uvést jeho název ve sloupci.
else
Db::zmen('uzivatele', array('password' => $heslo), 'WHERE jmeno = ?', array($jmeno));
}
Zkusil jsem tak nějak všechny možnosti, ale stále to háže chybu. Vidíte v té dlouhé hlášce něco jasnýho, co by ukazovalo na nějakou jasnou chybu?
Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'password' in 'field list'' in /home/users/enistory/eni-story.cekuj.net/web/modely/Db.php:50 Stack trace: #0 /home/users/enistory/eni-story.cekuj.net/web/modely/Db.php(50): PDO->prepare('UPDATE `uzivate...') #1 /home/users/enistory/eni-story.cekuj.net/web/modely/Db.php(68): Db::dotaz('UPDATE `uzivate...', Array) #2 /home/users/enistory/eni-story.cekuj.net/web/modely/SpravceUzivatelu.php(20): Db::zmen('uzivatele', Array, 'WHERE jmeno = ?', Array) #3 /home/users/enistory/eni-story.cekuj.net/web/kontrolery/AdministraceKontroler.php(22): SpravceUzivatelu->zmenHeslo(NULL, '123456', '123456') #4 /home/users/enistory/eni-story.cekuj.net/web/kontrolery/SmerovacKontroler.php(50): AdministraceKontroler->zpracuj(Array) #5 /home/users/enistory/eni-story.cekuj.net/web/index.php(25): SmerovacKontroler->zpracuj(Array) #6 {main} thrown in /home/users/enistory/eni-story.cekuj.net/web/modely/Db.php on line 50
Noo, jasný
Ale teď su
z toho ještě větší kokot -> napíše mi to úspěšnou hlášku (heslo
změněno) ale vlastně se nezmění
dá se přihlásit znovu pod stejným heslem, pod novým však ne 
A ten název pole v $_SESSION pomohl?
no jo, tak to pomohlo!
já to totiž asi nezměnil všude nebo co, no každopádně už se to mění
jak potřebuju
díky!
Každopádně je bezpečnostní chyba když nezadáváš stávající heslo při změně. Jmenuju to kvůli tomu, že když se potencionální útočník dostane na uživatelův účet, může mu změnit heslo. Dále například kvůli CSRF.
Není zač, ale kontroluj si ty názvy polí - vždy u názvů polí
selháváš. 
Jak píše Neaktivní uživatel je to dost bezpečnostní hrozba, měl by sis alespoň vyžádat autentizaci mailem (před uskutečněním té změny hesla), když už nepožaduješ původní heslo...
Já tam samozřejmě hodlám doplnit zadání starého hesla, až to nasadím na ostrou verzi a nalákám uživatele.. Jen tedy musím rozlišit proměnnou například $heslo a $noveHeslo, je to tak?
Zkusím se dnes večer na to podívat a pokusit se to vylepšit.. díky moc
lidi! 
Ještě jsem se snažil skloubit to se zadáním starého hesla, ale marně jaksi.. :/
Přidal jsem toto do formuláře:
Staré heslo<br />
<input type="password" name="stareHeslo" /><br />
V kontroleru předávám pak toto:
$spravceUzivatelu->zmenHeslo($_SESSION['uzivatel']['jmeno'],$_POST['stareHeslo'],$_POST['noveHeslo'], $_POST['noveHeslo_znovu']);
a ve správci uživatelů to pak dodělám takto:
public function vratOtisk2($noveHeslo)
{
$sul = 'fd16sdfd2ew#$%';
return hash('sha256', $noveHeslo . $sul);
}
public function vratOtisk3($stareHeslo)
{
$sul = 'fd16sdfd2ew#$%';
return hash('sha256', $stareHeslo . $sul);
}
public function zmenHeslo($jmeno,$stareHeslo,$noveHeslo,$noveHeslo_znovu)
{
if (($this->vratOtisk3($stareHeslo))!= ($_SESSION['uzivatel']['heslo']) )
throw new ChybaUzivatele('Špatně zadané staré heslo!');
else if ($noveHeslo != $noveHeslo_znovu)
throw new ChybaUzivatele('Hesla nesouhlasí.');
else
Db::zmen('uzivatele', array('heslo' => $this->vratOtisk2($noveHeslo)), 'WHERE jmeno = ?', array($_SESSION['uzivatel']['jmeno']));
}
ale údajně zadávám špatné staré heslo 
este skor, nez uzivatelov na to nalakas, mal by si rozmyslat aj nad tym... uz v ostrej verzii by to malo byt zaclenene
Jde o to, jestli máš uložené v $_SESSION heslo uživatele. Pokud ne,
vytáhni si ho během zjišťování hesla. 
Btw. proč máš tolik funkcí stejných? Nestačí jedna?
public function vratOtisk($heslo)
{
$sul = 'fd16sdfd2ew#$%';
return hash('sha256', $heslo . $sul);
}
Ono totiž v poli SESSION to heslo není.. Musím pro to dělat speciálně funkci? Ale to pak nebude asi bezpečný, vytahovat celou tu dlouhou změť znaků z DB, ne?
Co na tom vidíš nebezpečné? Prostě klasická kontrola hesla jako například při loginu.
Už je to v pohodě! Nastavil jsem, že při přihlašování SELECTnu
ještě navíc heslo, ale musel jsem se znovu přihlásit, aby se dlouhý otisk
načetl a už změna hesla funguje 
Šlo o to, že to heslo nebylo v SESSION, takže jsem ho tam musel dodatečně přidat - bylo tam jen ID, jmeno a hodnota adminu..
Zobrazeno 19 zpráv z 19.
