2013-03-17 27 views
1

我想爲新創建的自動生成鏈接爲新註冊用戶自動生成鏈接

mywebapp將發送給用戶的電子郵件的用戶。當

用戶點擊鏈接我應該更新用戶爲

'激活'。

所以我有一些問題,我想知道,如果

從我迄今爲止看過我的邏輯是正確的。

  1. 用戶在表單中,按填充進入

2.My Web服務處理的數據,並創建一個帳戶......

所以在這其中我散列部分用一些獨特的salt鍵入密碼並將其存儲在數據庫中。

,所以我將有一個像

user_ID username   password     active 

1   taniamm20  12346645556665566666  0 

我可以在驗證鏈接使用哈希密碼例如

http://localhost:9092/localbusscat/services/localbusscat/UpdateDB?choID=12346645556665566666  

它是一個很好的做法表?

或者此時我不應該保存用戶的密碼,只需保存user_id並使用該用戶的java.UUIID生成長的唯一密鑰並將其保存在表中並使用此唯一密鑰進行驗證。

我覺得我的UpdateDBService應該likethis

public String UpdateDB(int choID) throws ClassNotFoundException 
     { 

      String strDelReturn = "UPDATE_FAIL"; 

      Class.forName("org.postgresql.Driver"); 
      try 
      { 
       conn = DriverManager.getConnection("...."); 
      } 

      catch (SQLException ex) 
      { 

       ex.printStackTrace(); 
      } 


      PreparedStatement pstmt = null; 
      String selectQuery = "update user_table set active=active+1 WHERE password="+ choID ; 

      try { 

       pstmt = conn.prepareStatement(selectQuery); 
       int rowss = pstmt.executeUpdate(); 
       if (rowss != 0) 
        strDelReturn = "UPDATE_OK"; 

      } 
      catch (Exception ex) 
      { 

      } 
      return strDelReturn; 
} 
+2

我認爲應該創建一個隨機的字母數字字符串並將其存儲在「臨時數據庫」中,以及驗證超時等。如果在「x」分鐘後沒有單擊該鏈接,驗證過期並且鏈接變得無效。當然,所述字符串在數據庫中必須是唯一的。驗證之後,更新你的'主動標誌'(或者在你的實際用戶數據庫中做一個'第一次插入'),你就全部設置好了。 – 2013-03-17 08:15:26

+0

如果散列密碼用於登錄,則應該生成另一個散列並將其用作激活碼。 – Pietu1998 2013-03-17 08:15:26

+0

除了refugnic-eternium評論,您還可以使用長格式的日期作爲唯一ID,以便計算哪個鏈接已過期鏈接。但是,在長時間生成日期保持同步的方法:) – Sach 2013-03-17 08:21:24

回答

3

我的建議是利用第二個表,稱爲pending

它基本上是用戶表的「擴展」,或主數據的副本,具體取決於您的結構。

該表中,這是最純粹的形式,應該是這樣的:

UID (int), ActCode (Varchar[x]), ValidUntil (int) 

UID和ACTCODE都是唯一的,也就是說只有一個ACTCODE可以每UID在同一時間發出,並且每個ACTCODE方能關聯一次。 ValidUntil包含返回值UNIX_TIMESTAMP() + x seconds ...無論您希望有效期如何。

此結構建議,實際用戶表具有id, userdata, activated作爲列。

如果該鏈接在x秒內未使用,該鏈接將變爲無效(UNIX_TIMESTAMP() > ValidUntil),並且可能會生成一個新的激活鏈接,而舊鏈接將被刪除。

或者,您可以獲取(與每個激活相關的請求)過期激活並刪除與其關聯的用戶數據。

如果在時間間隔內點擊鏈接,您將刪除激活碼並更新您的用戶標誌。

另一種選擇是延長用戶表:

ActCode, ValidUntil, Userdata 

這樣,你的用戶表保持了選擇的全部,你會插入UserData只有在使用的ACTCODE,而它仍然有效。 這可以保護您的自動增益不受非激活帳戶的影響,並且您的用戶表中不需要Activated字段,因爲只要它位於用戶表中,它就會被激活。

1

激活與認證是分開的,它通常用於確保用戶輸入他們有權訪問的有效電子郵件地址(或任何聯繫人詳細信息)。

您應該生成一個單獨的唯一代碼來激活用戶,並用該代碼而不是密碼通過電子郵件發送鏈接。

現在我可能在這裏錯了,但你似乎有一個印象,哈希密碼可以通過電子郵件轉移它。不是,在最好的情況下,你會給攻擊者一些暴力。

激活後,請求用戶使用其憑據登錄。