2014-01-21 85 views
4

我正在嘗試製作一個用戶註冊我的網站的小系統,並且他們會收到其中一個包含他們點擊以激活其帳戶的鏈接的電子郵件。使用電子郵件鏈接中的代碼進行用戶帳戶驗證

到目前爲止,我想這樣做以下方式:

  1. 用戶註冊並提交印刷機。
  2. 創建一個長的隨機字符串,並將其放入數據庫中,並與此新的「非活動」帳戶相關聯。
  3. 將電子郵件發送到用戶提供的地址,其中包含鏈接以說明「www.mysite.com/userclass/validationmethod/[email protected]/3423frqfafkop2341o43」。最後一位是驗證碼。
  4. 用戶點擊鏈接。
  5. 電子郵件和代碼匹配剛剛創建的帳戶。該帳戶被標記爲已驗證/活動。
  6. 存儲在數據庫中的驗證碼被刪除或標記爲已使用?

您對此有何看法?這是做這件事的最好方法嗎?作爲一個額外的問題,我是否需要urlencode該電子郵件地址?


我走了下面這似乎很好。只需要添加數據庫功能,它的排序:

public function verifyAccount($vCode, $email) { 
     $email = urldecode($email); 
     if($userId = $this->model->userIdByEmail($email)) 
     { 
      $actualCode = $this->model->getUsersVerificationCodes('code', 'userId', $userId); 
      if($actualCode != $vCode) 
      { 
       $output = 'Invalid code or email.'; 
      } else { 
       $output = 'Success!'; 
      } 
     } else { 
      $output = 'Invalid code or email.'; 
     } 

     echo $output; 
} 
+1

我會在url中包含一個唯一的字段,例如用戶ID,so/userid/string,這會使您在查詢兩個字段時更輕鬆地查詢數據庫,而不是隻搜索一個字段。它也消除了多個用戶可能擁有相同的激活散列/字符串的問題(發生這種情況的可能性不大,但這是一種可能性!) – joao

+1

您不需要在URL中傳遞電子郵件地址。發送您已經保存在數據庫中的唯一驗證碼。在驗證過程中,請檢查代碼是否有效。如果找到有效的代碼,則更新用戶驗證狀態。 –

+0

@JoãoFerreira你認爲我應該保留驗證碼並將其標記爲已使用嗎?我也可以給它一個日期,以便我可以設置到期日嗎? – imperium2335

回答

2

看起來很好,我也會這樣做。但我不會在鏈接中使用電子郵件。使用相反的東西是這樣的: mysite.com/confirm_email/749c71f6a29220a3ec168df

編輯:我認爲你不需要urlencode電子郵件,但是當你這樣做可能更容易處理地址。

我認爲另一個可能的選擇是:

mysite.com?email=urlencoded_email&confirm=u34h23ui4h234取決於你是如何處理的URL參數。

+2

+1好點。我想我不需要電子郵件地址,因爲它不像別人會猜測一個大的隨機字符串爲別人的帳戶。 – imperium2335

+0

如果您有_just_「大隨機字符串」,那麼我只需將足夠的隨機字符串充斥到您的腳本中,以便遲早啓用_any_帳戶...所以您還應該傳輸一些標識該帳戶的內容(電子郵件或ID)來防止這種情況發生。 – CBroe

+0

@CBroe同意,我將發送除了代碼之外的電子郵件,而不是用戶ID。我認爲電子郵件比僅僅是一個數字的ID好得多,或者你認爲它們是相同的? – imperium2335

0

我想說,把電子郵件地址放在鏈接中沒有意義。如果一個人在創建虛假電子郵件後想弄清楚這一點,那麼已經知道這個假電子郵件,並將其添加到鏈接中,他們會發送垃圾郵件來猜測隨機數。所以只需要(大)隨機數(儘可能隨機)。

但是,您應該做的是放置到期字段進行驗證。你應該只讓這個隨機數有效一個小時左右。如果他們在一小時後觸及該鏈接,那麼它不再有效。這有助於與黑客作鬥爭,因爲如果他們猜測他們需要時間和他們註冊的每個虛假賬戶,他們會得到一個新的隨機數,並且只有1個小時的猜測時間。如果你能得到一個很長很好的隨機數字,應該更好地對抗黑客。

在您的電子郵件中有一個支持鏈接,供用戶請求另一個驗證碼並手動處理,以便您可以看到發生的任何模式。這應該經常發生。

相關問題