2013-01-06 125 views
0

問題:重置密碼:什麼是優雅的解決方案?

如何確認誰是不需要安全問題,D.O.B,或任何其他參數設密碼?

上下文

在很多網站上,當請求重置密碼,隨機哈希連接到數據庫中的用戶名。該散列作爲URL中的一部分發送給用戶。當用戶點擊通過電子郵件發送的鏈接時,他們會被髮送到可以選擇新密碼的頁面。問題在於,用戶可以在此「設置新密碼」頁面上輸入任何電子郵件地址,併爲該帳戶設置新密碼。那麼,如何驗證用戶是否擁有設置新密碼的帳戶?

我認爲包含隨機哈希的URL應該作爲參數與新密碼一起發送,因爲密碼只能在哈希匹配時設置。然而,這不起作用,因爲$ _GET ['hash']變量僅存在於從電子郵件鏈接的設置密碼頁面上。只要用戶點擊「提交」,$ _GET ['hash']變量就消失了。

簡單的解決方案是通過URL上的$ _GET ['hash']變量再次傳遞,但是這會爲開發人員創建一個額外的步驟,並且可能會混淆它們。 (我正在創建一個庫,所以我的代碼必須足夠簡單,開發人員才能理解和集成)。

人們以前如何解決這個問題?有些人建議使重置鏈接有時間限制。如果鏈接僅在30分鐘內有效,這將有所幫助,那麼這意味着惡意用戶只能在最近30分鐘內請求重置密碼的情況下更改某人的密碼。但是,這裏仍然存在一個脆弱的窗口,所以它並不完美。

如果需要請諮詢澄清。

謝謝

+0

「*用戶可以輸入此「設置新密碼」頁面上的任何電子郵件地址*「 - 爲什麼?您的「我忘記了我的密碼」邏輯應該查找與輸入的用戶名/電子郵件地址相關聯的帳戶,將鏈接發送到該帳戶的相關電子郵件地址,並且「設置新密碼」表單應自動確定該密碼更改鏈接的帳戶是爲了。 – DCoder

+0

只有合適的用戶才能點擊電子郵件中的鏈接。 – Ibu

+0

爲什麼在重置密碼時要求提供電子郵件?這太可怕了。只需在提交表單時使用哈希查詢! –

回答

1

只有正確的用戶會點擊電子郵件中的鏈接。
你可以通過哈希在用戶輸入新的密碼形式:

$hash = $_GET["hash"]; 

... 

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

這樣在提交表單的時候就可以重新驗證的哈希值。

0

我做了(不是說這是最完美的解決方案,但它的工作原理:P):

與像http://mysite.com/resetpwd.php?code=1234&[email protected] URL發送電子郵件,代碼是用戶當前的散列電子郵件和散列密碼。

用戶點擊鏈接,代碼驗證「1234」是「[email protected]」和散列密碼的散列,然後顯示密碼重置頁面,確保添加「1234」和「hello @ hi」。 com「作爲參數傳遞給下一頁。當他們點擊輸入時,它發送到像http://mysite.com/resetpwd.php?code=1234&[email protected]&newpass=hellothere123

Resetpwd.php檢查$ _GET ['newpass'],如果發現再次驗證1234是用戶的散列密碼和[email protected]的散列,則重置密碼。

編輯:哦,我明白了,你不希望再次通過驗證碼...忽略這個話,除非我想出了一個更好的解決辦法:)

0

我所看到的一些網站爲了達到額外的安全級別而做的是讓你指定一個安全問題和答案。因此,除了散列之外,您還可以匹配安全問題(「您最喜歡的寵物是什麼?」),現在您已確認它是用戶。
這可能是一樣安全,因爲你會得到沒有實施像bankofamerica.com這樣的其他安全措施,他們在哪裏你挑一張圖片,以及一個問題等。

相關問題