【问题标题】:Password reset using PHP and urlencode issues使用 PHP 和 urlencode 问题重置密码
【发布时间】:2013-01-18 14:10:01
【问题描述】:

只是寻找有关如何将 urlencode 应用到这段代码的建议。确实有效,收到邮件时的问题,urlencode似乎不起作用。

function reset_password($email) {
 $query = "DELETE from reset_password where email = $email";
 $deletepass = mysql_query($query);
 $code = substr(base64_encode(crypt('', '')), 0, 32);
 $query2 = "INSERT into reset_password values ($email, '$code', " . time() . ")";
 $insertval = mysql_query($query2);

 $f = "SELECT userEmail from gn_users where email = $email";

$from = "***"; // sender
$f['userEmail']; // recepient

$message =
"From: *** <***>\r\n" . // email headers
"To: {$f['userEmail']} <{$f['userEmail']}>\r\n" . 
'Subject: Reset Password' . "\r\n" .
"\r\n" .
"Hello\r\n" . // email imap_body(imap_stream, msg_number)
"\r\n" .
"A request has been made to reset your example.com web site password.\r\n" .
"\r\n" .
"To complete the request, click on the following link within 48 hours of the transmision of this email and follow the on screen instructions.\r\n" .
"\r\n" .
"index.php?page=reset-password&email=" . urlencode($email) . "&code=" . urlencode($code) . "\r\n" .
"\r\n" .
"Kind regards,\r\n" .
"\r\n" .
"The example.com Web Site";

$to = "$email";
$subject = "Test mail";
$message = "$message";
$from = "***";
$headers = "From:" . $from;
mail($to,$subject,$message,$headers);
echo "Mail Sent.";}

【问题讨论】:

  • 你有一个 SQL 注入漏洞。
  • $code = substr(base64_encode(crypt('', '')), 0, 32); ... WAT?!
  • @Slaks 你有多个 SQL注入漏洞
  • 所以问题可能出在index.php 而不是这段代码?好吧,除了危险的数据库处理。
  • 天哪,忘记那个教程,再找一个。讨厌这种教人们如何编写糟糕的、无格式的和任何攻击类型的易受攻击代码的教程......

标签: php sql passwords urlencode reset


【解决方案1】:

我将尝试帮助您提供一些自己编写的技巧,而不必依赖那些糟糕的代码。

您需要将任务分解为多个小而易做的任务。

我们开始吧:

  1. 用户需要一个页面来请求密码重置。这是一个带有电子邮件字段(和/或用户名)的表单。
  2. 我们有用户邮箱,如果存在,我们需要生成一个无法猜到的重置密码链接,这样就不是每个人都可以重置别人的密码了。
  3. 所以你需要为这个请求生成一个唯一的哈希,一个选项是uniqid(),但是这里有很多选项。因此,您生成的链接类似于:http://test.com/reset.php?uid=443&amp;hash=33rr3344rree22。它不能真正被猜到,因为您需要知道用户 ID 和拥有。但为了确保这一点,我们将使其在一个小时或一天内过期。
  4. 接下来,我们确保此链接有效。我们必须为密码重置请求创建一个表,其中包含以下列:idemailhashdate_added,并插入它(日期可以是TIMESTAMP,默认为CURRENT_TIMESTAMP )。
  5. 现在该发送电子邮件了。您可以添加任何您想要的文本,只要您提及您之前生成的网址即可。
  6. 现在用户点击链接。您获取用户 ID 和哈希,并检查是否存在这样的条目。如果是这样,并且请求不超过 1 天,我们会生成一个新密码,更新 users 表,并向他发送一封确认邮件。
  7. 这是可选的,但建议使用。创建一个 cron 作业,清除超过 1 天的条目的密码重置请求表。

这些步骤中的每一个都相当容易完成,或者您可以在网络上找到很多关于它们的信息。如果您花时间了解每个步骤,正确清理所有内容并按部就班,您将学到很多东西。

【讨论】:

  • 赞成“您需要将任务分解为多个、一口大小、易于执行的任务。”带有此类中断的答案使学习者更容易掌握这个过程!
猜你喜欢
  • 2013-04-05
  • 2016-10-04
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 2011-04-07
相关资源
最近更新 更多