Autor Zpráva
Argonisius
Profil
Tak jsem sesmolil script na odeslání ztraceného hesla. Potřeboval bych ho zhodnotit (případně poradit změnu).

Script na odeslání potvrzovacího odkazu e-mailem:
<?php

     $chyba = 0;
   
     // Kontrola přijetí dat
     if($_POST)
       {
	      $email = $_POST['email'];	
	  
	      // Ověření, že bylo pole vyplněno
        if(trim($email) == '') 
          {
            echo '<span class="chybova_hlaska">Musíte vyplnit Vaši e-mailovou adresu!</span>';  
            $chyba = 1;     
          }
            else
          {  
            // Ověření správnosti e-mailu
            if(!EregI("^[a-z0-9]+[a-z0-9\._-]*[a-z0-9]+@[a-z0-9]+[a-z0-9\._-]*[a-z0-9]+\.[a-z]{2,6}$", $email) || EregI("\.{2,}", $email) || EregI("_{2,}", $email) || EregI("-{2,}", $email)) 
		          {
                echo '<span class="chybova_hlaska">Nesprávný formát e-mailu!</span>';	  
                $chyba = 1;     
              }
           
            // Pokud je vše správně vyplněno, zkontroluj, jestli je e-mail registrován
            if($chyba == 0)
              {
                // Ověření, zda zadané informace souhlasí s těmi v databázi
               $query = sprintf("SELECT * FROM users WHERE email = '%s'",
    	    	     mysqli_real_escape_string($dbconnect,$email));
    	         $result = mysqli_query($dbconnect,$query)
	                         or die ('Nemohu ověřit správnost e-mailu.');
	             $data = mysqli_fetch_array($result);
	       
               if(!$data)
	               {
	                 echo '<span class="chybova_hlaska">V databázi není žádný hráč s tímto e-mailem!</span>';
	                 $chyba = 1;  
	               }
	             else 
	               {                 
                   // Odeslání potvrzovacího e-mailu uživateli 
                   $new_password_validkey = md5(uniqid());
	        	       $query = sprintf("UPDATE users SET new_password_validkey = '%s' WHERE email = '%s'",
                     mysqli_real_escape_string($dbconnect,$new_password_validkey),
                     mysqli_real_escape_string($dbconnect,$email));
	        	       mysqli_query($dbconnect,$query)
	    	             or die ('Nemohu vložit potvrzovací kód do databáze.');
	    	             
	    	           $email_encoded = rawurlencode($email);
	    	           $zprava = "Dobrý den,\n\nz bezpečnostních důvodů ukládáme hesla v zašifrovaném formátu, takže Vám jej nemůžeme zaslat.\n\nMůžete si však nechat vygenerovat heslo nové. Pokud tak chcete učinit, klikněte na tento odkaz:\n$path/nove_heslo.php?email=$email_encoded&new_password_validkey=$new_password_validkey\nV opačném případě nebude heslo změněno.\n\nS pozdravem,\nAdministrátor online hry\n$path";
	    	           $zprava= Base64_Encode($zprava);
	    	           $hlavicka = "MIME-Version: 1.0\n";
                   $hlavicka .= "Content-Type: text/plain; charset=\"windows-1250\"\n";
                   $hlavicka .= "Content-Transfer-Encoding: base64";
	    	           mail ("$email","$game - Zaslání nového hesla","$zprava","$hlavicka")
		                 or die ('Nemohu odeslat aktivační e-mail.');
		                 
                   echo '<span class="oznameni">Na Váš e-mail byly zaslány pokyny pro získání hesla.</span>';
	               }
	             }
          }
      }

   ?>


Script, který přijme data z url a změní heslo:
<?php

     // Kontrola přijetí dat
     if($_GET) 
       {
         $new_password_validkey = $_GET['new_password_validkey'];
         $email = $_GET['email'];
         
         // ověření, zda aktivační klíč a e-mail souhlasí
         $query = sprintf("SELECT * FROM users WHERE new_password_validkey = '%s' AND email = '%s'",
           mysqli_real_escape_string($dbconnect,$new_password_validkey),
		       mysqli_real_escape_string($dbconnect,$email));
	       $result = mysqli_query($dbconnect,$query)
	                   or die ('Nemohu ověřit, zda je tento potvrzovací klíč v databázi.');
	       $data = mysqli_fetch_array($result);

	       if(!$data)
	         {
	           echo '<span class="chybova_hlaska">Neplatná kombinace e-mailu a potvrzovacího klíče!</span>';
	         }
	       else
	         {        
	           // Vygenerování nového hesla
	           $nove_heslo = '';
             $znaky = 'abcdefghijklmnopqrstuvwxyz123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
             $pocet_znaku = strlen($znaky);
               
             for ($i=0; $i<8; ++$i)
               $nove_heslo .= $znaky[mt_rand(0,$pocet_znaku)]; 
             
             $nove_heslo_hash = sha1($nove_heslo);
              
             // Změna hesla   
	           $query = sprintf("UPDATE users SET password = '%s' WHERE new_password_validkey = '%s'",
	             mysqli_real_escape_string($dbconnect,$nove_heslo_hash),
		           mysqli_real_escape_string($dbconnect,$new_password_validkey));
	           $result = mysqli_query($dbconnect,$query)
	                       or die ('Nemohu změnit Vaše heslo.'); 
	           
	           // Odstranění potvrzovacího klíče z databáze
	           $query = sprintf("UPDATE users SET new_password_validkey = '' WHERE password = '%s'",
	             mysqli_real_escape_string($dbconnect,$nove_heslo_hash));
	           $result = mysqli_query($dbconnect,$query)
	                       or die ('Nemohu vymazat potvrzovací klíč.'); 
	            
             // Odeslání hesla           
		         $zprava = "Dobrý den,\n\nvaše nové heslo je: $nove_heslo\n\nMůžete si ho kdykoliv změnit v administraci svého účtu.\n\nS pozdravem,\nAdministrátor online hry\n$path";
		         $zprava= Base64_Encode($zprava);
		         $hlavicka = "MIME-Version: 1.0\n";
             $hlavicka .= "Content-Type: text/plain; charset=\"windows-1250\"\n";
             $hlavicka .= "Content-Transfer-Encoding: base64";
		         mail ("$email","$game - Nové heslo","$zprava","$hlavicka")
		           or die ('Nemohu odeslat nové heslo.');
		           
	           echo '<span class="oznameni">Na Váš e-mail bylo zasláno nové heslo.</span>';           
	         }
       }
       
   ?>

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: