2015-01-07 179 views
0

所以我一直在閱讀會議,我不得不說,我很困惑。 看來,會議是'破碎',可能是安全明智的,爲什麼他們沒有執行更多的安全檢查會議代碼本身...PHP會話安全檢查

無論如何,我的問題。我發現這個網站有很多會話安全檢查:https://wblinks.com/notes/secure-session-management-tips/通讀它,其中大部分對我而言是有意義的。然而,最令我困惑的是WHEN也稱這些檢查。

我會在頁面上調用這些檢查嗎?一方面這是有道理的,因爲有人可以在每一頁上劫持一個會話或其他的東西,對嗎?另一方面,在每個頁面上完成這些檢查需要花費一些額外的時間,否則可能會增加加載時間?


在這一刻我有以下代碼。

<?php 

if ($_SESSION['_USER_LOOSE_IP'] != long2ip(ip2long($_SERVER['REMOTE_ADDR']) & ip2long("255.255.0.0")) 
    || $_SESSION['_USER_AGENT'] != $_SERVER['HTTP_USER_AGENT'] 
    || $_SESSION['_USER_ACCEPT'] != $_SERVER['HTTP_ACCEPT'] 
    || $_SESSION['_USER_ACCEPT_ENCODING'] != $_SERVER['HTTP_ACCEPT_ENCODING'] 
    || $_SESSION['_USER_ACCEPT_LANG'] != $_SERVER['HTTP_ACCEPT_LANGUAGE'] 
    || $_SESSION['_USER_ACCEPT_CHARSET'] != $_SERVER['HTTP_ACCEPT_CHARSET'] 
    || !isset($_SESSION['MY_SERVER_GENERATED_THIS_SESSION'])) { 


    // Destroy and start a new session 
    sec_session_destroy(); // Destroy session on disk 
    sec_session_start(); 

    // Log for attention of admin and re-authenticate user... 
} 

if ($_SESSION['SESSION_START_TIME'] < (strtotime("-1 hour")) || $_SESSION['_USER_LAST_ACTIVITY'] < (strtotime("-20 mins"))) { 
    sec_session_destroy(); 
    //Expire session and re-authenticate user... 
} 

function sec_session_start() { 
    setcookie("sid",   // Name 
      session_id(),   // Value 
      strtotime("+1 hour"), // Expiry 
      "/",     // Path 
      ".serellyn.net",  // Domain 
      true,     // HTTPS Only 
      true);    // HTTP Only 

    // Store these values into the session so I can check on subsequent requests. 
    $_SESSION['_USER_AGENT']   = $_SERVER['HTTP_USER_AGENT']; 
    $_SESSION['_USER_ACCEPT']   = $_SERVER['HTTP_ACCEPT']; 
    $_SESSION['_USER_ACCEPT_ENCODING'] = $_SERVER['HTTP_ACCEPT_ENCODING']; 
    $_SESSION['_USER_ACCEPT_LANG']  = $_SERVER['HTTP_ACCEPT_LANGUAGE']; 
    $_SESSION['_USER_ACCEPT_CHARSET'] = $_SERVER['HTTP_ACCEPT_CHARSET']; 
    $_SESSION['MY_SERVER_GENERATED_THIS_SESSION'] = true; 

    // Only use the first two blocks of the IP (loose IP check). Use a 
    // netmask of 255.255.0.0 to get the first two blocks only. 
    $_SESSION['_USER_LOOSE_IP'] = long2ip(ip2long($_SERVER['REMOTE_ADDR']) 
              & ip2long("255.255.0.0")); 

    $_SESSION['SESSION_START_TIME'] = time(); 
    $_SESSION['_USER_LAST_ACTIVITY'] = time(); 

    sec_session_start();   // Start the PHP session 
} 

function sec_session_destroy() { 
    session_unset(); 
    session_destroy(); 
    session_start(); 
    session_regenerate_id(true); 
} 

我最後的問題是,上面的代碼是否有意義,或者你有任何建議,使其更好或更少混淆。我應該在每個頁面上還是僅包含幾頁?

在此先感謝

+0

「看起來會話像'破壞'一樣可能是安全明智的」嗯?這就好像在說「看起來汽車像'危險'一樣可能是安全明智的」 – PeeHaa

+0

還要注意,以上大部分已經在正確設置會話並僅使用加密連接時處理完畢。 – PeeHaa

+0

另請注意,ip檢查將在ipv6地址上失敗。 – PeeHaa

回答

1

爲什麼他們不落實在會議代碼本身更多的安全檢查...

通常的「會話」模式是會話ID是強祕密,任何泄露該ID的內容都將被視爲漏洞。

此處列出的其他標頭不是祕密,並且在很多可能導致會話ID泄漏的相同場景中可能是可以僞造的。所以檢查他們是沒有明確的好處;這樣做只是部分緩解會話劫持漏洞。在另一邊也有顯著兼容性缺點:

$ _SESSION [ '_ USER_AGENT'] = $ _ SERVER [ 'HTTP_USER_AGENT']如果瀏覽器升級發生在一個會話中

用戶代理可以改變,或者在某些情況下用戶無需重新啓動即可安裝或升級瀏覽器插件/擴展程序。

$ _SESSION [ '_ USER_ACCEPT']!= $ _ SERVER [ 'HTTP_ACCEPT']

Accept頭將取決於它期待什麼樣的資源的改變,所以如果你做類似服務來自PHP的圖像將會中斷。

($ _SESSION [ '_ USER_LOOSE_IP']!= long2ip(ip2long($ _ SERVER [ 'REMOTE_ADDR'])& ip2long( 「255.255.0.0」))

這是一個比一個確切的更好IP匹配,但仍然會讓一個移動用戶從一個電信公司或WiFi網絡切換到另一個電信公司。

您當然可以將這些頭文件中的更改用作啓發式方法,例如,以決定是否要求對特定敏感操作進行重新認證,或者通常需要進行風險評級事務。但是當它們中的任何一個發生改變時立即中斷會使一些用戶對你的網站的使用體驗變得更糟。

這是一個權衡,每個應用程序可能需要一種不同的方法,可能需要將其與應用程序使用的特定知識聯繫起來。因此,會話的大多數實現不會'默認情況下不能真正做到這一點。

+0

感謝您的意見。 – Serellyn