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と所有者の両方を知る必要があるため、実際には推測できません。ただし、念のため、1 時間または 1 日で有効期限が切れるようにします。
  4. 次に、このリンクが機能することを確認します。次の列を含むパスワード リセット リクエスト用のテーブルを作成idするemail必要hashがありdate_addedます。TIMESTAMPCURRENT_TIMESTAMP
  5. いよいよメールの送信です。少し前に生成した URL に言及している限り、任意のテキストを追加できます。
  6. ここで、ユーザーはリンクをクリックします。ユーザー ID とハッシュを取得し、そのようなエントリが存在するかどうかを確認します。そうで、リクエストが 1 日以内であれば、新しいパスワードを生成し、usersテーブルを更新して、確認メールを送信します。
  7. これはオプションですが、推奨されます。1 日以上経過したエントリのパスワード リセット リクエスト テーブルをクリアする cron ジョブを作成します。

これらの各手順は非常に簡単に実行できます。または、Web でそれらに関する多くの情報を見つけることができます。時間をかけて各ステップを理解し、すべてを適切にサニタイズし、本に従って物事を行えば、多くのことを学ぶことができます.

于 2013-01-18T14:55:53.643 に答える