Php 检查有效令牌以更新密码
我有两个名为“成员”和“密码重置”的表。我有一个表单(requestpassword.php),用户可以通过填写电子邮件来重置密码。当他们填写表单时,一个带有令牌的链接已发送到用户电子邮件。令牌存储在“password_reset”表中,所有usersinfo存储在“members”表中 当用户单击电子邮件中的链接时,他将被重定向到reset-password.php页面,在该页面中他必须输入新密码,并通过再次填写来确认。单击提交按钮后,页面将重定向到update-password.php。这是包含代码的页面,用于将新密码更新到数据库。但是,在页面能够更新数据库之前,它必须检查用户是否输入了等同于confirmpwd的密码。此外,电子邮件和分配的令牌是否有效。如果输入的密码相等且令牌有效,则应更新该特定用户的用户记录 我的问题:如何获取update-password.php文件,以检查电子邮件和分配的令牌是否有效,从而更新带有该电子邮件的用户的用户记录? 电子邮件存储在“成员”表中,令牌存储在“密码重置”中。我不知道如何链接它们。 这是我的reset-password.php文件Php 检查有效令牌以更新密码,php,mysql,database,token,Php,Mysql,Database,Token,我有两个名为“成员”和“密码重置”的表。我有一个表单(requestpassword.php),用户可以通过填写电子邮件来重置密码。当他们填写表单时,一个带有令牌的链接已发送到用户电子邮件。令牌存储在“password_reset”表中,所有usersinfo存储在“members”表中 当用户单击电子邮件中的链接时,他将被重定向到reset-password.php页面,在该页面中他必须输入新密码,并通过再次填写来确认。单击提交按钮后,页面将重定向到update-password.php。这是
if (isset($_GET['token'])) {
$uniqid = htmlentities( $_GET['token'] );
$result = mysqli_query($mysqli,"SELECT * FROM password_reset WHERE token = '".$uniqid."' ");
if ( mysqli_num_rows($result) > 0 ) {
$row = mysqli_fetch_array($result);
//Check Geldigheid token
$geldig = 7200;
if ( time()- intval( $row['tstamp'] ) > $geldig) {
//TOKEN HAS EXPIRED AND SUBMIT BUTTON HAS BEEN DISABLED
echo "
<!DOCTYPE html>
<html>
<head>
<title>Wachtwoord Resetten</title>
<link rel='stylesheet' href='../../css/reset-wachtwoord.css' />
<script type='text/JavaScript' src='../../js/sha512.js'></script>
<script type='text/JavaScript' src='../../js/forms.js'></script>
</head>
<body>
<div id='container'>
<div class='logo'></div>
<div class='ww-vergeten-form'>
<form action='' method=''>
<input type='password' name='password' id='password' placeholder='Nieuw Wachtwoord' size='50' maxlength='0'>
<input type='password' name='confirmpwd' id='password' placeholder='Herhaal Wachtwoord' size='50' maxlength='0'>
<input type='submit' class='reset-btn disabled' name='' value='Reset Wachtwoord' disabled></p>
</form>
<p class='error'>Sessie Verlopen. <a href='index.php'>Vraag een nieuwe aan</a>.</p>
</div>
</div>
</body>
</html>
";
} else {
//TOKEN IS STILL VALID
echo "
<!DOCTYPE html>
<html>
<head>
<title>Wachtwoord Resetten</title>
<link rel='stylesheet' href='../../css/reset-wachtwoord.css' />
<script type='text/JavaScript' src='../../js/sha512.js'></script>
<script type='text/JavaScript' src='../../js/forms.js'></script>
</head>
<body>
<div id='container'>
<div class='logo'></div>
<div class='ww-vergeten-form'>
<form action='password-changed.php' method='post'>
<input type='password' name='password' id='password' placeholder='Nieuw Wachtwoord' size='50' maxlength='255'>
<input type='password' name='confirmpwd' id='password' placeholder='Herhaal Wachtwoord' size='50' maxlength='255'>
<input type='submit' class='reset-btn' name='update' value='Reset Wachtwoord'></p>
</form>
<p class='nieuw-account'>Nog geen account? <a href='../../'>Maak er een aan</a>!</p>
</div>
</div>
</body>
</html>
";
}
}else{
echo "<p class='error'>Token incorrect</p>";
}
}
现在url没有打开网页,因为我需要获取$email,但是由于它与令牌位于不同的表中,我如何获取它
像这样的
if (isset($_GET['token'])) {
$uniqid = htmlentities( $_GET['token'] );
$email = htmlentities( $_GET['email'] );
$result = mysqli_query($mysqli,"SELECT * FROM password_reset WHERE token = '".$uniqid."' ");
$result2 = mysqli_query($mysqli,"SELECT * FROM members WHERE email = '".$email."' ");
if ( mysqli_num_rows($result) > 0 ) {
$row = mysqli_fetch_array($result,$result2);
}
}
您可以在电子邮件地址和令牌ID之间进行关联:
告诉我们你有什么更新密码。php,这才是真正需要做的。“我不能让最后一部分工作”-这是
部分
我们需要看到更新密码。php
你的表单旁边是多余的<代码>$part=“updatepassword.php”代码>到目前为止,我唯一能想到的是,我认为您的令牌可能会被解释为字符串而不是整数,这可能是也可能不是期望的结果。给它一个trytoken='$uniqid'
而不是token='''$uniqid.'
也尝试用分号value='
关闭它,并使用var\u dump($\u GET)代码>或var_dump($_GET['token'])
查看是否存储了任何内容。@Fred ii-我编辑了我的帖子,以便更清楚地了解发生了什么以及我想要什么。谢谢回复。关于你的第二点,我不希望用户第二次填写他/她的电子邮件。我的意思是,他/她已经输入了电子邮件,这使她收到了带有令牌链接的电子邮件。到那时,应该对用户进行验证。我想的是:在表单中添加$email,将令牌存储在“password_reset”表中。因此,基本上用户的电子邮件将存储在那里。然而,当用户注册时,他的电子邮件被插入到“成员”表中。所以不知道这是否是一个解决方案。然后你可以发送链接reset-password.php中已经存在的电子邮件地址,并使用$\u GET['email']
检索它。我可能认为这是最好的做法。因此,该链接看起来像:www.domain.com/reset?token=TOKENHEREemail=EMAILHERE。然后我可以检查令牌是否等于电子邮件。它不在乎令牌是否存储在电子邮件之外的另一个表中,对吗?
if (isset($_GET['token'])) {
$uniqid = htmlentities( $_GET['token'] );
$email = htmlentities( $_GET['email'] );
$result = mysqli_query($mysqli,"SELECT * FROM password_reset WHERE token = '".$uniqid."' ");
$result2 = mysqli_query($mysqli,"SELECT * FROM members WHERE email = '".$email."' ");
if ( mysqli_num_rows($result) > 0 ) {
$row = mysqli_fetch_array($result,$result2);
}
}
$token = $_GET['token'];
$email = $_GET['email'];
//Don't forget to escape your query parameters
$token = $mysqli->real_escape_string($token);
$email = $mysqli->real_escape_string($email);
$result = mysqli_query($mysqli->query("SELECT * FROM password_reset WHERE token = '$token' AND email = '$email'"));
if(mysqli_num_rows($result) > 0 )
{
//user verified, update usertable
}
else
{
//token or email invalid, show error to user
}