gpt4 book ai didi

PHP session 安全 - 金丝雀 session

转载 作者:搜寻专家 更新时间:2023-10-31 21:53:23 26 4
gpt4 key购买 nike

我从 2001 年开始使用 Classic ASP 后开始学习 PHP。

我已经到了研究如何保护我正在工作的网站的管理部分的地步,并且一直在阅读这里:

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

我已经看到将 session 绑定(bind)到 IP 地址似乎是一种不好的做法 - 例如

Check if the $_SERVER['REMOTE_ADDR'] matches $_SESSION['ip']

取自上面的链接:

Some systems like to bind a session to a particular IP address. This is not generally recommended; Tor users, in particular, will have difficulty staying authenticated. You can enforce this restriction here too.

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();
}

我无法解决这个问题 - 博客文章是否说将 session 绑定(bind)到 IP 地址是错误的,然后发布代码展示了如何做到这一点?

或者他们使用的“金丝雀” session 代码实际上并未将 session 绑定(bind)到 IP 地址?

假设代码没有将 session 绑定(bind)到 IP 地址,并且使用它是一种很好的做法,那么我对如何使用这个金丝雀 session 有点困惑——我会把这个放在我的登录页面,一旦用户成功登录:

// 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。

最佳答案

PHP 处理 session 的方式是为每个用户生成一个唯一的 session ID,并将其存储在一个 cookie 中(默认名称为 PHPSESSID)。这适用于 IP 更改,并在同一台机器上的不同浏览器上提供不同的 session 。

为了提供更高的安全性,您还可以在 session 中保存用户 ip 和用户代理,并在每次请求时进行检查。我不确定 PHP 是否默认执行此操作,但实现它会相当简单。

您还可以在著名框架(Laravel、Symfony 等)上寻找 session 实现,看看它们是如何实现的。我留给您进一步研究主题,因为它应该是一些谷歌搜索和阅读源代码。

关于PHP session 安全 - 金丝雀 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36765612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com