2013-01-02 35 views
11

我正在編寫一個'記住我'裝備的登錄表單,到目前爲止我閱讀過的教程(部分是爲了確保我正確地做到了這一點)都表示將加密的密碼存儲在cookie以及用戶名。然後,每次PHP檢查當前用戶是否未登錄時,檢查他們的cookie並查找這些值。如果用戶名相匹配的密碼,你在。PHP「記住我」的安全漏洞?

對我來說,這是一個巨大的安全漏洞。如果有人要破解數據庫或以某種方式訪問​​加密密碼,他們甚至不需要破解它們。只需設置你自己的cookies並去。我是正確的,還是隻是偏執?

我的登錄系統使用會話跟蹤當前的用戶ID,並快速登錄/ 1/0註銷支票。用戶不能編輯會話AFAIK,所以這是安全的(如果不是,請讓我知道)。我正在考慮將會話ID存儲在cookie中,以便稍後恢復,但這也不安全。

我很在意我的用戶的安全,我如何能夠正確地保護自己的信息,同時仍保持正常運轉的網站?

+0

我不會存儲加密的密碼,只需將用戶標識存儲在X天內過期的cookie中。對於「敏感」領域(例如賬戶/檔案管理),如果他們沒有有效的$ _SESSION(他們在登錄時應該設置),則可以要求他們登錄。 – JennyDanger

+1

如果當前存儲會話ID的cookie如果存儲在「不安全」中? –

+0

@georgefox目前,我沒有存儲任何會話ID,我只是說這是記住我的功能的可能性。 – Scott

回答

11

通常,當服務器被請求記住用戶,它會發出正常會話cookie旁邊有一個額外的cookie,而這個新的字符串中包含的用戶名和隨機字符,這使得它難以猜測的合理費用。這顯然保存在數據庫中(出於安全原因,您可能希望將其當作密碼對待,並因此將其作爲哈希值加以散列),並且下次用戶使用同一瀏覽器進行連接時(假設舊會話已過期),應用程序將收到隨機字符串,檢查數據庫,如果有匹配的用戶進行身份驗證。

另一種方法是將會話到期時間提前一些。

這裏有什麼安全漏洞?假設您使用了一個好的隨機生成器,唯一可能發生的事情是用戶從共享瀏覽器訪問應用程序,並且在結束時不會手動註銷。

正常規則總是適用,因爲你是在一個不安全的通道:使用HTTPS,否則誰坐在你的計算機和服務器可以竊取cookie之間(無論是會話的一個或記得,我一個)和就像是你一樣。

Bonus, this must-read by Jeff Atwood

+0

這似乎是一個好方法,謝謝!此外,現在閱讀那個怪物登錄帖子! – Scott

-3

在我自己的網站,我發現要解決它根本就沒有記住密碼,用戶名只有最好的方式工作時,提供更快的登錄就不是一個不太安全的一個我也遇到過同樣的問題。事實是,沒有確定的防火方式來保證密碼絕對安全。除了新的瀏覽器之外,用戶還可以讓他們的瀏覽器記住它。

但如果你必須有一個保存的密碼,試試這個:

有多個cookie,2將是最容易的,並使用一個用於加密的密碼,而其他持有的加密密鑰。數據庫中的密碼將保存進一步的加密密碼,通過使用您存儲的加密密鑰獲得。當您準備好檢查密碼時,請提取值並加密密碼。

希望這有幫助。祝你好運!

編輯:我可能誤解了這一點,如果用戶仍然登錄,這是很好的做法來存儲會話變量。

+1

不要以任何方式保存密碼(可用於登錄的加密密碼仍是密碼)。只保存存儲在服務器上的密鑰。這些密鑰可以稍後撤銷,但加密的密碼在更改之前一直有效。 –

+0

這不一定是正確的,因爲可以設置到期日期;不過,我寧願不使用我的第二種方法。 – Zero

0

如果你想它的安全,不要讓你的用戶,讓他們登錄。

當設置會話時,請務必將ip地址綁定到會話ID,這樣如果有人取走稍後再進行會話,它只能從相同的IP地址完成。 喲可以通過保持一個數據庫(散列)會話ids +散列ipaddresses來做到這一點。 我使用phps函數http://php.net/manual/en/class.sessionhandler.php來設置會話處理程序並將會話與ipaddresses進行匹配。

+1

IP地址不打算用於安全性,您不能信任IP地址。正如你所指出的那樣,IP檢查仍然會讓壞人的生活變得更加艱難。 –

2

從不以任何方式保存密碼(可用於登錄的加密密碼仍是密碼)在客戶端。

使用隨機生成的密鑰,安全地存儲在服務器上。這些密鑰可以在稍後被撤銷,而不像加密的密碼,直到更改纔有效。

使用PHP,你可以生成像這樣的隨機密鑰md5(uniqid(mt_rand(), true))。爲了更好的安全存儲,它在db中被醃製和散列。

示例表:

login_keys (
    user_id int, 
    key char(40), # sha1 
    salt char(15) 
) 

另外請注意,你應該讓HTTP cookie的唯一選擇