Autor | Zpráva | ||
---|---|---|---|
hawk-eye Profil * |
#1 · Zasláno: 5. 12. 2012, 11:32:29 · Upravil/a: Moderátor (editace znemožněna) 5. 12. 2012, 20:41:07
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 |
#2 · Zasláno: 5. 12. 2012, 11:43:42
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 * |
#3 · Zasláno: 5. 12. 2012, 12:08:35
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()); |
||
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) . '" '; |
||
hawk-eye Profil * |
#5 · Zasláno: 5. 12. 2012, 15:24:56
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 |
#6 · Zasláno: 5. 12. 2012, 18:22:14
Zkus někam na začátku skriptu dočasně povolit vypisování chyb
<?php error_reporting(E_ALL); //... ?> 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 * |
#7 · Zasláno: 7. 12. 2012, 11:45:11 · Upravil/a: hawk-eye
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 ?> |
||
Časová prodleva: 11 let
|
0