2014-03-02 55 views
2

我想完全基於cookie和sql db來驗證我的用戶。驗證系統 - 我的安全嗎?

我要做的就是:

1. Once they login, I generate a random string, create a hash from it, save it in the database along with the user id and his IP.

2. I send the hash to the user as cookie

3. Whenever he wants to access something, I verify if his cookie hash matches the one on the server and also if his IP matches. Of yes, he is valid or else, log him out.

4. (As pointed by Akhil) If he clears his browser cookies or anything does not match the information on the database, I clear all the rows with his username and log him out.

Note: I use a session cookie for storing the random hash, which again is generated using the timestamp, and as long as time doesn't repeat itself(I believe), its random in the corect way.

這是好嗎?我怎樣才能讓它變得更好?

+0

我建議不要重新發明輪子。除非你試圖改進現有的方法,否則你可能不會自己實現這一點。 –

+0

如果任何清除cookie或Cookie過期,會發生什麼情況?他將如何能夠登錄?你永遠不能在IP地址上進行中繼。你如何處理動態IP地址?我認爲保持密碼將是一個更簡單的方法 –

+0

「使用時間戳生成」似乎不是隨機的。如果字符串是真正隨機的,那麼散列隨機字符串看起來像是一個額外的,不必要的步驟。 –

回答

-1

一個不能說這是「壞」。但是在Web Development中,特別是在它的安全域相關性談判中。我建議你下載一個CodeIgniter(google瞭解更多信息)Session Class(獨立版本)並使用它。基本的想法和你的一樣,但是它是在這樣一個着名的PHP框架中開發的,因此它更加成熟。您也可以在該類中執行數據庫操作,因爲它允許將會話保存到數據庫。

2

您的方法只能確保用戶擁有您生成的隨機字符串並使用相同的外部IP地址。存在濫用這一系統的幾個方法:

  • 如果您的網站並沒有強制HTTPS然後使用不安全的公共WiFi網絡可能是在危險連接用戶:如果Wi-Fi網絡的其他用戶正在聽所有在網絡上發送數據包時,他可以攔截您的Cookie並將其用作您的合法用戶訪問網站。您的服務器將無法區分它們,因爲它們都使用相同的IP地址...(有一個Firefox擴展可用,使任何人都可以輕鬆攔截此登錄cookie:http://en.wikipedia.org/wiki/Firesheep

  • 該系統也更多一般容易在中間人攻擊(不HTTPS)盯人

  • 如果你的cookie被存儲在用戶電腦的硬盤也可能被其他用戶重複使用的。

因此,要回答你的問題,你的系統可以被視爲安全提供了一些條件:

  • 您執行在您的網站使用HTTPS(加密的HTTP連接應被拒絕)

  • 您的隨機字符串是真正隨機的(存在生成PHP隨機字符串的正確和錯誤的方式)

  • 您cookie有一個很短的到期時間,最好設置爲會話cookie。

你應該看看下面的相關問題提供有關做你想做的事情的正確方法的詳細信息:How to secure an authentication cookie without SSL

2
  1. 一旦登錄,我生成一個隨機字符串

請確保您使用密碼安全的方法來生成隨機字符串。請勿使用mt_rand使用諸如openssl_random_pseudo_bytes之類的東西。

從它創建一個散列,

請務必使用一個secure hashing algorithm(不MD5,和至少SHA-2)。

將它保存在數據庫中的用戶ID和他一起IP。

有一點要記住的是,一些互聯網連接共享IP地址,或者有時會改變客戶端IP地址(例如AOL或移動)。

  1. 我發送哈希給用戶每當他想要訪問的東西餅乾3,我確認如果他的Cookie哈希值相匹配的服務器上的之一,也是,如果他的IP相匹配。是的,他是有效的,否則,註銷他。

這聽起來像是一個很好的做法,它本身沒有缺陷。我會實現一個會話超時機制。例如,將上次在數據庫中使用的日期存儲爲滑動到期,並且查詢將只查詢尚未過期的記錄。您可以運行後臺進程來清除舊的過期記錄。

另外,使用HTTPS並在Cookie上設置SecureHttpOnly標誌。這將防止他們通過HTTP泄漏,但我不會像在系統上禁用HTTP一樣遠,因爲如果攻擊者無論如何都有解決方法。

我不會擔心cookie被另一個用戶在同一臺​​機器上盜取。如果cookie可以以這種方式被竊取,那麼用戶的機器可能會被破壞,並且您無法讓系統保護超出您的控制範圍的數據。但是,您可以定期更新令牌(隨機字符串),爲用戶提供滾動cookie。您必須確保只有一個用戶可以在同一個帳戶下同時登錄,但這樣做很有效。