Waarom werkt deze paswoord reset functie niet?

Status
Niet open voor verdere reacties.

jarco

Gebruiker
Lid geworden
31 jan 2007
Berichten
309
Hoi iedereen.
Ik ben aan een website bezig voor asieldieren. Deze heeft ook een login menu.
Omdat ik zeer weinig PHP ken heb ik voorbeelden van het net genomen en ben ik deze aan het aanpassen.
Voorlopig gaat alles perfect. Gebruikers kunnen een account aanmaken en hiermee inloggen. Enkel gaat het mis bij het aanvragen van een nieuw paswoord.

Dit is de code van login.php

Code:
				<?
        session_start();
        // dBase file
        include ("dbconnect.php");

        if ($_GET["op"] == "login")
  {
  if (!$_POST["username"] || !$_POST["password"])
        {
        die("You need to provide a username and password.");
        }
  
  // Create query
  $q = "SELECT * FROM `users` "
        ."WHERE `username`='".$_POST["username"]."' "
        ."AND `password`=PASSWORD('".$_POST["password"]."') "
        ."LIMIT 1";
  // Run query
  $r = mysql_query($q);

  if ( $obj = @mysql_fetch_object($r) )
        {
        // Login good, create session variables
        $_SESSION["valid_id"] = $obj->id;
        $_SESSION["valid_user"] = $_POST["username"];
        $_SESSION["valid_time"] = time();

        // Redirect to member page
        Header("Location: members.php");
        }
  else
        {
        // Login not successful
        die("Sorry, could not log you in. Wrong login information.");
        }
  }
        else
  {
//If all went right the Web form appears and users can log in
  echo "<form action=\"?op=login\" method=\"POST\">";
  echo "Username: <input name=\"username\" size=\"15\"><br />";
  echo "Password: <input type=\"password\" name=\"password\" size=\"8\"><br />";
  echo "<input type=\"submit\" value=\"Login\">";
  echo "</form>";
  }
        ?>

en dit de code van de resetpaswoord.php

Code:
<? //this function will display error messages in alert boxes, used for login forms so if a field is invalid it will still keep the info
//use error('foobar');
function error($msg) {
?>
    <script language="JavaScript">
    <!--
        alert("<?=$msg?>");
        history.back();
    //-->
    </script><?
   exit;
}?>
</head>
<body>
	<div id="bg">
		<div id="sadrzaj">
			<div id="toplinks">
				<a href="#">Home</a>
				<a href="#">Honden</a>
				<a href="#">Katten</a>
				<a href="#">Zoeken</a>
				<a href="#">Asielen</a>
				<a href="login.php">Inloggen</a>
			</div>

			<div id="zaglavlje">
				<div id="title">
					<a href="http://buitenpoot.be/buitenpoot/">Buitenpoot</a>
				</div>
				<div id="title_info">
					
					<p><b><a href="#">Zoek een Dier</a></b>
					
					</p>
				</div>
			</div>

			<div id="navigacija">
				<ul>
					<li><a href="#">Home</a></li>
					<li><a href="#">Honden</a></li>
					<li><a href="#">Katten</a></li>
					<li><a href="#">Zoeken</a></li>
					<li><a href="#">Asielen</a></li>
					<li><a href="login.php">Inloggen</a></li>
					<li><a href="#">Succesverhalen</a></li>
				</ul>
	
				<div class="lijevo">
					<p><b>Administratie menu</b></p>
					<p>Hier komt het administratie menu als je ingelogged bent als admin of als beheerder of bijdrager aan een asiel of vereniging.</p>
				</div>
			</div>

			<div id="clanci">		
				<?
define('IN_SCRIPT', true);
// Start a session
session_start();

//Connect to the MySQL Database
include 'dbconnect.php';

//This functions checks and makes sure the email address that is being added to database is valid in format. 
function check_email_address($email) {
  // First, we check that there's one @ symbol, and that the lengths are right
  if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
    // Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
    return false;
  }
  // Split it into sections to make life easier
  $email_array = explode("@", $email);
  $local_array = explode(".", $email_array[0]);
  for ($i = 0; $i < sizeof($local_array); $i++) {
     if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i])) {
      return false;
    }
  }  
  if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
    $domain_array = explode(".", $email_array[1]);
    if (sizeof($domain_array) < 2) {
        return false; // Not enough parts to domain
    }
    for ($i = 0; $i < sizeof($domain_array); $i++) {
      if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) {
        return false;
      }
    }
  }
  return true;
}


if (isset($_POST['submit'])) {
	
	if ($_POST['forgotpassword']=='') {
		error('Please Fill in Email.');
	}
	if(get_magic_quotes_gpc()) {
		$forgotpassword = htmlspecialchars(stripslashes($_POST['forgotpassword']));
	} 
	else {
		$forgotpassword = htmlspecialchars($_POST['forgotpassword']);
	}
	//Make sure it's a valid email address, last thing we want is some sort of exploit!
	if (!check_email_address($_POST['forgotpassword'])) {
  		error('Email Not Valid - Must be in format of name@domain.tld');
	}
    // Lets see if the email exists
    $sql = "SELECT COUNT(*) FROM users WHERE email = '$forgotpassword'";
    $result = mysql_query($sql)or die('Could not find member: ' . mysql_error());
    if (!mysql_result($result,0,0)>0) {
        error('Dit email adres werd niet gevonden!');
    }

	//Generate a RANDOM MD5 Hash for a password
	$random_password=md5(uniqid(rand()));
	
	//Take the first 8 digits and use them as the password we intend to email the user
	$emailpassword=/*substr(*/$random_password/*, 0, 8)*/;
	$newpassword= $emailpassword;
	//Encrypt $emailpassword in MD5 format for the database
//	$newpassword = md5($emailpassword);
	
        // Make a safe query
       	$query = sprintf("UPDATE `users` SET `password` = '%s' 
						  WHERE `email` = '$forgotpassword'",
                    mysql_real_escape_string($newpassword));
					
					mysql_query($query)or die('Could not update users: ' . mysql_error());

//Email out the infromation
$subject = "Uw nieuw paswoord op buitenpoot"; 
$message = "Uw nieuw paswoord is het volgende:
---------------------------- 
Paswoord: $emailpassword
---------------------------- 
Deze informatie is opgeslagen in onze database

Deze email werd automatisch aangemaakt. Indien u geen nieuw paswoord heeft aangevraagd gelieve dan een mail te sturen naar support@buitenpoot.be."; 
$site_name = "Buitenpoot";
$site_email = "support@buitenpoot.be";                       
          if(!mail($forgotpassword, $subject, $message,  "FROM: $site_name <$site_email>")){ 
             die ("Sending Email Failed, Please Contact Site Admin! ($site_email)"); 
          }else{ 
                error('New Password Sent!.');
         } 
		
	}
	
else {
?>
      <form name="forgotpasswordform" action="" method="post">
        <table border="0" cellspacing="0" cellpadding="3" width="100%">
          <caption>
          <h2>Uw paswoord opnieuw aanvragen</h2>
          </caption>
          <tr>
            <td>Email Adres:</td>
            <td><input name="forgotpassword" type="text" value="" id="forgotpassword" /></td>
          </tr>
          <tr>
            <td colspan="2" class="footer"><input type="submit" name="submit" value="Aanvragen" class="mainoption" /></td>
          </tr>
        </table>
      </form>
      <?
}
?>

Ik heb het vermoeden dat het iets te maken heeft met de encryptie van het paswoord maar eigenlijk is dat maar een gokje :p.

Hij stuurt de mail en doet een aanpassing in de database. Alleen aanvaard hij om in te loggen het nieuwe paswoord niet.

Misschien hebben jullie tips?
 
Laatst bewerkt:
Je hash wordt alleen toegepast op het wachtwoord in de email, maar het wachtwoord dat in de database wordt opgeslagen is helemaal niet gehasht, dus die twee komen totaal niet overeen.
 
ik heb de code nu aangepast naar deze:

Code:
<!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>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="Author" content="Author" />
<meta name="Robots" content="index,follow" />
<meta name="Description" content="Description" />
<meta name="Keywords" content="key, words" />
<link rel="stylesheet" type="text/css" href="images/style.css" />
<title>Buitenpoot</title>
<? //this function will display error messages in alert boxes, used for login forms so if a field is invalid it will still keep the info
//use error('foobar');
function error($msg) {
?>
    <script language="JavaScript">
    <!--
        alert("<?=$msg?>");
        history.back();
    //-->
    </script><?
   exit;
}?>
</head>
<body>
	<div id="bg">
		<div id="sadrzaj">
			<div id="toplinks">
				<a href="#">Home</a>
				<a href="#">Honden</a>
				<a href="#">Katten</a>
				<a href="#">Zoeken</a>
				<a href="#">Asielen</a>
				<a href="login.php">Inloggen</a>
			</div>

			<div id="zaglavlje">
				<div id="title">
					<a href="http://buitenpoot.be/buitenpoot/">Buitenpoot</a>
				</div>
				<div id="title_info">
					
					<p><b><a href="#">Zoek een Dier</a></b>
					
					</p>
				</div>
			</div>

			<div id="navigacija">
				<ul>
					<li><a href="#">Home</a></li>
					<li><a href="#">Honden</a></li>
					<li><a href="#">Katten</a></li>
					<li><a href="#">Zoeken</a></li>
					<li><a href="#">Asielen</a></li>
					<li><a href="login.php">Inloggen</a></li>
					<li><a href="#">Succesverhalen</a></li>
				</ul>
	
				<div class="lijevo">
					<p><b>Administratie menu</b></p>
					<p>Hier komt het administratie menu als je ingelogged bent als admin of als beheerder of bijdrager aan een asiel of vereniging.</p>
				</div>
			</div>

			<div id="clanci">		
				<?
define('IN_SCRIPT', true);
// Start a session
session_start();

//Connect to the MySQL Database
include 'dbconnect.php';

//This functions checks and makes sure the email address that is being added to database is valid in format. 
function check_email_address($email) {
  // First, we check that there's one @ symbol, and that the lengths are right
  if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
    // Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
    return false;
  }
  // Split it into sections to make life easier
  $email_array = explode("@", $email);
  $local_array = explode(".", $email_array[0]);
  for ($i = 0; $i < sizeof($local_array); $i++) {
     if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i])) {
      return false;
    }
  }  
  if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
    $domain_array = explode(".", $email_array[1]);
    if (sizeof($domain_array) < 2) {
        return false; // Not enough parts to domain
    }
    for ($i = 0; $i < sizeof($domain_array); $i++) {
      if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) {
        return false;
      }
    }
  }
  return true;
}


if (isset($_POST['submit'])) {
	
	if ($_POST['forgotpassword']=='') {
		error('Please Fill in Email.');
	}
	if(get_magic_quotes_gpc()) {
		$forgotpassword = htmlspecialchars(stripslashes($_POST['forgotpassword']));
	} 
	else {
		$forgotpassword = htmlspecialchars($_POST['forgotpassword']);
	}
	//Make sure it's a valid email address, last thing we want is some sort of exploit!
	if (!check_email_address($_POST['forgotpassword'])) {
  		error('Email Not Valid - Must be in format of name@domain.tld');
	}
    // Lets see if the email exists
    $sql = "SELECT COUNT(*) FROM users WHERE email = '$forgotpassword'";
    $result = mysql_query($sql)or die('Could not find member: ' . mysql_error());
    if (!mysql_result($result,0,0)>0) {
        error('Dit email adres werd niet gevonden!');
    }

	//Generate a RANDOM MD5 Hash for a password
	$random_password=md5(uniqid(rand()));
	
	//Take the first 8 digits and use them as the password we intend to email the user
	$emailpassword=substr($random_password, 0, 8);
	$newpassword= $emailpassword;
	//Encrypt $emailpassword in MD5 format for the database
	$newpassword = md5($emailpassword);
	
        // Make a safe query
       	$query = sprintf("UPDATE `users` SET `password` = '%s' 
						  WHERE `email` = '$forgotpassword'",
                    mysql_real_escape_string($newpassword));
					
					mysql_query($query)or die('Could not update users: ' . mysql_error());

//Email out the infromation
$subject = "Uw nieuw paswoord op buitenpoot"; 
$message = "Uw nieuw paswoord is het volgende:
---------------------------- 
Paswoord: $emailpassword
---------------------------- 
Deze informatie is opgeslagen in onze database

Deze email werd automatisch aangemaakt. Indien u geen nieuw paswoord heeft aangevraagd gelieve dan een mail te sturen naar support@buitenpoot.be."; 
$site_name = "Buitenpoot";
$site_email = "support@buitenpoot.be";                       
          if(!mail($forgotpassword, $subject, $message,  "FROM: $site_name <$site_email>")){ 
             die ("Sending Email Failed, Please Contact Site Admin! ($site_email)"); 
          }else{ 
                error('New Password Sent!.' .$emailpassword .'en' .$newpassword);
         } 
		
	}
	
else {
?>
      <form name="forgotpasswordform" action="" method="post">
        <table border="0" cellspacing="0" cellpadding="3" width="100%">
          <caption>
          <h2>Uw paswoord opnieuw aanvragen</h2>
          </caption>
          <tr>
            <td>Email Adres:</td>
            <td><input name="forgotpassword" type="text" value="" id="forgotpassword" /></td>
          </tr>
          <tr>
            <td colspan="2" class="footer"><input type="submit" name="submit" value="Aanvragen" class="mainoption" /></td>
          </tr>
        </table>
      </form>
      <?
}
?>
<p><a href="register.php">Klik hier indien u nog geen account heeft en er hier een wil aanmaken</a></p>
			</div>
		</div>
	</div>
</body>
</html>

Het probleem blijft zich hierbij nog steeds voordoen.
Waar moet ik dit juist oplossen?
 
Het wachtwoord dat je in de mail plaatst en degene die de database ingaat zijn nog steeds niet hetzelfde, want nadat je het wachtwoord dat je in de email gaat zetten hebt bepaald, ga je het wachtwoord dat de database in moet weer wijzigen.

Heb je enig idee hoe PHP werkt of ben je zomaar wat aan het doen?
 
ik begrijp nog maar weinig van php. Ik ken wel sql.

Hoe ik het begrijp bedoel jij dat ik simpelweg 2 verschillende paswoorden doorgeef. Als ik in de mail hetzelfde paswoord doorgeef als dat wat ik in de database stop werkt het nog steeds niet ($newpassword)
 
In het scriptje dat je hierboven poste als verbetering heb je nog steeds 2 verschillende variabelen voor degene in het mailtje en die in de database ($emailpassword en $newpassword resp.)
 
de fout doet zich ook nog voor als ik beiden $newpassword meegeef.
 
Wat is het field-type van password? $newpassword is als het goed is 32 tekens ofzo, als dat niet in het veld past dan gaat het mis.
 
Hier ligt het volgens mij niet aan.

password varchar(255) utf8_general_ci

Daar past het wel in denk ik.
 
Jep, dat past wel.

Kun je het relevante deel van het script zoals je het nu hebt tonen?
 
Code:
				<?
define('IN_SCRIPT', true);
// Start a session
session_start();

//Connect to the MySQL Database
include 'dbconnect.php';

//This functions checks and makes sure the email address that is being added to database is valid in format. 
function check_email_address($email) {
  // First, we check that there's one @ symbol, and that the lengths are right
  if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) {
    // Email invalid because wrong number of characters in one section, or wrong number of @ symbols.
    return false;
  }
  // Split it into sections to make life easier
  $email_array = explode("@", $email);
  $local_array = explode(".", $email_array[0]);
  for ($i = 0; $i < sizeof($local_array); $i++) {
     if (!ereg("^(([A-Za-z0-9!#$%&'*+/=?^_`{|}~-][A-Za-z0-9!#$%&'*+/=?^_`{|}~\.-]{0,63})|(\"[^(\\|\")]{0,62}\"))$", $local_array[$i])) {
      return false;
    }
  }  
  if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { // Check if domain is IP. If not, it should be valid domain name
    $domain_array = explode(".", $email_array[1]);
    if (sizeof($domain_array) < 2) {
        return false; // Not enough parts to domain
    }
    for ($i = 0; $i < sizeof($domain_array); $i++) {
      if (!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$", $domain_array[$i])) {
        return false;
      }
    }
  }
  return true;
}


if (isset($_POST['submit'])) {
	
	if ($_POST['forgotpassword']=='') {
		error('Please Fill in Email.');
	}
	if(get_magic_quotes_gpc()) {
		$forgotpassword = htmlspecialchars(stripslashes($_POST['forgotpassword']));
	} 
	else {
		$forgotpassword = htmlspecialchars($_POST['forgotpassword']);
	}
	//Make sure it's a valid email address, last thing we want is some sort of exploit!
	if (!check_email_address($_POST['forgotpassword'])) {
  		error('Email Not Valid - Must be in format of name@domain.tld');
	}
    // Lets see if the email exists
    $sql = "SELECT COUNT(*) FROM users WHERE email = '$forgotpassword'";
    $result = mysql_query($sql)or die('Could not find member: ' . mysql_error());
    if (!mysql_result($result,0,0)>0) {
        error('Dit email adres werd niet gevonden!');
    }

	//Generate a RANDOM MD5 Hash for a password
	$random_password=md5(uniqid(rand()));
	
	//Take the first 8 digits and use them as the password we intend to email the user
	$emailpassword=substr($random_password, 0, 8);
	$newpassword= $emailpassword;
	//Encrypt $emailpassword in MD5 format for the database
	$newpassword = md5($emailpassword);
	
        // Make a safe query
       	$query = sprintf("UPDATE `users` SET `password` = '%s' 
						  WHERE `email` = '$forgotpassword'",
                    mysql_real_escape_string($newpassword));
					
					mysql_query($query)or die('Could not update users: ' . mysql_error());

//Email out the infromation
$subject = "Uw nieuw paswoord op buitenpoot"; 
$message = "Uw nieuw paswoord is het volgende:
---------------------------- 
Paswoord: $newpassword
---------------------------- 
Deze informatie is opgeslagen in onze database

Deze email werd automatisch aangemaakt. Indien u geen nieuw paswoord heeft aangevraagd gelieve dan een mail te sturen naar support@buitenpoot.be."; 
$site_name = "Buitenpoot";
$site_email = "support@buitenpoot.be";                       
          if(!mail($forgotpassword, $subject, $message,  "FROM: $site_name <$site_email>")){ 
             die ("Sending Email Failed, Please Contact Site Admin! ($site_email)"); 
          }else{ 
                error('New Password Sent!.');
         } 
		
	}
	
else {
?>
      <form name="forgotpasswordform" action="" method="post">
        <table border="0" cellspacing="0" cellpadding="3" width="100%">
          <caption>
          <h2>Uw paswoord opnieuw aanvragen</h2>
          </caption>
          <tr>
            <td>Email Adres:</td>
            <td><input name="forgotpassword" type="text" value="" id="forgotpassword" /></td>
          </tr>
          <tr>
            <td colspan="2" class="footer"><input type="submit" name="submit" value="Aanvragen" class="mainoption" /></td>
          </tr>
        </table>
      </form>
      <?
}
?>
 
En je krijgt een wachtwoord toegemaild? En als je in de database kijkt staat daar precies hetzelfde wachtwoord?

Dat wachtwoord is waarschijnlijk ongeveer 32 tekens ofzo?
 
Ja. Ik krijg exact hetzelfde paswoord toegemaild als hetgeen dat in de database staat.
 
Dan vermoed ik dat de fout nu in je inlog script zit en niet in deze ;)

Deze doet nu wat ie doen moet namelijk, een nieuw wachtwoord maken en dat mailen naar de user.
 
Hoi,

Mijn inlogscript staat bovenaan.
Dit werkt wel met gewone paswoorden van gebruikers die geregistreerd staan.
Hoewel ze in de database anders opgeslagen worden en ze toch werken.
 
...

Dus het wachtwoord dat de gebruiker ingeeft komt niet overeen met het wachtwoord dat in de database staat en dan werkt het? :p

Ok als ik even over je login.php heenkijk zie ik dat daar gebruikt wordt van de SQL ingebouwde functie PASSWORD, die gebruikt je andere script niet. Het lijkt er dus op dat je bij je UPDATE het nieuwe wachtwoord nog een keer moet encrypten met de SQL PASSWORD() functie.
 
Superbedankt. Dat was het probleem.
Deze functie kende ik zelf niet. Ik ga hem nu opzoeken zodat ik hem ook begrijp. Superbedankt voor de hulp.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan