Diskuze: Změna hesla
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 19 zpráv z 19.
//= 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.
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
Nemáš sloupec password v tabulce
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.