簡體   English   中英

重置密碼:什么是優雅的解決方案?

[英]Resetting passwords: What is an elegant solution?

問題:

如何驗證誰在重置密碼而無需安全問題,DOB或任何其他參數?

上下文

在許多網站上,當要求重設密碼時,數據庫中的用戶名會附帶一個隨機散列。 此哈希作為電子郵件中URL的一部分發送給用戶。 當用戶單擊通過電子郵件發送的鏈接時,他們將被發送到可以選擇新密碼的頁面。 這里的問題是,用戶可以在“設置新密碼”頁面上輸入任何電子郵件地址,並為該帳戶設置新密碼。 那么,如何驗證用戶實際上是他們要為其設置新密碼的帳戶的所有者?

我認為包含隨機哈希的URL應該與新密碼一起作為參數發送,因為只有在哈希匹配時才可以設置密碼。 但是,這不起作用,因為$ _GET ['hash']變量僅存在於從電子郵件鏈接的設置密碼頁面上。 用戶單擊“提交”后,$ _ GET ['hash']變量就消失了。

一種簡單的解決方案是通過Submit上的URL傳遞$ _GET ['hash']變量AGAIN,但這為開發人員增加了一個步驟,並可能使他們感到困惑。 (我正在創建一個庫,因此我的代碼必須足夠簡單,以使開發人員能夠理解和集成)。

人們以前是如何解決這個問題的? 有人建議將重置鏈接設置為時間限制。 如果說該鏈接僅在30分鍾內有效,則這將有所幫助,這意味着惡意用戶只能在該人最近30分鍾內請求重設密碼時才更改該人的密碼。 但是,那里仍然存在漏洞窗口,因此它不是完美的。

請根據需要進行澄清。

謝謝

只有正確的用戶才能單擊電子郵件中的鏈接。
您可以以用戶輸入新密碼的形式傳遞哈希值:

$hash = $_GET["hash"];

...

<form name="newpasswordform">
...
<input type="hidden" name="thehash" value="<?php echo $hash?>"
...
</form>

這樣,您可以在提交表單時重新驗證哈希。

我已經做完了(不是說這是最優雅的解決方案,但它有效:P):

發送網址為http://mysite.com/resetpwd.php?code=1234&email=hello@hi.com的電子郵件,其中代碼是用戶當前電子郵件的哈希值和哈希密碼。

用戶單擊鏈接,代碼驗證“ 1234”是“ hello@hi.com”的哈希值和哈希密碼,然后顯示密碼重置頁面,確保添加“ 1234”和“ hello@hi.com”作為參數在傳遞給下一頁的表格中。 當他們單擊Enter時,它將發送到類似http://mysite.com/resetpwd.php?code=1234&email=hello@hi.com&newpass=hellothere123

Resetpwd.php檢查$ _GET ['newpass'],如果找到,則再次驗證1234是用戶的哈希密碼和hello@hi.com的哈希值,然后重置密碼。

編輯:哦,我知道了,您不想再次傳遞驗證碼...那么,請忽略此,除非我提出了一個更好的解決方案:)

我已經看到一些站點為實現更高級別的安全性所做的事情是讓您指定安全性問題和答案。 因此,除了哈希之外,您還要匹配安全性問題(“您最喜歡的寵物是什么?”),現在您可以確認它是用戶。
如果不執行bankofamerica.com采取的其他安全措施,在其中讓您選擇圖片以及問題等的措施,它的安全性將與您將獲得的安全性差不多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM