带 PDO 的忘记密码脚本(需要解密)
Forgotten Password script with PDO (decrypt needed)
我可能有一个愚蠢的问题...我正在做一个忘记密码的脚本(当然是为了登录系统),但我被卡住了。我创建了一个带有特殊 ID 的代码(它可以工作,是的!),但我无法解密它...你能帮我吗?
这是我创建特殊 ID 的功能:
Recovery_Script.php
<?php
include "pdo.php"; if(isset($_POST["submit"]) AND isset($_POST["ForgotPassword"])) {
$email = $_POST["ForgotPassword"];
// Check to see if a user exists with this e-mail
$sql = "SELECT email FROM account WHERE email=:email";
$stmt = $db->prepare($sql);
$stmt->execute(array(":email"=>$email));
$items = $stmt->fetchAll();
$db = null;
foreach($items as $data){
if($data["email"] == $email){
// Create a unique salt. This will never leave PHP unencrypted.
$salt = "498#2D83B631%3800EBD!801600D*7E3CC13";
// Create the unique user password reset key
$password = hash('sha256', $salt.$email);
// Create a url which we will direct them to reset their password
$pwrurl = "http://student.sps-prosek.cz/~kocvaja14/Project/SelfMade/templates/script/recovery_password.php?q=".$password;
// Mail them their key
$mailbody = "Dobrý den,\n\nJestli tento email nepatří vám, prosím, ignorujte jej. Byla vytvořena žádost o obnovení hesla na webové stránce http://student.sps-prosek.cz/~kocvaja14/SelfMade/\n\nPro obnovení hesla klikněte na odkaz níže. \n\nThanks,\nThe Administration";
mail($email, "http://student.sps-prosek.cz/~kocvaja14/Project/SelfMade/index.php - Password Reset", $mailbody);
echo "Your password recovery key has been sent to your e-mail address.";
} else
echo "No user with that e-mail address exists.";
} }?>
现在我需要创建文件,我将在其中解密此 ID ($password)。但我做不到(因为我对这些东西知之甚少)。你能帮我吗?谢谢!
无法解密 sha-hashed 值。
你需要做的是放弃密码恢复的想法,而是构建一个密码重置系统。
这样做的一种方法是这样的:
- 在您的用户 table 中,为 "reset_hash" 添加一个列(一个很好的长散列字符串)
- 当用户请求重设密码时,构建一个散列值并将其存储在他们的记录中。然后,在 e-mail 中发送 link,其中包含 "reset_hash" 作为 url 的一部分。
- 当用户关注 url 时,检查哈希是否存在于用户 table 中。如果是,请提供一个表单,用户可以在其中更改他们的密码。
您应该考虑的其他预防措施可能包括使用 NONCE 和验证 NONCE,这是一种可以导致 link 在 X 小时后过期的方法(NONCE 仅在一段时间内有效)。
我可能有一个愚蠢的问题...我正在做一个忘记密码的脚本(当然是为了登录系统),但我被卡住了。我创建了一个带有特殊 ID 的代码(它可以工作,是的!),但我无法解密它...你能帮我吗?
这是我创建特殊 ID 的功能:
Recovery_Script.php
<?php
include "pdo.php"; if(isset($_POST["submit"]) AND isset($_POST["ForgotPassword"])) {
$email = $_POST["ForgotPassword"];
// Check to see if a user exists with this e-mail
$sql = "SELECT email FROM account WHERE email=:email";
$stmt = $db->prepare($sql);
$stmt->execute(array(":email"=>$email));
$items = $stmt->fetchAll();
$db = null;
foreach($items as $data){
if($data["email"] == $email){
// Create a unique salt. This will never leave PHP unencrypted.
$salt = "498#2D83B631%3800EBD!801600D*7E3CC13";
// Create the unique user password reset key
$password = hash('sha256', $salt.$email);
// Create a url which we will direct them to reset their password
$pwrurl = "http://student.sps-prosek.cz/~kocvaja14/Project/SelfMade/templates/script/recovery_password.php?q=".$password;
// Mail them their key
$mailbody = "Dobrý den,\n\nJestli tento email nepatří vám, prosím, ignorujte jej. Byla vytvořena žádost o obnovení hesla na webové stránce http://student.sps-prosek.cz/~kocvaja14/SelfMade/\n\nPro obnovení hesla klikněte na odkaz níže. \n\nThanks,\nThe Administration";
mail($email, "http://student.sps-prosek.cz/~kocvaja14/Project/SelfMade/index.php - Password Reset", $mailbody);
echo "Your password recovery key has been sent to your e-mail address.";
} else
echo "No user with that e-mail address exists.";
} }?>
现在我需要创建文件,我将在其中解密此 ID ($password)。但我做不到(因为我对这些东西知之甚少)。你能帮我吗?谢谢!
无法解密 sha-hashed 值。
你需要做的是放弃密码恢复的想法,而是构建一个密码重置系统。
这样做的一种方法是这样的:
- 在您的用户 table 中,为 "reset_hash" 添加一个列(一个很好的长散列字符串)
- 当用户请求重设密码时,构建一个散列值并将其存储在他们的记录中。然后,在 e-mail 中发送 link,其中包含 "reset_hash" 作为 url 的一部分。
- 当用户关注 url 时,检查哈希是否存在于用户 table 中。如果是,请提供一个表单,用户可以在其中更改他们的密码。
您应该考虑的其他预防措施可能包括使用 NONCE 和验证 NONCE,这是一种可以导致 link 在 X 小时后过期的方法(NONCE 仅在一段时间内有效)。