Autor | Zpráva | ||
---|---|---|---|
novacek90 Profil |
#1 · Zasláno: 19. 8. 2013, 21:46:50
Ahoj,
zkouším vytvořit script pro vygenerování zapomenutého hesla. Mám tento kód: <?php //Vložíme soubor s připojením k databázi. require_once 'connect.php'; if(isset($_POST['submit'])){ $login = stripcslashes(htmlspecialchars(trim($_POST['login']))); $email = stripcslashes(htmlspecialchars(trim($_POST['email']))); if(!empty($login)){ if(!empty($email)){ if(!preg_match("/^[a-z0-9_-]{1,20}+(\.){0,20}+([a-z0-9_-]){0,20}@(([a-z0-9-]+\.)+(com|net|org|mil|". "edu|gov|arpa|info|biz|inc|name|[a-z]{2})|[0-9]{1,3}\.[0-9]{1,3}\.[0-". "9]{1,3}\.[0-9]{1,3})$/is",$email)){ echo 'E-mail není platný'; } // Vygenerujeme nové heslo, do proměnné $date uložíme dnešní datum a čas $date = date('YmdHis'); // použijeme md5 šifrování $new_password = md5($date); // vybereme 6 symbolů $new_password = substr($new_password,2,6); // Zašifrujeme ho jako obvykle a uložíme do DB $new_password_enc = md5($new_password); $query1 = mysql_query("UPDATE uzivatele SET heslo='".$new_password_enc."' WHERE login='".$login."'"); if(!$query1) { echo mysql_error() . " - " . mysql_errno(); } else { // Pošleme uživateli e-mail s novým heslem $to = $email; $subject = "Obnovení hesla"; $message = "<div style=\"font-size:11pt; font-family:Times New Roman; color:black; padding:5px;\"><div>Dobrý den,</div>"; $message .= "<div style=\"margin:10px 0;\">Váše nové heslo je: ".$new_password."</div>"; $message .= "<div>S pozdravem, </div>"; $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n"; $headers .= 'From: <admin@localhost.cz>' . "\r\n"; $mail = mail($to, $subject, $message, $headers); if($mail) { echo "E-mail s novým heslem byl odeslán. <a href=\"index.php\">Hlavní stránka</a>"; echo $to; // pro zjištění co by se mělo odeslat echo $subject; // pro zjištění co by se mělo odeslat echo $message; // pro zjištění co by se mělo odeslat echo $headers; // pro zjištění co by se mělo odeslat } else { echo "E-mail nebyl odeslán. Zkuste to znovu. <a href=\"index.php\">Hlavní stránka</a>"; } } } else{ echo 'Vyplňte e-mail'; } } else{ echo 'Vyplňte login'; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Nové heslo</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head> <body> <h2>Obnovit heslo</h2> <form action="#" method="POST"> <div><label for="login">Váš login:</label></div> <div><input type="text" name="login"></div> <div><label for="email">Váš e-mail:</label></div> <div><input type="text" name="email"></div> <div><input type="submit" name="submit" value="Odeslat"></div> </form> </body> </html> Vše proběhne v pořádku jen se neodešle mail. A jelikož se provede podmínka if($mail) tak nevím co dělám špatně.
Tím že by můj hosting nepodporoval funkci mail() to není, jelikož tento kód funguje: <?php $to = 'muj e-mail'; $subject = 'the subject'; $message = 'hello'; $headers = 'From: webmaster@example.com' . "\r\n" . 'Reply-To: webmaster@example.com' . "\r\n" . 'X-Mailer: PHP/' . phpversion(); mail($to, $subject, $message, $headers); ?> Nevíte kde by mohla být chyba?? Díky za rady |
||
Keeehi Profil |
#2 · Zasláno: 19. 8. 2013, 22:08:55
Pokud provedeš
var_dump($to) , je v něm přesně to, co by jsi očekával?
Jinak to co provádíš je bezpečnostní díra jako prase. 1. Nekontroluješ vůbec, čí je to email, na který to posíláš. 2. I když toto opravíš, stále jako útočník nemusím mít přístup k tomu emailu a heslo budu znát. Stačí mi vědět, kdy ten formulář odešlu a vím, jaké je heslo (můžu ho dopočítat). Možná se ti zdá, že neznalost toho postupu, jak heslo dopočítat je dostatečná ochrana, ale není. Možná tak pro nějaký blogísek, ale ani tam bych to nepoužil. Když už, tak alespoň použij microtime() .
3. + jelikož se heslo generuje, tam by problém SQL injection nastat neměl, ale login by měl být ošetřený pomocí mysql_real_escape_string()
|
||
novacek90 Profil |
#3 · Zasláno: 19. 8. 2013, 22:27:16
Keeehi:
Jak myslíš že mám použít ten var_dump ?
A když pozměnim dotaz na : $query1 = mysql_query("UPDATE uzivatele SET heslo='".$new_password_enc."' WHERE login='".$login."' AND email='".$email."'"); Jinak s tím časem mě to taky napadlo že asi není dobrý to takhle řešit, ale mě nenapadlo co použít co se stále mění?? A neměl by jsi nápad co místo toho použít?? Takže login z formuláře nemám ošetřovat $login = stripcslashes(htmlspecialchars(trim($_POST['login']))); , ale takhle $login = mysql_real_escape_string($_POST['login']); ??
|
||
Joker Profil |
Ad [#2] Keeehi:
Musím říct, že zaslání hesla mnou zvoleného uživatele na mnou zvolený e-mail je velmi zvláštní funkčnost :-) Taky je dobré si uvědomit, že ten MD5 hash je číslo v šestnáctkové soustavě, takže na každém místě může být jen 16 různých hodnot (0-9, A-F) Čili je to podstatně snazší na prolomení hrubou silou, než heslo obsahující i třeba jen malá písmena anglické abecedy. novacek90: „použijeme md5 šifrování“ MD5 není šifrování „> A když pozměnim dotaz na“ (…) „> Tak tím zajistím že uživatel se svým loginem a e-mailem dostane svoje vygenerované heslo.“ Ano, to už je lepší. „A neměl by jsi nápad co místo toho použít?“ Vždyť to tam píše, microtime. „Takže login z formuláře nemám ošetřovat“ Escapování se má dělat vždycky pro kontext, ve kterém se proměnná používá. Když se používá v MySQL databázi, tak mysql_real_escape_string. |
||
Keeehi Profil |
#5 · Zasláno: 19. 8. 2013, 23:05:23
<?php //Vložíme soubor s připojením k databázi. require_once 'connect.php'; if(isset($_POST['submit'])){ if(!empty($_POST['login'])){ if(!empty($_POST['email'])){ $query0 = mysql_query("SELECT email FROM uzivatele WHERE login='".mysql_real_escape_string($login)."'"); if (mysql_num_rows($query0) == 1) { $email = mysql_result($query0, 0); if ($email == $_POST['email']) { $chars = array_merge(range('A', 'Z'), range('a', 'z'), range('0', '9')); $new_password = ""; for( $i = 0 ; $i < 6 ; ++$i) { $new_password .= $chars[mt_rand(0, count($chars)-1]; } $new_password_enc = md5($new_password); $query1 = mysql_query("UPDATE uzivatele SET heslo='".$new_password_enc."' WHERE login='".mysql_real_escape_string($login)."'"); if(!$query1) { echo mysql_error() . " - " . mysql_errno(); } else { // Pošleme uživateli e-mail s novým heslem $to = $email; $subject = "Obnovení hesla"; $message = "<div style=\"font-size:11pt; font-family:Times New Roman; color:black; padding:5px;\"><div>Dobrý den,</div>"; $message .= "<div style=\"margin:10px 0;\">Váše nové heslo je: ".$new_password."</div>"; $message .= "<div>S pozdravem, </div>"; $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n"; $headers .= 'From: <admin@localhost.cz>' . "\r\n"; $mail = mail($to, $subject, $message, $headers); if($mail) { echo "E-mail s novým heslem byl odeslán. <a href=\"index.php\">Hlavní stránka</a>"; vyr_dump($to); echo $to; // pro zjištění co by se mělo odeslat echo $subject; // pro zjištění co by se mělo odeslat echo $message; // pro zjištění co by se mělo odeslat echo $headers; // pro zjištění co by se mělo odeslat } else { echo "E-mail nebyl odeslán. Zkuste to znovu. <a href=\"index.php\">Hlavní stránka</a>"; } } } else { echo "Neshoduje se login a email"; } } else { echo "Neexistující login"; } } else{ echo 'Vyplňte e-mail'; } } else{ echo 'Vyplňte login'; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Nové heslo</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head> <body> <h2>Obnovit heslo</h2> <form action="#" method="POST"> <div><label for="login">Váš login:</label></div> <div><input type="text" name="login"></div> <div><label for="email">Váš e-mail:</label></div> <div><input type="text" name="email"></div> <div><input type="submit" name="submit" value="Odeslat"></div> </form> </body> </html> Poznámky: Tu regulární šílenost na ověření emailu nepotřebuješ. V databázi už by jsi měl mít správný email od registrace. Ani při registraci ji nepotřebuješ, pokud jim adresu ověřuješ zasláním emailu. Pokud budu chtít toje uživatele prudit a budu mít seznam nicků a emailů, všem jim můžu změnit hesla. Sice je nebudu znát, ale oni budou muset nejprve do emailu a pak se teprve přihlásit, což bude dost otrava. Nebo pokud budu chtít otravovat někoho konkrétního, tak mu budu heslo měnit třeba každou vteřinu. Pak ten chudák nemá šanci se přihlásit. -> Emailem by jsi měl posílat odkaz na nějakou unikátní url. A heslo ze změní až po kliknutí na tento odkaz. Pak lidem sice bude chodit množství otravných emailů (které se však dají snadno filtrovat) ale heslo jim zůstane pořád stejné, tudíž se budou moci stále přihlásit. |
||
novacek90 Profil |
Joker:
„Musím říct, že zaslání hesla mnou zvoleného uživatele na mnou zvolený e-mail je velmi zvláštní funkčnost :-)“ Tak tohle jsem nepochopil. Změním date() na microtime() Keeehi: „Emailem by jsi měl posílat odkaz na nějakou unikátní url. A heslo ze změní až po kliknutí na tento odkaz.“ To bude určitě nejvhodnější. Jinak stále nechápu v čem mi mělo pomoci to var_dump(); , protože vše proběhne, ale na mail mi nic nepřijde.
Sám můžeš vyzkoušet na : Registrace http://testy-all.ic.cz/registrace.php Obnovení hesla http://testy-all.ic.cz/zapomenute-heslo.php nyní je tam tento kód <?php //Vložíme soubor s připojením k databázi. require_once 'connect.php'; if(isset($_POST['submit'])){ if(!empty($_POST['login'])){ if(!empty($_POST['email'])){ $query0 = mysql_query("SELECT email FROM uzivatele WHERE login='".mysql_real_escape_string($login)."'"); if (mysql_num_rows($query0) == 1) { $email = mysql_result($query0, 0); if ($email == $_POST['email']) { $chars = array_merge(range('A', 'Z'), range('a', 'z'), range('0', '9')); $new_password = ""; for( $i = 0 ; $i < 6 ; ++$i) { $new_password .= $chars['mt_rand(0, count($chars)-1']; } $new_password_enc = md5($new_password); $query1 = mysql_query("UPDATE uzivatele SET heslo='".$new_password_enc."' WHERE login='".mysql_real_escape_string($login)."'"); if(!$query1) { echo mysql_error() . " - " . mysql_errno(); } else { // Pošleme uživateli e-mail s novým heslem $to = $email; $subject = "Obnovení hesla"; $message = "<div style=\"font-size:11pt; font-family:Times New Roman; color:black; padding:5px;\"><div>Dobrý den,</div>"; $message .= "<div style=\"margin:10px 0;\">Váše nové heslo je: ".$new_password."</div>"; $message .= "<div>S pozdravem, </div>"; $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n"; $headers .= 'From: <admin@localhost.cz>' . "\r\n"; $mail = mail($to, $subject, $message, $headers); if($mail) { echo "E-mail s novým heslem byl odeslán. <a href=\"index.php\">Hlavní stránka</a>"; var_dump($to); echo $to; // pro zjištění co by se mělo odeslat echo $subject; // pro zjištění co by se mělo odeslat echo $message; // pro zjištění co by se mělo odeslat echo $headers; // pro zjištění co by se mělo odeslat } else { echo "E-mail nebyl odeslán. Zkuste to znovu. <a href=\"index.php\">Hlavní stránka</a>"; } } } else { echo "Neshoduje se login a email"; } } else { echo "Neexistující login"; } } else{ echo 'Vyplňte e-mail'; } } else{ echo 'Vyplňte login'; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Nové heslo</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head> <body> <h2>Obnovit heslo</h2> <form action="#" method="POST"> <div><label for="login">Váš login:</label></div> <div><input type="text" name="login"></div> <div><label for="email">Váš e-mail:</label></div> <div><input type="text" name="email"></div> <div><input type="submit" name="submit" value="Odeslat"></div> </form> </body> </html> |
||
Micruss Profil |
#7 · Zasláno: 19. 8. 2013, 23:48:42
Myslel to tak, že si vybere úplně neznámého uživatele a napíše tma svůj e-mail, tam mu přijde jeho heslo.. a může se v klidu přihlásit ;-)
jinak zkoušel si normálně jednoduše odeslat e-mail jestli se odešle bo ne ? prostě jednoduše mail("email@mail.cz", "ahoj", "test emailu"); a to var_dump(); ti mělo ukázat jak vypadá e-mail kam se o odesílá |
||
novacek90 Profil |
Micruss:
„Myslel to tak, že si vybere úplně neznámého uživatele a napíše tma svůj e-mail, tam mu přijde jeho heslo.. a může se v klidu přihlásit ;-)“ To jsem pochopil jinak. Já chci aby tam napsal e-mail svůj a to zajistím $query1 = mysql_query("UPDATE uzivatele SET heslo='".$new_password_enc."' WHERE login='".$login."' AND email='".$email."'"); nebo postupem Keeehi
„jinak zkoušel si normálně jednoduše odeslat e-mail jestli se odešle bo ne ? prostě jednoduše mail("email@mail.cz", "ahoj", "test emailu");“ Psal jsem to již na začátku že to funguje „a to var_dump(); ti mělo ukázat jak vypadá e-mail kam se o odesílá“ To mi vypsalo i $to kam se to odesílá a odesílá se to na správný e-mail
|
||
aDAm Profil |
Reaguji na Keeehi:
Proč by tam měl mít bezpečnostní díru a ještě velkou jako prase? Má to form na obnovu zapomenutého hesla, takže zřejmě to nové heslo pošle mailem takže jakákoliv šifrace hesla apod by postrádala smysl a pokud to novacek90 dotáhne rozumně do konce tak nevidím nějaký zásadní problém. Pokud někdo žádá o heslo tak očékává že mu něco dojde mailem a po tom co to heslo získá tak si jej po přihlášení změní. Reaguji na Micruss: jinak zkoušel si normálně jednoduše odeslat e-mail jestli se odešle bo ne ? prostě jednoduše mail("email@mail.cz", "ahoj", "test emailu"); stačí si přečíst první post a zjištíš že testovací část pro odeslání mu funguje Reaguji na novacek90: Pokud ti test pro poslání dummy mailu funguje, tak si ověř co vše dáváš do té funkce mail. Pokud je vše ok, tak je možné že ti to zamítne mailserver a nebo samotný server ti to nechce odeslat. Dej si do místa kde to odesíláš naostro ten tvůj testovací kod pro posílání zkoušky a postupně doplňuj ty proměnné co tam chceš použít a uvidíš kde ti to přestane fungovat. |
||
Joker Profil |
#10 · Zasláno: 20. 8. 2013, 10:53:20
aDAm:
„Proč by tam měl mít bezpečnostní díru a ještě velkou jako prase? Má to form na obnovu zapomenutého hesla, takže zřejmě to nové heslo pošle mailem takže jakákoliv šifrace hesla apod by postrádala smysl a pokud to novacek90 dotáhne rozumně do konce tak nevidím nějaký zásadní problém.“ Ta bezpečnostní díra (v době, kdy o ní Keeehi psal a na kterou jsem narážel i já v [#4]) spočívala v tom, že bylo možné nechat odeslat heslo libovolného uživatele na libovolný mail (tj. zadám něčí login a svůj mail a přijde mi heslo toho uživatele). Současná verze skriptu už tím problémem netrpí. novacek90: Zkuste, jestli to projde bez hlaviček (vynechat z volání mail to $headers). Případně ještě viz poznámka v manuálu: „If messages are not received, try using a LF (\n) only. Some Unix mail transfer agents (…) replace LF by CRLF automatically (which leads to doubling CR if CRLF is used). This should be a last resort, as it does not comply with » RFC 2822.“ Překlad: „Pokud zprávy nechodí, zkuste použít (pozn.: k oddělování řádků) jen LF. Některé Unixové e-mailové programy (…) automaticky nahrazují LF na CRLF (což při použití CRLF pak zdvojí CR). Toto by se mělo zkoušet až jako poslední možnost, protože to nevyhovuje RFC 2822.“ |
||
aDAm Profil |
#11 · Zasláno: 20. 8. 2013, 10:57:12
Joker:
V tomto případě máte pravdu. Ono pokud by to heslo chtěl posílat mailem tak by to měl udělat aspoň dvoustupňově. V prvním kroku poslat link kde po kliku se provede generování hesla co se pak pošle uživateli na mail aby předešel tomu že kdokoliv kdo bude znát username apod bude nechávat generovat hesla pro cizí účty. |
||
novacek90 Profil |
#12 · Zasláno: 20. 8. 2013, 12:14:40
Vyřešeno asi ten mail nebral ten style toho divu.
$to = $email; $subject = "Obnovení hesla"; $message = "<div>Dobrý den,</div>"; $message .= "<div>Váše nové heslo je: ".$new_password."</div>"; $message .= "<div>S pozdravem, </div>"; $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n"; $headers .= 'From: <admin@localhost.cz>' . "\r\n"; $mail = mail($to, $subject, $message, $headers); if($mail) { echo "E-mail s novým heslem byl odeslán. <a href=\"index.php\">Hlavní stránka</a>"; } else { echo "E-mail nebyl odeslán. Zkuste to znovu. <a href=\"index.php\zapomenute-heslo.php">Hlavní stránka</a>"; } Takhle mi to funguje |
||
Joker Profil |
#13 · Zasláno: 20. 8. 2013, 12:18:59
novacek90:
Jedna připomínka, obsah mailu je vlastně prakticky jen věta „Váše nové heslo je: …“. Má nějaký smysl to posílat jako HTML? |
||
novacek90 Profil |
#14 · Zasláno: 20. 8. 2013, 12:51:19
Asi to třeba není, ale přeci jen nevím k čemu to v budoucnu budu moci použít.
Takže to vždy budu moci rozšířit. |
||
novacek90 Profil |
#15 · Zasláno: 20. 8. 2013, 22:55:09
Tak jsem nakonec vytvořil script podle
http://php.vrana.cz/poslani-zapomenuteho-hesla.php kde odesílám unikátní url na mail uživatele.
Zhruba takhle: zapomenute-heslo.php <?php // stránka pro vygenerování e-mailu s unikátní URL //Vložíme soubor s připojením k databázi. require_once 'connect.php'; if(isset($_POST['submit'])){ $token = md5(uniqid(rand(), true)); $login = mysql_real_escape_string($_POST['login']); $email = mysql_real_escape_string($_POST['email']); if(!empty($login)){ if(!empty($email)){ if(preg_match("/^[\w-\.]+@([\w-]+\\.)+[a-zA-Z]{2,4}$/", $email)){ $query1 = mysql_query("UPDATE uzivatele SET heslo_token = '".md5($token)."',heslo_token_platnost = NOW() + INTERVAL 1 DAY WHERE login = '".$login."' AND email = '".$email."'"); if(!$query1) { echo mysql_error() . " - " . mysql_errno(); } else { // Pošleme uživateli e-mail s novým heslem $to = $email; $subject = "Obnovení hesla"; $message = "<div>Dobrý den,</div>"; $message .= "<div>Nové heslo si zadejte na této adrese "."/obnoveni-hesla.php?login=]http://$_SERVER[SERVER_NAME]/obnoveni-hesla.php?login=" . urlencode($_POST["login"]) . "&token=".$token.""."</div>"; $message .= "<div>S pozdravem, </div>"; $headers = 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n"; $headers .= 'From: <admin@localhost.cz>' . "\r\n"; $mail = mail($to, $subject, $message, $headers); if($mail) { echo "E-mail s novým heslem byl odeslán. <a href=\"index.php\">Hlavní stránka</a>"; } else { echo "E-mail nebyl odeslán. Zkuste to znovu. <a href=\"index.php\zapomenute-heslo.php\">Hlavní stránka</a>"; } } } else{ echo 'Zadaný e-mail má špatný formát'; } } else{ echo 'Vyplňte e-mail'; } } else{ echo 'Vyplňte login'; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Nové heslo</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head> <body> <h2>Obnovit heslo</h2> <form action="#" method="POST"> <div><label for="login">Váš login:</label></div> <div><input type="text" name="login"></div> <div><label for="email">Váš e-mail:</label></div> <div><input type="text" name="email"></div> <div><input type="submit" name="submit" value="Odeslat"></div> </form> </body> </html> a obnoveni-hesla.php <?php // stránka pro vložení nového hesla, nebo zrušení žádosti //Vložíme soubor s připojením k databázi. require_once 'connect.php'; if(isset($_POST['obnovit'])){ if(!empty($_POST['token']) and !empty($_POST['login'])){ if(!empty($_POST['heslo']) and !empty($_POST['overeni_heslo'])){ if($_POST['heslo'] == $_POST['overeni_heslo']){ $query0 = mysql_query(" UPDATE uzivatele SET heslo = md5('" . mysql_real_escape_string($_POST["heslo"]) . "'), heslo_token = '' WHERE login = '" . mysql_real_escape_string($_POST["login"]) . "' AND heslo_token = '" . md5($_POST["token"]) . "' AND heslo_token_platnost >= NOW()"); if(!$query0) { echo 'Obnovení hesla se nezdařilo. Zkuste znovu za chvíli'; } else { echo 'Obnovení hesla proběhlo vpořádku'; } } else{ echo 'Hesla se neshodují'; } } else{ echo 'Vyplňte pole s hesly'; } } else { echo 'Nyní nemůžete použít funkci pro obnovení hesla'; } } if(isset($_POST['zrusit'])){ if(!empty($_POST['token']) and !empty($_POST['login'])){ $query1 = mysql_query("UPDATE uzivatele SET heslo_token = '' WHERE login = '".mysql_real_escape_string($_POST["login"])."' AND heslo_token = '" . md5($_POST["token"]) . "'"); if(!$query1) { echo 'Nepodařilo se zrušit žádost o obnovu hesla. Zkuste znovu za chvíli'; } else { echo 'Byla zrušena žádost o obnovu hesla'; } } else{ echo 'Nyní nelze zrušit žádost o obnovu hesla'; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Obnovení hesla</title> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> </head> <body> <h2>Obnovit heslo</h2> <form action="#" method="POST"> <div><label for="heslo">Nové heslo:</label></div> <div><input type="password" name="heslo"></div> <div><label for="heslo">Ověření nového hesla:</label></div> <div><input type="password" name="overeni_heslo"></div> <input value="<?php echo htmlspecialchars($_GET['login']); ?>" type="hidden" name="login"> <input value="<?php echo htmlspecialchars($_GET['token']); ?>" type="hidden" name="token"> <div><input type="submit" name="obnovit" value="Odeslat"></div> </form> <h2>Zrušit žádost o obnovu hesla</h2> <form action="#" method="POST"> <input value="<?php echo htmlspecialchars($_GET['login']); ?>" type="hidden" name="login"> <input value="<?php echo htmlspecialchars($_GET['token']); ?>" type="hidden" name="token"> <div><input type="submit" name="zrusit" value="Zrušit žádost o nové heslo"></div> </form> </body> </html> To už se i mě zdá o dost lepší. Ještě se zeptám. Není tam někde bezpečnostní díra nebo špatně použité escapování?? Díky |
||
Joker Profil |
#16 · Zasláno: 20. 8. 2013, 23:16:38
novacek90:
Znovu se tam vrátil ten problém, o kterém jsme psali na začátku: Nekontroluje se, jestli zadaný mail odpovídá zadanému loginu. Takže když zadám cizí jméno a svůj e-mail, přijde mi na mail odkaz pro nastavení hesla toho uživatele. |
||
novacek90 Profil |
A já měl za to, že to mi zabezpečí
$query1 = mysql_query("UPDATE uzivatele SET heslo_token = '".md5($token)."',heslo_token_platnost = NOW() + INTERVAL 1 DAY WHERE login = '".$login."' AND email = '".$email."'"); Takže když to udělám takhle tak ta chyba zmizí pokud se nemýlím $con_mail = mysql_query("SELECT email FROM uzivatele WHERE login='".mysql_real_escape_string($login)."'"); $row = mysql_fetch_array($con_mail); if ($email == $row['email']){ ... } else { echo 'Login se neshoduje s e-mailem.'; } |
||
Micruss Profil |
#18 · Zasláno: 21. 8. 2013, 00:08:59
zkus udělat takhle:
$query1 = mysql_query("SELECT * FROM uzivatele WHERE login = '$login' and email = '$email'"); if(mysql_num_rows($query1)==0) { echo"Chyba při obnovení hesla"; } else { // prošel kontrolu jedeme dál } |
||
Časová prodleva: 11 let
|
0