2011-08-26 123 views
0

這是我當前的會話管理:使用只有第3個部分IP地址的會話管理和安全

if(!isset($_SESSION["user"]["authenticated"]) || 
    !$_SESSION["user"]["authenticated"]) 
    redirect("login.php"); 

if($_SESSION["user"]["browserHash"] != md5($_SERVER["HTTP_USER_AGENT"])) 
    redirect("logout.php?err=browser_mismatch"); 

if($_SESSION["user"]["IPHash"] != md5($_SERVER["REMOTE_ADDR"])) 
    redirect("logout.php?err=ip_mismatch"); 

if(!isset($_SESSION["user"]["nonce"]) || 
    $_SESSION["user"]["nonce"] == $_COOKIE["SITE_nonce"]) 
{ 
    $nonce = md5(mt_rand() . time() . $_SERVER["REMOTE_ADDR"]); 
    $_SESSION["user"]["nonce"] = $nonce; 
    setcookie("SITE_nonce", $nonce, (60 * 15), "/path"); 
} 
else 
    redirect("logout.php?err=nonce_mismatch"); 

我知道改變IP問題的計劃。但我擔心的是攻擊者能夠嗅探標題等。那麼我不會受到保護吧?如果我是受害者網絡中的攻擊者,我只需在嗅探一個響應標頭後立即發出一個快速GET請求,然後我將得到重新生成的隨機數。有沒有真正的方法來防止這種情況?

如果不會太多,我也希望能夠洞悉我的方法。這怎麼能被規避?我錯過了什麼大事?

+2

如果您使用的是SSL,那麼您已脫身。如果沒有,總有辦法來嗅探登錄憑據,會話cookie或正常的cookie並使用它們僞造身份。你可以做的是在數據庫中存儲儘可能多的信息,並在每次請求完成時檢查它們。這可能包括瀏覽器,操作系統等。由於cookie與通常安裝在一臺PC上的瀏覽器綁定,因此您會識別更改並可能作出相應的反應。 – Sgoettschkes

回答

0

如果用戶在服務器端更新nonce後,但在用戶收到新cookie之前發出新請求,則重新創建nonce的方法將失敗。

例如,如果用戶在失敗的頁面加載後點擊F5或者他們在新窗口/選項卡中打開了大量鏈接,則會發生這種情況。

放棄IP檢查的想法。由於多種原因,IP地址可能會完全更改。例如,考慮負載均衡代理或移動用戶切換漫遊區域。

可以檢測到用戶代理更改,並且您可以要求輸入密碼,但讓他們重新登錄(並重新啓動他們在哪裏執行的操作)並不是非常方便用戶。

總而言之,您試圖通過基於cookie值的會話來防止會話被竊取。您需要使用SSL,所有其他選項在安全性方面做得很少。基於cookie的會話令牌是目前接受的用於管理會話的方法,並且認爲足夠安全。

此外,CSRF攻擊比會話劫持攻擊更爲危險,並且您不會用您的建議阻止這些攻擊。所以我的建議是:首先關注這個領域。

+0

我明白了。我從來沒有想過這種情況!我真的希望除SSL之外還有另一種實現會話劫持預防的方法,因爲我發現即使是「大」站點在他們的所有頁面中都不使用SSL。我已經在閱讀CSRF,我想我必須重做我的鏈接和表單,以包含「交易令牌或非交易」以及非常重要的交易來請求重新驗證。我從來沒有想過保護這些可以這麼辛苦!謝謝 –

0

爲防止嗅探標頭,您需要通過SSL/TLS保護連接。