2013-07-22 37 views
1

this question我真的很喜歡@ woliveirajr的答案,因爲它解決了:驗證電子郵件安全系統解決

  1. 如何防範釋放一個網站
  2. 所使用的電子郵件地址驗證的所有者E-mail地址

爲了避免這種泄漏的,你也可以通過詢問的電子郵件開始註冊 過程。輸入後,您將發送一封帶有鏈接的 電子郵件,以便用戶可以繼續進行 註冊過程。如果電子郵件已經註冊,你會發送一封電子郵件說。

這樣,只有電子郵件的所有者可以登記。

缺點:

  • 可能是真實的,普通用戶將獲得由有這麼多的步驟來註冊無聊。
  • 在極少數情況下,一個電子郵件在一個網站已經註冊簡單揭示出了問題,特別是因爲它很容易 寄存器在任何網站提供你想要的任何電子郵件。您只需 將不會收到電子郵件來激活您的帳戶,但通常 網站會將帳戶/用戶名與該電子郵件相關聯。

在那裏我不確定是如何實現一個系統,一個用戶只能訪問註冊頁面時,他們從點擊電子郵件中的鏈接。註冊頁面是否會使用GET檢索傳遞給它的數據並驗證「代碼」以瞭解用戶是否可以註冊,並且此代碼每30分鐘更改一次?例如,電子郵件註冊鏈接可能是mysite.com/register.php?secretcode=as18dregister.php將檢查「代碼」as18d,但此代碼將每30分鐘更改一次。這是主意嗎?代碼是否會根據系統時間通過salted hash生成?

或者,而不是電子郵件的幾個字母的鏈接可以通過電子郵件發送,用戶進入註冊頁面進行身份驗證,有點像如何拍攝工作,但不是真的。

回答

0

的一般方法,這是使用一個難以猜測的原因,如嵌入的鏈接,使其獲取與GET提交一個GUID。這應該是安全的,因爲統計數據不太可能有人會隨機猜測任何用戶的GUID,無論他們花費多少時間來猜測,因此到期甚至不是真正必要的。

值得注意的是,這應該通過SSL連接來進行,以避免在中間妥協驗證過程一個人的可能性。

+0

這是生成GUID/UUID所需的函數嗎? http://php.net/manual/en/function.uniqid.php或者應該使用'openssl_random_pseudo_bytes()'來代替? – Celeritas

+1

唯一性是重要的,所以或許應該很好,因爲獲取一系列值是不切實際的。 –

0

有在服務器端沒有辦法可以保證一個HTTP請求在電子郵件中的鏈接來了。你不能相信客戶端的任何東西;它可以被欺騙和操縱。

你需要的是一個很難猜測的標記。長時間和隨機是很好的起點。

由於以下原因,不同意AJ期滿。

  • 如果你的用戶數據庫變大,你不想跟蹤未使用的令牌多年和數年。
  • 如果有人請求激活令牌,並在幾天後不使用它,這是不可能的。不妨將它刪除。