PHP 检查用户代理和 IP 以防止会话劫持


PHP Checking User Agent and IP To Prevent Session Hijacking

我正在尝试弄清楚如何防止会话劫持。这是我正在考虑做的事情:

除了用户 ID 会话,还要添加用户代理和用户 IP 会话。每次加载页面时,都会检查这些会话以查看它们是否匹配 - 这足够吗?例如:

<?php
$userIp = $_SESSION['userIp'];
$userAgent = $_SESSION['userAgent'];
if ($userIp != $_SERVER['REMOTE_ADDR'] || $userAgent != $_SERVER['HTTP_USER_AGENT'] {
    session_destroy();
}
?>

谢谢。

它比这复杂得多。您的网站/服务将由具有不同设置的各种人员访问。可能出错的第一件事是是否有人正在通过代理服务器。你的应用将看到的 IP 可能会更改,并且会话将为有效用户收支平衡。

如果绝对需要对 IP 执行某些操作,则最多可以检查原始国家/地区,而不会收到太多误报。如果您检测到一个来自加拿大的登录名和另一个来自印度的登录名,则可能存在问题。即便如此,它也不是万无一失的。

用户代理也太容易伪造了:如果我能得到某人的PHPSESSIONID,那么我肯定也可以得到他们的用户代理。因此,这里没有取得多少成就。

保护某人会话的最佳方法是将所有经过身份验证的内容放在HTTPS后面,并确保会话cookie仅HTTPS。

编辑:如果涉及到您在会话背后保护的数据非常敏感,并且您的用户需要注意这一点,您可以随时向他们显示为其用户登录的其他会话。例如,GMail也做了同样的事情。

我同意z42

另外,我想建议一种方法,每次用户成功登录您的网站时您可以生成 SALT 并将其存储在会话和数据库中,并制定条件检查用户是否已登录,因此您无法阻止多个用户多次使用同一帐户登录,并在用户注销时销毁数据库中的 SALT。