2012-02-08 140 views
1

現在我的應用程序中的cookie以用戶ID的某種格式生成。我希望我的cookie在每次登錄後隨機生成,因此即使cookie被盜,一旦它們永遠不會被黑客永遠使用。Java中的Cookie和安全性(GAE)

以這種方式處理cookie的最佳做法是什麼?我應該如何存儲/檢索它們(散列表/數據存儲......)?

感謝

+0

爲什麼不使用標準的東西,比如Spring Security? – 2012-02-08 15:06:28

+0

我不是春秋家庭,這次想寫我自己 – Sergey 2012-02-08 19:56:44

回答

2

你可以試試以下參數:

  • 用戶ID
  • 生存時間(毫秒)
  • 哈希:
    • 用戶密碼
    • 用戶ID
    • 遠程IP或瀏覽器
    • 生存時間(與befo完全相同重新)
    • 也許一個預定義的字符串或鹽

加入它成一個字符串(例如13413:1826271762:b026324c6904b2a9cb4b88d6d61c81d1),並將其存儲到像USERID的cookie。

在每次請求需要:

  • 檢查指定的時間是有效的(比目前更低)從數據庫
  • 負載用戶,通過指定ID
  • 驗證散列簽名(對當前的遠程IP /瀏覽器和當前密碼)
+0

感謝您的回覆。問題是,如果cookie是預定義的(根本不是隨機的),黑客可以在將來使用它一次。 如果我將隨機字符串添加到cookie的值並將其存儲在datastore/memcache中並使用key = userID並在註銷後清除它,該怎麼辦? – Sergey 2012-02-09 10:18:14

+0

是的,這是個好主意。因此,您可以在散列中使用它,作爲鹽 – 2012-02-09 10:37:38

3

我會建議使用內置的Java會話對象HttpSession,其中GAE/J有支持。 Look here有關如何在GAE上啓用會話的文檔。

您可以將會話設置爲在某段時間後過期,或者可以在其中存儲數字並從外部驗證會話。

2

我同意裏克,容器設計人員做了驗證請求是否來自同一用戶,你不想要t o重新發明輪子嗎?

HttpSession session = request.getSession(); 

這將創建一個新的會話,如果沒有已經存在,但如果這樣做,將讓你現有的會話。

session.setAttribute('key', value); 

值可以是任何可串行化的POJO,鍵是一個字符串。 您可以通過以下代碼檢索您應用程序範圍內的存儲值。

Object value = (Object) session.getAttribute('key'); 

有關如何使用會話的更多信息,請檢查HttpSessions的Java規範。

+0

我的應用程序在GoogleAppEngine上運行,並且我處理多個JVM。反過來,會話信息僅限於當前的Web應用程序(ServletContext)。每個Java虛擬機的每個「Web應用程序」都有一個上下文。 – Sergey 2012-02-12 22:24:24

+3

在AppEngine中,會話由數據存儲支持,因此即使用戶在請求之間碰到不同的實例,它們仍然在請求中保持不變。 – 2012-02-18 05:33:44

+0

隨着「最終一致性」的警告。這是我試圖在我沒有多少運氣創建的應用程序中圍繞我的頭。如果您創建會話,然後用戶立即切換到另一個沒有會話的實例(尚未),那麼您會做什麼? – 2014-05-16 18:21:34