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

时间:2012-05-29 18:00:45

标签: php security session session-hijacking

我正在试图弄清楚如何防止会话劫持。这就是我在想的事情:

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

<?php

$userIp = $_SESSION['userIp'];
$userAgent = $_SESSION['userAgent'];

if ($userIp != $_SERVER['REMOTE_ADDR'] || $userAgent != $_SERVER['HTTP_USER_AGENT'] {
    session_destroy();
}

?>

感谢。

2 个答案:

答案 0 :(得分:12)

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

如果你绝对需要对IP做一些事情,那么你可以做的最多但没有得到太多的误报就是检查原始国家/地区。如果您发现一个来自加拿大的登录和另一个来自印度的登录,则可能存在问题。即使这样,它也不是万无一失的。

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

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

编辑:如果您在会话后面保护的数据非常敏感,并且您的用户需要了解它,您可以随时向他们展示其他会话登录为他们的用户。例如,GMail也做了同样的事情。

答案 1 :(得分:1)

我同意z42

每当用户成功登录到您的网站时,我也想建议一种方法 您可以生成一个SALT并将其存储在会话和数据库中,并创建条件 检查用户是否已经记录,这样就不能防止多个用户多次使用同一个帐户登录,并在用户登出时从db中销毁SALT。