我學習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的登錄和管理頁面。
將會話綁定到IP沒有任何作用,因爲在同一個IP後面可能有多個人,或者使用您的站點的人可能在每個請求上擁有不同的IP(連接中斷,他們重新連接到他們的ISP並接收新的IP)。我建議將會話處理包裝在一個類中,這樣它更具可讀性和可維護性。不要綁定到IP。您可以使用PHP的內置會話機制,但也有其他選擇(老實說,PHP的內置機制並不是最好的),您可以探索流行的PHP框架,甚至使用他們的會話處理代碼。 – Mjh
感謝@Mjh的建議。我不是一個合適的程序員或編碼員。我試圖運用有限的智能理解類和框架,並迅速意識到自己的侷限性,因此走下了程序化的路線。 – 4532066
*使用您的網站的人可以在每個請求上擁有不同的IP * ... AOL是臭名昭着的 - 特別是如果您嘗試在子域之間維護會話。 @Mjh – CD001