NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Změna hesla

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

Aktivity
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:11.5.2015 22:08

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
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Michal Kuba
Jan Lupčík:12.5.2015 6:11

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
TruckersMP vývojář
Avatar
Odpovídá na Michal Kuba
Neaktivní uživatel:12.5.2015 7:24

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
Neaktivní uživatelský účet
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Michal Kuba:12.5.2015 8:50

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

Nemáš sloupec password v tabulce :D

Nahoru Odpovědět
12.5.2015 9:14
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:12.5.2015 9:29

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
12.5.2015 9:29
Avatar
Nahoru Odpovědět
12.5.2015 10:01
Chybami se člověk učí, běžte se učit jinam!
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Michal Kuba
Jan Lupčík:12.5.2015 12:49

A ten název pole v $_SESSION pomohl?

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
12.5.2015 12:49
TruckersMP vývojář
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Jan Lupčík
Michal Kuba:12.5.2015 13:54

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
Odpovídá na Michal Kuba
Neaktivní uživatel:12.5.2015 14:14

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
12.5.2015 14:14
Neaktivní uživatelský účet
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Michal Kuba
Jan Lupčík:12.5.2015 14:35

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
TruckersMP vývojář
Avatar
Odpovídá na Michal Kuba
Michal Štěpánek:12.5.2015 14:41

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

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
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Michal Kuba:12.5.2015 18:42

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
Tvůrce
Avatar
Odpovídá na Jan Lupčík
Michal Kuba:12.5.2015 22:45

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
Tvůrce
Avatar
Odpovídá na Michal Kuba
mkub:13.5.2015 3:30

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
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Michal Kuba
Jan Lupčík:13.5.2015 6:31

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
13.5.2015 6:31
TruckersMP vývojář
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Jan Lupčík
Michal Kuba:13.5.2015 22:33

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
Odpovídá na Michal Kuba
Uživatel sítě :13.5.2015 22:46

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

Nahoru Odpovědět
13.5.2015 22:46
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:13.5.2015 22:50

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.