0

只是寻找有关如何将 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.";}
4

1 回答 1

1

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

您需要将任务分解为多个、一口大小、易于执行的任务。

开始了:

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

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

于 2013-01-18T14:55:53.643 回答