PHP密码重置URL处理

时间:2015-08-12 22:24:04

标签: php url passwords

如何(我应该?)存储密码重置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>

1 个答案:

答案 0 :(得分:0)

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

$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()旨在为数据库查询转义,并且只有在您具有开放数据库连接时才能使用。而是使用转义为HTML输出的htmlspecialchars()

然后您的隐藏标记需要名称属性,否则您无法在发布请求中访问它。

最后但并非最不重要的一点是,您应该只在数据库中存储令牌的哈希值,否则对数据库具有读访问权限的攻击者(SQL注入)可以请求令牌并自己使用令牌来获取帐户。在这个小article中,我试图说明如何做到这一点。