2016-04-21 214 views
2

我學習PHP中使用傳統的ASP自2001年以來PHP會話安全 - 金絲雀會議

我是來工作如何確保我的工作網站的管理部分後點,和一直在閱讀這裏:

https://paragonie.com/blog/2015/04/fast-track-safe-and-secure-php-sessions

我已經看到了似乎是綁定一個會話的IP地址是不好的做法 - 例如,

檢查是否匹配$_SERVER['REMOTE_ADDR']$_SESSION['ip']

由於從鏈接採取以上:

一些系統喜歡會話綁定到特定的IP地址。這通常不被推薦;特別是Tor用戶將難以保持認證。您也可以在這裏強制執行此限制。

session_start(); 

// Make sure we have a canary set 
if (!isset($_SESSION['canary'])) { 
    session_regenerate_id(true); 
    $_SESSION['canary'] = [ 
     'birth' => time(), 
     'IP' => $_SERVER['REMOTE_ADDR'] 
    ]; 
} 
if ($_SESSION['canary']['IP'] !== $_SERVER['REMOTE_ADDR'])) { 
    session_regenerate_id(true); 
    // Delete everything: 
    foreach (array_keys($_SESSION) as $key) { 
     unset($_SESSION[$key]); 
    } 
    $_SESSION['canary'] = [ 
     'birth' => time(), 
     'IP' => $_SERVER['REMOTE_ADDR'] 
    ]; 
} 
// Regenerate session ID every five minutes: 
if ($_SESSION['canary']['birth'] < time() - 300) { 
    session_regenerate_id(true); 
    $_SESSION['canary']['birth'] = time(); 
} 

我不能工作這一個 - 的博客文章說,這是錯誤的會話綁定到一個IP地址,然後張貼代碼展示瞭如何做到這一點?

或者他們使用的「canary」會話代碼實際上並沒有將會話綁定到IP地址?

假設代碼沒有將會話綁定到IP地址,並且使用它會是一個很好的做法,那麼我對如何使用這個金絲雀會話感到困惑 - 我會把這一點我的登錄頁面,一旦用戶成功登錄:

// Make sure we have a canary set 
if (!isset($_SESSION['canary'])) { 
    session_regenerate_id(true); 
    $_SESSION['canary'] = [ 
     'birth' => time(), 
     'IP' => $_SERVER['REMOTE_ADDR'] 
    ]; 
} 

// set my own session variable as well 
if (!isset($_SESSION['name'])) { 
    $_SESSION['name'] = $name; // $name = value from database 
    header('Location:admin-home.php'); 
    exit; 
} 

然後把這些位在任何頁面的頂部這是用戶的保護:

session_start(); 

// #################################################################################################### 
// Is User Logged In? 
// #################################################################################################### 

$name = $_SESSION['name']; 

if (!isset($name)) { 
    header('Location:login.php'); 
    exit;  
} 

// #################################################################################################### 
// Canary Session? 
// https://paragonie.com/blog/2015/04/fast-track-safe-and-secure-php-sessions 
// #################################################################################################### 

if ($_SESSION['canary']['IP'] !== $_SERVER['REMOTE_ADDR']) { 
    session_regenerate_id(true); 
    // Delete everything: 
    foreach (array_keys($_SESSION) as $key) { 
     unset($_SESSION[$key]); 
    } 
    $_SESSION['canary'] = [ 
     'birth' => time(), 
     'IP' => $_SERVER['REMOTE_ADDR'] 
    ]; 
} 

// Regenerate session ID every five minutes: 
if ($_SESSION['canary']['birth'] < time() - 300) { 
    session_regenerate_id(true); 
    $_SESSION['canary']['birth'] = time(); 
} 

我也將使用HTTPS的登錄和管理頁面。

+2

將會話綁定到IP沒有任何作用,因爲在同一個IP後面可能有多個人,或者使用您的站點的人可能在每個請求上擁有不同的IP(連接中斷,他們重新連接到他們的ISP並接收新的IP)。我建議將會話處理包裝在一個類中,這樣它更具可讀性和可維護性。不要綁定到IP。您可以使用PHP的內置會話機制,但也有其他選擇(老實說,PHP的內置機制並不是最好的),您可以探索流行的PHP框架,甚至使用他們的會話處理代碼。 – Mjh

+0

感謝@Mjh的建議。我不是一個合適的程序員或編碼員。我試圖運用有限的智能理解類和框架,並迅速意識到自己的侷限性,因此走下了程序化的路線。 – 4532066

+0

*使用您的網站的人可以在每個請求上擁有不同的IP * ... AOL是臭名昭着的 - 特別是如果您嘗試在子域之間維護會話。 @Mjh – CD001

回答

0

PHP處理會話的方式是爲每個用戶生成一個唯一的會話ID,並將其存儲在cookie(默認名稱PHPSESSID)中。這適用於IP更改,並在同一臺計算機上的不同瀏覽器上提供不同的會話。

爲了提供更高的安全性,您還可以在會話中保存用戶ip和用戶代理,並檢查每個請求。我不確定PHP是否默認這樣做,但實現它會相當簡單。

您還可以在着名框架(Laravel,Symfony,...)上查看會話實現,瞭解它們是如何實現的。我把它留給你進一步調查主題,因爲它應該是一個谷歌搜索和閱讀源代碼。