Autor Zpráva
hawk-eye
Profil *
Zdravím,
potřeboval bych poradit, mám potíž s tím, že když si nechám na email zaslat nové heslo, tak se mi sice na email doručí, ale v databázi se nepřepíše, nevíte kde mám chybu?
case 'obnovHeslo':
      $email = (isset($_POST['email'])) ? $_POST['email'] : '';
      if (!empty($email)) {
        $sql = 'SELECT email FROM uzivatele WHERE email="' .
        mysql_real_escape_string($email, $db) . '"';
        $result = mysql_query($sql, $db) or die(mysql_error($db));
        if (mysql_num_rows($result) > 0) {
          $password = strtoupper(substr(sha1(time()), rand(0, 32), 8));
          $subject = 'Obnovení hesla';
          $body = 'Toto heslo bylo vygenerováno automactiky pomocí funkce obnova hesla. ' .
                    'Nezapomeňte si je v nastavení změnit' . "\n\n";
          $body .= 'Vaše nové heslo je: ' . $password;
          mail($email, $subject, $body);
        }
        mysql_free_result($result);
      }
      redirect('login.php');
      break;

Děkuji za Vaše rady.
Joker
Profil
hawk-eye:
Chyba je v tom, že tam nikde ani není kód, který by to heslo do databáze uložil.
Za řádkem 8 by se někde měl do databáze poslat UPDATE dotaz, který to heslo změní.
hawk-eye
Profil *
samozřejmě to tam mám - vložil jsem sem omylem výpis ze staršího soubor - resp. v tom novějším mám ještě přidaný 9. řádek
$query = 'UPDATE uzivatele SET password = PASSWORD("' .  mysql_real_escape_string($password, $db) . '")
        WHERE email = ' . $email;  mysql_query($query, $db) or die(mysql_error());
omlouvám se za původní mystifikaci...
DJ Miky
Profil
Podmínku na email v tom dotazu bys měl mít obalenou v uvozovkách (a také ošetřenou pomocí mysql_real_escape_string):
$query = ' ... WHERE email = "' . mysql_real_escape_string($email) . '" ';
Ale to by ti mělo zahlásit už mysql_error() za voláním mysql_query(), to nic nevypíše?
hawk-eye
Profil *
tak ani po navrhované úpravě nic... nové heslo na email chodí ale v databázi je pořád to staré... a mysql_error nic nehlásí...
DarkMeni
Profil
Zkus někam na začátku skriptu dočasně povolit vypisování chyb
<?php
error_reporting(E_ALL);
//...
?>
jestli tam někde nebude třeba něco jako že připojení s databází selhalo nebo něco podobného

A nebo, jestli tam máš víc otevřených spojení s databázemi, tak zkus k mysql_error() dopsat ukazatel na to spojení ($db) / a když máš spojení jen jedno, tak tam ty ukazatele nepotřebuješ, jen pak znepřehledňují kód

Jo, a tam, kde posílaš UPDATE dotaz na databázi [#3], escapuješ heslo, který je po sha1 hashi jen z čísel a písmen, takže nic nebezpečnýho pro dotaz / ale pak tam dáváš $email, kterej není escapovanej a je už nejspíš zadatelnej uživatelem => escape na $password bys mohl dát pryč a $email escapnout ještě při vytvoření proměnné (abys to neescapoval 2x) - jako chyba to ani neni, jen to pak trochu (asi o pár milisetin) zpomaluje zpracovávání
hawk-eye
Profil *
tak ani po doplnění error reporting mi to nic za cchybu neháže... tak já už nevím...


tak teď se dívám do databáze po tom ošetření emailu to opravdu funguje, resp. heslo se přepíše.. akorát je už zpětně nemohu dostat z databáze při přihlášení... jelikož se ukládá v něčem jiném...
resp. provedu-li novou registrace s heslem "heslo" tak v databázi dostanu vzorec o délce 16 znaků
provedu-li změnu hesla v databázi pomoci příkazu UPDATE uzivatele SET password = SHA1('heslo') WHERE id ="1", tak dostanu vzorec o délce 40 znaků... tudíž budu mít někde blbě nastavené šifrování do databáze, ne?
DarkMeni
Profil
Spíš než šifrování databáze, tak hesla - zkus se podívat na algoritmus zašifrování hesla při registraci, na algoritmus vygenerování hesla při zažádání o nové a pak ještě na algoritmus srovnání hesel při kontrole přihlášení

sha1 zahashuje řetězec na dělku 40 znaků - to souhlasí

algoritmus, kterej máš tedy při registraci ale asi vypadá nějak takto:
<?php
//takhle to máš v [#1] na obnovu hesla
$password = strtoupper(substr(sha1(time()), rand(0, 32), 8));
//takže při registraci to možná máš nějak takto
$password = strtoupper(substr(sha1($_POST['heslo']), rand(0, 24), 16));
//a nebo úplně jinak
?>
každopádně si ale vyber jen jeden algoritmus, podle kterýho je budeš vytvářet, aby fungovalo srovnávání

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: