2015-06-04 69 views
0

我正在爲一個網站創建一個配置文件系統,並且我正在編寫PHP中的密碼重置功能。什麼阻止某人僞造密碼重置鏈接?

基本上,我詢問用戶爲他們的電子郵件地址,然後設置一個隨機密碼的MD5和電子郵件發送給他們看,並談到在格式化像

www.mysite.com/reset.php鏈接? [email protected] & hash = hashgoeshere

當有人可以僞造密碼重置鏈接並使用散列值而不是密碼時,隱藏密碼在md5後面的要點是什麼?

+3

*「然後設置一個隨機的md5密碼」* - 不要使用MD5,也不要使用在URL中傳遞密碼的方法。使用一次性和隨機密鑰,然後他們將輸入一個新的密碼。這不是「回答」這個問題,而是「不要這樣做」的評論。 –

+1

URL中的散列不應該是哈希密碼。另一方面,您不應該直接重置用戶的密碼,而不必先發送確認電子郵件。有人可以使用其他用戶的電子郵件,然後重新設置密碼。 正確的做法是向用戶發送一封包含確認鏈接的電子郵件以重置其密碼。這個鏈接將包含哈希作爲檢查link.Ex的真實性的一種形式:'md5($ email。'someSecretH3re'。$ userId);'。這種方式可以在用戶點擊鏈接並比較時重新構造哈希這兩個哈希(生成和電子郵件) – Adon

+0

儘管這並不能防止欺詐,但MySQL注入很容易竊取一次性代碼。任何人都可以重置任何人的密碼,而無需訪問使用的電子郵件地址。 – user3822332

回答

3

你應該選擇像一個工作流程:

  • 生成新的GUID,保存對用戶帳戶,把它PasswordResetToken
  • 你應該發送重定向用戶的電子郵件/reset.php? [email protected] & resetToken = XXXXXXXXXXX
  • 您確認重置令牌存在用戶帳戶指定
  • 要求用戶輸入他們選擇的新密碼並保存。
  • 抵消保存重置令牌,因此它不能再被使用

這將是那麼極端/統計學上不可能有人能猜出一個鏈接來設置別人的密碼,他們選擇什麼,除非(一)一個復位請求是(b)他們可能會猜到你生成的GUID。

+0

這種方法沒有人可以重置其他密碼,除非他不知道該標記值。並且用戶可以選擇他自己的新密碼。 – Sachin

+0

讓我們只希望OP在事實之後不要求代碼;-) –

+0

在閱讀本文時,它只是點擊了我,謝謝! – user3822332

0

的問題是,你不應該在鏈路上發送令牌的哈希值(甚至密碼),而不是發送隨機令牌

http://www.example.com/reset.php?token=78dk3hi3479s8j383o98u3 

在數據庫中你存儲散列與令牌一起用戶id。現在,當用戶單擊鏈接時,您將獲得令牌並可以再次計算該令牌的散列值。如果它與數據庫中存儲的散列匹配,則可以允許用戶重置其密碼。

由於攻擊者必須發送原始令牌,並且您在服務器端計算散列,他不能僞造有效的令牌。這也可以保護令牌,防止攻擊者讀取數據庫(SQL注入)。