PHP密码重置URL处理


PHP Password Reset URL processing

如何存储密码重置URL中的重置代码来处理密码重置?

简而言之,我试图创建一个密码重置系统,用户输入他们的电子邮件地址,生成一个随机重置代码,该代码附加到一个URL,然后通过电子邮件发送给用户。

用户然后点击链接,进入密码重置页面。重置代码和电子邮件取自URL并存储在变量中。当提交新密码时,将使用这些变量来检查它们是否与数据库匹配,如果匹配,将更新密码。

我认为我所遇到的问题是,reset.php是用于"操作"新密码表单的页面,因此当提交新密码时,只有当页面首次从链接加载时,URL中才没有值,即使如此,其余代码和电子邮件值似乎也不会存储在创建的变量中。

我如何保持值,我应该使用哪个URL来"动作"的形式,以确保这工作?我是不是用了完全错误的方法?

希望这是有意义的,有人可以帮助?请用简单的术语解释,因为我对PHP很陌生,特别是关于密码等。

缩短代码(应该足够清楚地看到问题):

<?php
require("../db_connect.php");
$page_title = "Password Reset";
$errors = array();
// check if reset code and email is set in URL and store in variable if it is
// example URL http://www.thissite.com/reset.php?reset=123abc&email=me@me.com
if (!isset($_GET['reset']) || (!isset($_GET['email']))
{ 
  //create error message and link to forgotten password page 
}
else
{ 
  $reset_from_url = mysqli_real_escape_string( $dbc , $_GET['reset'] );
  $email_from_url = mysqli_real_escape_string( $dbc , $_GET['email'] );
}
if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
{ 
  // code to compare reset code and email from URL with database
  // code to check passwords entered and if all ok, insert into database
}
<form action="reset.php" method="POST">
<p>New password:</p>
<input type = "password">
</p>Confirm Password:</p>
<input type = "password">
</form>

正如您已经尝试过的那样,您必须将url中的令牌存储在隐藏字段中。

$tokenFromUrl = $_GET['reset'];
$escapedTokenFromUrl = htmlspecialchars($tokenFromUrl);
...
<form action="reset.php" method="POST">
  <input type="hidden" name="token" value="<?php echo $escapedTokenFromUrl; ?>" />
...
</form>

您使用了错误的转义函数,mysqli_real_escape_string()意味着对数据库查询进行转义,并且只能在您有打开的数据库连接时使用。使用htmlspecialchars()来转义HTML输出。

那么你的隐藏标签需要一个name属性,否则你不能在post请求中访问它。

最后但并非最不重要的一点是,您应该只在数据库中存储令牌的散列,否则对数据库具有读访问权限(sql注入)的攻击者可以请求令牌并使用令牌自己获取帐户。在这篇短文中,我试图展示如何做到这一点。