2010-06-04 27 views
22

我使用gwt創建網站。這個問題是關於登錄頁面和cookie來保存登錄信息。 GWT允許您在單個網頁中創建一個網站。關於GWT,Cookies和網頁指導的問題

我的應用程序在一個網頁上運行。我的應用程序設置爲,有一個登錄框,其中包含登錄按鈕,如果詳細信息正確,它將加載底層用戶界面並刪除登錄框。

這意味着每次刷新我的頁面時,應用程序都會將我帶到登錄頁面。無論如何,要設置一個cookie來保存用戶的信息,例如一天,這將輸入詳細信息到登錄框並自動登錄,

此外,web應用程序內的註銷按鈕將刪除信息在Cookie中並將您帶到登錄頁面(刪除cookie信息並將您引導至網頁的登錄部分)。

還是會有不同的方法。

回答

62

我說你幾乎得到它的權利。d以下是我如何處理登錄/註銷在我的應用程序:

  1. 用戶加載頁面 - 如果他的cookie設置爲令牌(請參閱下面的更多信息),將該令牌發送到服務器以檢查它是否仍然有效。如果它是有效的,那麼您已登錄,請轉到第5點。請參閱下面有關如何處理無效令牌的說明。
  2. 用戶輸入用戶/合格組合。這些信息被髮送到服務器(最好通過加密連接發送,但使用GWT很難實現 - 例如,請參見this question)。
  3. 服務器檢查用戶/ 密碼哈希(見下文)的組合是否與數據庫中的內容匹配/無論如何。如果是這樣,它會生成一個令牌(只是一些隨機的,相當長的字符串,如UUID)並將其發送回客戶端。
  4. 如果用戶在登錄過程中選中了「記住我」複選框,則將令牌存儲在具有將來到期日期的cookie中(請參閱其他指南/有關建議時間段的問題)。
  5. 當客戶端收到令牌時,應該將其用於對服務器的請求,您只希望經過驗證的用戶執行該請求。在那裏,服務器會檢查令牌是否有效(您必須跟蹤數據庫中的令牌/用戶對),如果是,則授權交易/無論如何。 這裏有一個問題:如果你依賴於只有在cookie上,你將容易受到a XSRF attack的影響。這就是爲什麼您還應該傳遞令牌(cookie會自動傳輸 - 這就是爲什麼可能發生XSRF攻擊的原因)作爲請求的一部分(您知道,例如JSON中的附加字段或通過GWT發送的POJO中的字段) RPC或甚至HTTP頭)。
  6. 在顯式註銷(單擊「註銷」鏈接等)時,向該用戶剛剛註銷的服務器發送信息。然後服務器應該刪除/使令牌無效。無論「記住我」選項,它都應該這樣做 - 因爲顯式註銷意味着用戶想要刪除該PC /瀏覽器上的登錄信息並防止他人以他/她的身份登錄。如果用戶只是關閉了瀏覽器/頁面,並且您已經在第4點正確設置了cookie(也就是說,它不會在瀏覽器關閉時過期 - 只有在選擇「記住我」選項時),在下次訪問時用戶應該得到自動登錄到在點1

一些附加說明

  • 這是非常重要的:記得要檢查在服務器端,如果通過cookie通過令牌相當於一作爲請求/有效載荷的一部分傳遞。
  • 不要將密碼存儲爲數據庫中的純文本密碼。使用BCrypt以獲得最大的安全性。這就是爲什麼我寫道,你應該比較密碼哈希,而不是實際的密碼。
  • 當服務器遇到無效令牌時,這可能意味着許多事情 - 從正常到警報。一般來說,記錄這些情況並定期檢查日誌是否有任何異常活動是很好的做法。
    1. 用戶沒有訪問該網站的looong時間和令牌過期。請確保在客戶端正確處理令牌過期(cookie上的正確過期日期應導致用戶被重定向到登錄頁面,而不會發送過期的令牌)和服務器端(一種特殊任務,每天掃描令牌列表並刪除?已過期)
    2. 也許你已經把令牌驗證一些其他限制 - 如令牌不能過期當前必須嘗試從作爲一個令牌原本已經產生相同的IP對於。
    3. 發送請求當它來到畸形有一個錯誤/損壞 - 不能做這個,而是將用戶重定向到登錄頁面
    4. 第三方試圖登錄使用手工製作的令牌。如果你使用愚蠢的簡單猜測令牌(比如根據用戶名,rot13,自己的超級特殊真棒「加密」等),那麼你遲早會被咬傷。 UUID是一個很好的令牌候選者的例子 - 顧名思義,它是一個通用唯一的標識符 - 意味着沒有兩個用戶應該有相同的UUID,並且UUID本身是隨機的和長的。

安全的AJAX應用是嚴重的企業 - 我已經看到了也很簡單許多Web應用程序利用的安全漏洞...請確保您瞭解完全什麼以及爲什麼這樣做。如果您有任何問題,請不要猶豫,問:)


更新2015年6月12日:GWT - Security RPC XSRF

+2

這個答案也幫助了我,因爲它給了我見識到日誌中安全地,歡呼igor – molleman 2010-06-04 18:23:42

+7

+1這個答案比安全FAQ更有啓發性。如果你可以發佈關於這個的博客,我會非常高興,也許有一些示例代碼:-)。 – helpermethod 2011-04-09 20:44:05

+1

你應該在你的博客中寫下它(也許有一些示例代碼)。將是會議的最終參考:-)。 – helpermethod 2011-05-01 14:08:46

4

Here你可以在GWT中找到一些關於登錄安全的信息。還有關於如何使用cookies來記住用戶已經登錄一節

+0

謝謝這正好派上了用場 – molleman 2010-06-04 18:22:31

1

這裏是我都挺過來了(完全implementation)最佳鏈接。完整的登錄週期並保留一個cookie(sessionId)。

這將是更好,如果你有一個名爲選項「Remember me

Session Management in GWT