2011-08-21 219 views
2

我正在做一些研究,在計算器上關於如何正確設置會話和阻止劫持等我找到了答案,有人張貼在的問題之一,他提供了下面的代碼:PHP會話安全問題

因爲當用戶登錄和用戶名和密碼匹配

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] .''. $_SERVER['REMOTE_ADDR']); 

如果用戶已登錄,對受保護的頁面檢查:

if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] .''. $_SERVER['REMOTE_ADDR'])) {  
     session_destroy(); 
     header('Location: login.php'); 
     exit();  
    } 

這似乎很好地工作,但我的問題是:有多安全這一點,這是一個很好的方法,或者我應該試試別的?該帖子沒有upvotes或任何東西,所以不知道它是否好。

而且,不知道如何獲取有關該會話的用戶信息...我需要在數據庫中存儲什麼嗎?

謝謝!

+0

使用IP地址有它自己的問題。動態IP通常可以改變。如果您需要安全的解決方案,那麼我認爲使用HTTPS更好。 – Karolis

回答

3

此代碼有兩個主要問題。

1)IP地址更改正當理由。如果客戶端位於負載均衡器之後,就像公司網絡一樣,那麼他將無法使用您的Web應用程序。

2)檢查用戶劑是像具有一個get變量說?is_hacker=false了很多。如果黑客擁有會話ID,那麼他有用戶代理和它的微不足道的惡搞。

進一步我不知道你爲什麼會想這樣做一個純文本的比較時使用MD5這實際上是更安全的。因爲用戶代理是第一個攻擊者可以使用md5前綴攻擊產生衝突,並在那裏繞過REMOTE_ADDR檢查。 (A有用的MD5碰撞攻擊不上來過於頻繁,但是這一個很有趣!)

即使該檢查到位CSRF和XSS仍然可以用來影響該會話。 XSS可用於讀取CSRF令牌,然後使用XHR發出攻擊者希望的任何請求。有人可能會認爲這是爲了減輕OWASP a9,但確實需要使用SSL來保護會話ID。

+1

後一項不一定爲真:會話ID可能是從受害者在沒有用戶代理ID的情況下發布的URL獲得的。 CSRF攻擊不依賴於會話,也可能發生在其他身份驗證技術上。 – Gumbo

+0

@ Gumbo♦對於一個他使用$ _SESSION的人,所以在某個地方有一個會話ID。默認情況下,php對sessoin id使用cookie,但不能保證他使用的是默認值。除此之外,用戶代理也比密碼更容易暴力破解。如果它的鉻,那麼它將永遠是最新版本,等等。 – rook

+0

@ Gumbo♦另外,我正在與一家美國主要公司的客戶服務部門交談,他們爲我打印了一些信息。頁面底部是URL,因爲它是從瀏覽器打印的,其中包括jsessionid。談論一個糟糕的應用程序設計。 – rook

0

這看起來像一個很好的方法,但是指紋哈希是由客戶端數據生成的,這可能是欺騙性的。用於登錄表單的一個好方法是生成隨機令牌,該令牌存儲在會話中並通過表單傳遞。一旦令牌被驗證(或不),它應該是未設置的一次性使用而已。

一旦用戶登錄,會話還應該存儲用戶ID,以檢索存儲在數據庫中的用戶信息。

+0

您正在討論CSRF保護的常用方法。你正在比較蘋果和橘子。 – rook

0

我同意Rook的評論,這是對你的代碼的很好的分析。

有很多事情要考慮,以確保PHP會話,但與最新版本的PHP這並不難實現,有些事情要考慮: - 會話文件存儲在您的服務器(主要是一個問題,如果它是共享服務器) - 在客戶端之間使用所有敏感數據和cookie的安全連接&服務器 - 盡你所能在客戶端安全地創建cookie會話ID - 不在會話變量中存儲任何敏感數據

至於存儲在數據庫中的東西取決於您的需求,但我會說你可能不需要它並在會話中存儲數據變量對安全性來說很好,就像我已經說過的那樣,不要在那裏存儲任何敏感內容。從其他位置檢索敏感數據,最有可能是數據庫。

如果您需要了解更多關於PHP session security I've got a series of blog posts on the subject