1

当用户登录当前会话时,设置了变量

$_SESSION['user']['timeout'] = time();
$_SESSION['user']['ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['user']['agent'] = $_SERVER['HTTP_USER_AGENT'];

在我的 common.php 页面(所有 php 页面都需要)中,我使用了以下脚本,每次用户处于活动状态时都会重置一个 15 分钟的计时器,此外还会检查 IP 地址并检查 user_agent,如果它们不匹配的话当他们第一次登录/第一次设置会话时,会话被取消,并且不活动长达 15 分钟,会话也被取消。

...我所做的是防止会话劫持的好方法,而且它是否安全,或者是否足够?如果没有,还能做什么?

if(!empty($_SESSION['user'])){  
    if ($_SESSION['user']['timeout'] + 15 * 60 < time()) {
        unset($_SESSION['user']); 
        } else {
        $_SESSION['user']['timeout'] = time();
        if($_SESSION['user']['ip'] != $_SERVER['REMOTE_ADDR']){
            unset($_SESSION['user']); 
        }
        if($_SESSION['user']['agent'] != $_SERVER['HTTP_USER_AGENT']){
            unset($_SESSION['user']); 
        }
    }
}
4

1 回答 1

0

通过 15 个缩影的限制,您可以确保如果会话被劫持,攻击者无法长时间使用它,而用户离开他/她的机器或关闭它(并且没有注销)。但是用户工作的时间和攻击者劫持了会话的时间呢?检查 ip 地址是个好主意,但它有一个小限制。而用户没有静态IP地址并且他/她已经从网络断开并重新连接。将为其分配一个新的 IP 地址。这种情况迫使他的会话过期,而他是有效用户。此外,这个技巧对于与有效用户位于同一个私有 LAN 中并且他们都位于具有公共 IP 地址的网关后面的攻击者没有任何作用。因为它们在您的服务器中都具有相同的 IP 地址(NAT 或网关的 IP 地址)。在我看来,你所做的很好。但最好使网站免受 XSS 和 CSRF 攻击。防止客户端中的 javascript 注入。如果防止任何此类攻击非常重要,那么还可以使用 ssl 来保护网络嗅探器的安全。

于 2012-11-12T23:35:52.000 回答