Diskuze: Změna hesla

PHP PHP Změna hesla American English version English version

Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:

Zdravím, zase otravuji, protože potřebuji radu nebo spíš najít drobnou chybku! :D

Ve chvíli volna jsem se rozhodl zprovoznit na webu možnost změny hesla - pouze jednoduše zadat nové heslo a znovu nové heslo - žádné ověřování se starým apod. (je to MVC)

V AdministraceKon­troler.php je tento skript obsluhující formulář pro změnu?

if ($_POST)
               {
                   try
                   {
                   $spravceUzivatelu = new SpravceUzivatelu();
                   $spravceUzivatelu->zmenHeslo($_SESSION['uzivatele']['jmeno'],$_POST['heslo'], $_POST['heslo_znovu']);
                   $this->pridejZpravu('Heslo změněno.');
                   $this->presmeruj('administrace');

                   }
                   catch (ChybaUzivatele $chyba)
                       {
                               $this->pridejZpravu($chyba->getMessage());
                       }
               }

zmenHeslo ve správci uživatelů je následující:

public function zmenHeslo($jmeno,$heslo,$hesloZnovu)
       {
           if ($heslo != $hesloZnovu)
                       throw new ChybaUzivatele('Hesla nesouhlasí.');
          else
               Db::zmen('uzivatele', $heslo, 'WHERE jmeno = ?', array($jmeno));

       }

a takto vypadá metdoa zmen v Db, je to ze zdejších zdrojů:

public static function zmen($tabulka, $hodnoty = array(), $podminka, $parametry = array()) {
                return self::dotaz("UPDATE `$tabulka` SET `".
                implode('` = ?, `', array_keys($hodnoty)).
                "` = ? " . $podminka,
                array_merge(array_values($hodnoty), $parametry));
        }

Když to změním, vyskočí mi pouze jakýsi dlouhý Fatal error, při znovunačtení se ale heslo nijak nezmění..

Nevidíte někdo proč?

 
Odpovědět 11.5.2015 22:08
Avatar
IT Man
Redaktor
Avatar
Odpovídá na Michal Kuba
IT Man:

Nemáš mít jenom $_SESSION['uzi­vatel']['jmeno'] (místo uzivatele uzivatel)? Nebo snad vždy měníš název pole? :D

Nahoru Odpovědět 12.5.2015 6:11
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Fredep
Redaktor
Avatar
Odpovídá na Michal Kuba
Fredep:

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));
}
Nahoru Odpovědět 12.5.2015 7:24
Týmová práce je důležitá proto, aby bylo možno obvinit z neúspěchu někoho jiného.
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Fredep
Michal Kuba:

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
 
Nahoru Odpovědět  -2 12.5.2015 8:50
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:

Noo, jasný :D 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 dá se přihlásit znovu pod stejným heslem, pod novým však ne :D

 
Nahoru Odpovědět  -4 12.5.2015 9:29
Avatar
Marek Z.
Redaktor
Avatar
Nahoru Odpovědět  +4 12.5.2015 10:01
Chybami se člověk učí, běžte se učit jinam!
Avatar
IT Man
Redaktor
Avatar
Odpovídá na Michal Kuba
IT Man:

A ten název pole v $_SESSION pomohl?

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 12.5.2015 12:49
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na IT Man
Michal Kuba:

no jo, tak to pomohlo! :D já to totiž asi nezměnil všude nebo co, no každopádně už se to mění jak potřebuju :) díky!

 
Nahoru Odpovědět 12.5.2015 13:54
Avatar
Filip Šohajek
Redaktor
Avatar
Odpovídá na Michal Kuba
Filip Šohajek:

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.

 
Nahoru Odpovědět  +3 12.5.2015 14:14
Avatar
IT Man
Redaktor
Avatar
Odpovídá na Michal Kuba
IT Man:

Není zač, ale kontroluj si ty názvy polí - vždy u názvů polí selháváš. :D

Nahoru Odpovědět 12.5.2015 14:35
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Odpovídá na Michal Kuba
Michal Štěpánek:

Jak píše Filip Šohajek 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...

Nahoru Odpovědět 12.5.2015 14:41
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Filip Šohajek
Michal Kuba:

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! :)

 
Nahoru Odpovědět 12.5.2015 18:42
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na IT Man
Michal Kuba:

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 :O

 
Nahoru Odpovědět 12.5.2015 22:45
Avatar
mkub
Redaktor
Avatar
Odpovídá na Michal Kuba
mkub:

este skor, nez uzivatelov na to nalakas, mal by si rozmyslat aj nad tym... uz v ostrej verzii by to malo byt zaclenene

 
Nahoru Odpovědět 13.5.2015 3:30
Avatar
IT Man
Redaktor
Avatar
Odpovídá na Michal Kuba
IT Man:

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);
        }
Editováno 13.5.2015 6:32
Nahoru Odpovědět  +1 13.5.2015 6:31
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na IT Man
Michal Kuba:

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?

 
Nahoru Odpovědět 13.5.2015 22:33
Avatar
Marek Z.
Redaktor
Avatar
Odpovídá na Michal Kuba
Marek Z.:

Co na tom vidíš nebezpečné? Prostě klasická kontrola hesla jako například při loginu.

Nahoru Odpovědět  +1 13.5.2015 22:46
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Marek Z.
Michal Kuba:

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..

 
Nahoru Odpovědět 13.5.2015 22:50
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 19 zpráv z 19.