【问题标题】:Check for valid token in order to update password检查有效令牌以更新密码
【发布时间】:2013-12-24 02:31:19
【问题描述】:

我有两个名为“members”和“password_reset”的表。我有一个表格(request-password.php),用户可以通过填写他们的电子邮件来重置他们的密码。当他们填写表格时,带有令牌的链接已发送到用户电子邮件。令牌存储在“password_reset”表中,所有用户信息都存储在“members”表中

当用户单击电子邮件中的链接时,他将被重定向到 reset-password.php 页面,他必须在该页面输入新密码并再次填写以确认。单击提交按钮后,页面将重定向到 update-password.php。这是包含将新密码更新到数据库的代码的页面。但是,在页面能够更新数据库之前,它必须检查用户是否输入了等于 confirmpwd 的密码。以及电子邮件和分配的令牌是否有效。如果输入的密码相同且令牌存在,则应更新该特定用户的用户记录。

我的问题:如何获取 update-password.php 文件以检查电子邮件和分配的令牌是否有效,以便可以更新使用该电子邮件的用户的用户记录? 电子邮件存储在“members”表中,令牌存储在“password_reset”中。我不知道如何链接它们。

这是我的 reset-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>";
}
}

UPDATEEEEEEEEEEE! *@Chancho* - 好的,我已将 send-email.php 中的网址更新为:

$url = "DOMAIN.COM/reset-password/reset.php?email=".$email."#token=".$uniqid;

现在 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);
}
}

【问题讨论】:

  • 向我们展示你对 update-password.php 有什么,这才是真正需要做的。
  • “我无法让最后一部分工作” – 这就是 part 我们需要看到 update-password.php 您的表单几乎是多余的。 $part="update-password.php";
  • 到目前为止我唯一能想到的是,我认为您的令牌可能被解释为字符串而不是整数,这可能是也可能不是所需的结果。试试这个 token = '$uniqid' 而不是 token = '".$uniqid."' 也尝试用分号关闭它 value='&lt;?php echo $uniqid; ?&gt;'
  • 并使用var_dump($_GET);var_dump($_GET['token']);查看是否存储了任何内容。
  • @Fred-ii- 我已经编辑了我的帖子,以便更清楚地了解正在发生的事情以及我想要什么。

标签: php mysql database token


【解决方案1】:

您可以在电子邮件地址和令牌 ID 之间建立关系:

  1. 用户在他/她的邮箱中收到令牌
  2. 用户点击链接并在网页中输入电子邮件地址

reset-password.php(未经测试的代码):

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

【讨论】:

  • 感谢您的回复。关于您的第二点,我不希望用户第二次填写他/她的电子邮件。我的意思是,他/她已经输入了电子邮件,这使她收到了带有令牌链接的电子邮件。届时应验证用户。我的想法如下:将 $email 添加到将令牌存储在“password_reset”表中的表单中。所以基本上用户的电子邮件将存储在那里。但是,当用户注册时,他的电子邮件被插入到“成员”表中。所以不知道这是否是一个解决方案..
  • 然后您可以将链接中已经存在的电子邮件地址发送到 reset-password.php 并使用$_GET['email'] 检索它
  • 我可能认为这是最好的做法。所以链接看起来像:www.domain.com/reset?token=TOKENHEREemail=EMAILHERE。然后我可以检查令牌是否等于电子邮件。它不关心令牌存储在电子邮件之外的另一个表中,对吧?
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 2020-07-12
  • 2012-07-09
  • 1970-01-01
  • 2020-06-05
  • 2018-12-30
  • 2015-10-11
  • 2013-09-06
相关资源
最近更新 更多