Free tutorials & notes in Hindi & English · Clean code examples 🧰 मुफ़्त PDF और फ़ोटो टूल्स →
📘 Lesson  ·  Lesson 47

Forgot Password Reset

Password reset कैसे काम करता है

चूँकि passwords सिर्फ़ hashes के रूप में store होते हैं, आप भूला हुआ "देख" नहीं सकते। इसके बजाय, forgot-password flow साबित करता है कि user अपना email control करता है और उसे नया password set करने देता है। यह एक one-time token इस्तेमाल करता है: request → link email → token verify → नया password set।

💡 असली password कभी email न कीजिए। इसके बजाय एक secure, expire होने वाला token link email कीजिए।

चरण 1: Reset माँगना

<?php
  $email = trim($_POST["email"]);
  // जाँचिए email users table में है (prepared statement)
  $stmt = $pdo->prepare("SELECT id FROM users WHERE email = ?");
  $stmt->execute([$email]);
  $user = $stmt->fetch();
?>

User अपना email submit करता है। हम इसे prepared statement से देखते हैं। अगर मौजूद हो, तो reset token बनाने पर बढ़ते हैं।

Token expiry के साथ store

<?php
  $token = bin2hex(random_bytes(32));   // secure random token
  $expiry = date("Y-m-d H:i:s", time() + 3600);  // 1 घंटा

  $stmt = $pdo->prepare(
      "UPDATE users SET reset_token = ?, reset_expiry = ? WHERE email = ?"
  );
  $stmt->execute([$token, $expiry, $email]);
?>

हम random_bytes से लंबा random token generate करते हैं और उसे database में एक-घंटे की expiry के साथ save करते हैं। इसे server-side store करना हमें बाद में verify करने देता है।

<?php
  $link = "https://yoursite.com/reset.php?token=$token";
  $body = "Click to reset your password (valid 1 hour):\n$link";
  // $body को email से भेजिए (PHPMailer / SMTP)
?>

हम token रखता एक link email करते हैं। जब user इसे click करे, वो token URL में लिए reset page पर पहुँचता है, verify होने को तैयार।

चरण 2: नया password set करना

<?php
  $token = $_GET["token"] ?? "";
  $stmt = $pdo->prepare(
      "SELECT id FROM users WHERE reset_token = ? AND reset_expiry > NOW()"
  );
  $stmt->execute([$token]);
  $user = $stmt->fetch();

  if ($user) {
      $newHash = password_hash($_POST["password"], PASSWORD_DEFAULT);
      $upd = $pdo->prepare(
          "UPDATE users SET password = ?, reset_token = NULL WHERE id = ?"
      );
      $upd->execute([$newHash, $user["id"]]);
      echo "Password updated";
  } else {
      echo "Invalid or expired link";
  }
?>
Password updated

हम token सिर्फ़ तब स्वीकार करते हैं जब वो मेल खाए और expire न हुआ हो (reset_expiry > NOW())। नया password password_hash से hash होता है, और token clear हो जाता है ताकि दोबारा इस्तेमाल न हो।

आम गलतियाँ

  • असली password email करना। आप नहीं कर सकते — यह सिर्फ़ hash है। token link email कीजिए।
  • कमज़ोर tokens। random_bytes इस्तेमाल कीजिए, rand() या md5(time()) नहीं।
  • कोई expiry नहीं। हमेशा token पर expiry set और जाँचिए।
  • Token clear न करना। इस्तेमाल के बाद हटाइए ताकि link दोबारा इस्तेमाल न हो।

सारांश

  • Hashed password recover नहीं कर सकते — उसे token से reset करते हैं।
  • random_bytes से secure token generate कीजिए और expiry के साथ store कीजिए।
  • Token रखता link email कीजिए; password कभी email न कीजिए।
  • Token और expiry verify कीजिए, फिर नया hashed password set कीजिए।
  • इस्तेमाल के बाद token clear कीजिए ताकि link one-time हो।

आगे, hashing समझिए password hashing में, या login बनाइए login और registration में।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

Forgot-password flow कैसे काम करता है?
User email से reset माँगता है। आप एक random token बनाते हैं, expiry के साथ store करते हैं, और उसे रखता एक link email करते हैं। जब user link click करे, आप token verify करते हैं और उसे नया password set करने देते हैं, जिसे save से पहले hash करते हैं।
Password email करने के बजाय token क्यों?
आपको असली password कभी पता या email नहीं करना चाहिए — वो सिर्फ़ hash के रूप में store है। एक one-time token साबित करता है कि user email control करता है और उसे सुरक्षित रूप से नया password set करने देता है, पुराना कभी उजागर किए बिना।
Reset token expire क्यों होना चाहिए?
कभी expire न होने वाला token जोखिम रहता है अगर email बाद में किसी और को दिखे। इसे छोटी उम्र (जैसे एक घंटा) देना attacker की leak हुए link इस्तेमाल करने की window सीमित करता है।
Secure token कैसे generate करूँ?
लंबे, unpredictable token को bin2hex(random_bytes(32)) इस्तेमाल कीजिए। rand() या md5(time()) जैसे कमज़ोर functions से बचिए, जो अंदाज़ा लगाने योग्य हैं।
क्या नया password hash होना चाहिए?
हाँ। जब user नया password set करे, save से पहले उसे password_hash() से hash कीजिए, बिल्कुल signup जैसा। Database में कभी plain password नहीं होना चाहिए।
← Back to PHP Tutorial
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.
अगला topicCalculator (Switch Case) आपकी प्रगति: 47 / 50 (94%) · Lesson 48 / 50 आगे बढ़ें →

यह lesson कैसा लगा?

आपकी राय से हम content और बेहतर बनाते हैं।

अपना review और सुझाव लिखें (वैकल्पिक)

Review approve होने के बाद आपका नाम और शहर इसके साथ public दिख सकते हैं। Email या phone न लिखें।

▶ CodingEasily on YouTube

Video से सीखें – आसान Hindi में

चुनी हुई video: RDBMS भाग 3 – Class XI Commerce IT

▶ Channel subscribe करें