Autor Zpráva
novacek90
Profil
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
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
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."'");
Tak tím zajistím že uživatel se svým loginem a e-mailem dostane svoje vygenerované heslo.

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
<?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
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
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
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
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
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
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
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
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
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
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0