2013-10-03 57 views
6

我試圖建立自己的安全PHP會話類,當時我真的在想什麼阻止某人模擬會話?PHP會話劫持及其方法

IE,爲什麼不上test.php的代碼

$_SESSION['logged_in'] = true; 

無法對index.php的地方工作

if($_SESSION['logged_in'] == True){ 
echo 'logged in'; 
} 

據我瞭解,這個方式是確保該會話通過將其鎖定到IP地址和用戶代理來生成安全ID,但是具體如何工作?

意思是說,如果我能猜到會話ID,我可以設置$ _SESSION ['logged_in'] = true並模擬登錄?我應該改變SESSION變量來檢查登錄到更安全的嗎?

對不起,我的問題,希望我做一些感覺......

+0

你在每個頁面上都有'session_start();'嗎? –

+1

你應該從OWASP那裏學習WebGoat課程,它們幫助你更好地理解事物,這是創建安全事物的必要條件.http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project – pduersteler

+1

更多課程[這裏 - 該死的易受攻擊的Web應用程序](http://www.dvwa.co.uk/) –

回答

7

首先,會話數據只存儲在服務器上,因此外部客戶端不能簡單地創建自己的會話數據並將其發送到服務器。

因此,它歸結爲實際猜測其他人的會話標識符並假設他們的身份;這是相當困難的,但並非不可能。在攻擊者可以利用受害者與服務器之間的網絡流量的情況下,阻止他們是完全不可能的。

有您可以採取一些東西,使事情更加安全,但:

  1. 使用SSL;另請參閱session.cookie_secure
  2. 從一個好的隨機源生成標識符,即在Linux機器上的/dev/urandom;另請參閱session.entropy_file
  3. 用戶登錄或退出時重新生成標識符;另請參閱session_regenerate_id()
  4. 使用HttpOnly cookie(並且僅cookie)來永久化會話標識符;另請參閱session.use_only_cookiessession.cookie_httponly
  5. 使用嚴格的會話;另請參閱session.use_strict_mode
  6. 在會話中保留用戶代理的計算散列並確保它不會改變,例如,:

    $_SESSION['_agent'] = sha1($_SERVER['HTTP_USER_AGENT']); 
    
  7. 儘量減少儘可能短會話的使用壽命,並採用了先進的"remember me" feature,因爲他們到期再生會議。

知道何時發生潛在劫持並在發生這種情況時採取適當措施也很重要。您需要跟蹤哪些會話屬於哪個用戶,以便在其中一個用戶被破壞時可以使其全部失效。

順便說一句,將會話鎖定到IP地址是棘手的;一些ISP會使用戶來自不同的地址,或者多個用戶來自同一個地址。無論哪種方式,跟蹤用戶代理可能會更好,因爲它不太可能改變。

+0

+1現在這是一個答案。 – samayo

+0

優秀的答案!謝謝:) – user2587774

+0

@ user2587774不客氣;如果它有助於回答你的問題,請考慮接受它作爲你的回答:) –

3

猜測會話ID是不會話劫持。 這比猜測密碼困難。 但是,如果有人確實獲得了會話ID,他們將獲得對該帳戶的完全訪問權限。

通過ID地址進行鎖定僅僅意味着您存儲了用戶在會話本身登錄時使用的原始IP地址,並在每個請求開始時檢查它是否未更改。 這樣,即使攻擊者獲得正確的會話ID,他們仍然無法使用它。

還有一個很好的維基百科article on the topic,以及相關的StackOverflow問題:1,2

+0

你知道'$ _SERVER'變量可能被欺騙。所以,你不能依靠'$ _SERVER ['REMOTE_ADDR']'進行認證,特別是在[動態IP](http://www.noip.com/blog/2012/05/24/what -is-a-dynamic-ip-address /)被廣泛使用。這意味着,用戶可能會被註銷,因爲服務器會動態更改IP。 – samayo

+0

$ _SERVER ['REMOTE_ADDR']'可以很容易地由客戶端進行更改,但不能輕易設置爲與另一個客戶端相同的任意值。 – Denis

+0

@Simon_eQ那麼如何欺騙'$ _SERVER ['REMOTE_ADDR']'? – Gumbo