2010-01-06 137 views
13

我正在爲我正在構建的網站編寫登錄系統。
這裏是我如何實現登錄系統的本質:如何實現Web應用程序的登錄系統?

我有兩個表:用戶和會話。

users: uid | uname | pass 
sessions: sid | uid | ts | ts_expires 

所以用戶輸入uname/pass組合。

  • 如果組合不正確,我重定向到「不良認證」頁面。
  • 如果組合是正確的,I:
    • 生成隨機的sessionid(sid
    • 插入記錄sessions與提供的用戶名的UID該SID相關聯。
    • 設置一個名爲sid的cookie,其中隨機sid的值剛剛插入sessions

在需要用戶對每個頁面進行登錄,我檢查:餅乾

  • 是否設置
  • 如果SID是有效

所以我的問題是:

  • 這個機制有什麼潛在的問題?
  • 良好的登錄系統應該如何實施?

PS:我還沒有使用SSL安全登錄。所以這是我現在發現的唯一問題。哦,我使用PHP和MySQL,如果這是相關的。


編輯:我存儲的密碼不是以純文本格式,而是以用戶名與密碼連接的MD5存儲的。

那麼,pass = MD5($uname.$pass),可以這麼說。

+0

MD5可能容易受到暴力破解。爲了更好的安全性,可以使用不同的鹽進行多次散列。使用用戶名進行醃製並不是一個好主意,因爲這是一個潛在的黑客知道的價值。 – 2010-01-06 18:02:21

+0

所以你說我應該用隨機鹽進行哈希計算,並將salt與用戶表中的uname/pass一起存儲,是嗎? – jrharshath 2010-01-06 18:11:32

+0

正確。鹽也可以是明文。 – Malfist 2010-01-06 18:26:07

回答

18

哈希密碼,用鹽!使用像bcrypt這樣的強大散列。如果您必須使用MD5/SHA,請使用稱爲拉伸的技術並對其進行哈希數千次哈希。用戶不會在乎是否需要一秒鐘來檢查他/她的密碼而不是1/1000,但是一個暴力破解者會。

錄製嘗試並防止蠻力嘗試。

一旦登錄,請謹慎存儲用戶憑據的存儲位置。您不希望他們更改它。

並使用SSL!

+1

+1記錄嘗試 – jrharshath 2010-01-06 17:58:28

+0

我還建議您在客戶端和服務器端手動編碼與RSA一起發送的所有數據,以增加安全性。你永遠不知道黑客會使用你的WoW物品屬性。 – 2010-01-06 18:25:45

1

通常會將密碼存儲爲實際密碼的單向哈希值,而不是將其存儲爲明文。你沒有說過,如果你這樣做,但沒有,如果沒有,就這樣做。

確保登錄有一個超時期限,所以它不會永遠持續。

確保cookie在註銷時被刪除。

不要忘記,用戶可能會從公共計算機登錄,並且將登錄憑據存儲爲cookie可能會導致後續用戶通過放棄的會話獲得訪問權限。

+1

w.r.t最後一點(公共計算機):我只能警告用戶不要在公用計算機上使用「記住我」功能,對嗎?我可以嘗試綁定sessionid到一個特定的IP,以便sid本身不會被盜用和濫用。 – jrharshath 2010-01-06 18:16:00

+0

當用戶從公共計算機登錄時,您可以做的並不是很多,除了強調在完成應用程序時顯式註銷應用程序,並在很短的時間後讓會話超時。當然,你也想禁用任何「記住我」功能。 – 2010-01-06 18:23:49

3

爲了減緩蠻力攻擊,在嘗試失敗後進行強制延遲;也就是說,如果有人給你提供了錯誤的密碼,請等待三秒鐘,然後用「密碼失敗」顯示下一個屏幕。

+0

可能會減慢我的網站? – jrharshath 2010-01-06 18:12:28

+2

不是。不是如果它是一個睡眠。它不會消耗時鐘週期,只會延遲網頁加載一個人。 – Malfist 2010-01-06 18:27:51

3

設計和實現一個安全,健壯,可用的登錄系統實際上很難在第一次嘗試時就正確實現。頁面上的頁面已經寫入了關於這個主題的文章 - 在這裏,這篇文章太過於寬泛,無法正確處理。

一個好的起點是www.owasp.org。然後聘請一位熟悉安全方面的工作人員,與一家安全公司簽約(如www.matasano.com,veracode.com或neohapsis.com - 我已與三家公司合作,三家都非常好) ,和/或在安全郵件列表上提問(例如securityfocus.com上列出的Web應用程序安全列表)。

+0

非常困難,同意。想想和解釋所有的意外事件幾乎是不可能的。 – 2010-01-06 18:11:44

相關問題