22

我锁定了IP地址。

这是否意味着用户只能使用相同的IP地址登录?或者用户是否会注销并必须重新登录才能获得新会话?

if (isset($_SESSION['last_ip']) === false) {
    $_SESSION['last_ip'] = $_SERVER['REMOTE_ADDR']; 
}

if ($_SESSION['last_ip'] != $_SERVER['REMOTE_ADDR']){
    session_unset();
    session_destroy();  
}
4

3 回答 3

13

如果用户的 IP 地址发生更改,此代码将删除会话(注销)。

因此,用户可以从任何 IP 地址登录,但如果它更改将被注销。

这可以防止会话劫持,但如果您使用动态 IP,则效果不佳,因为您的 IP 会不断变化。

于 2013-04-09T10:04:45.943 回答
9

确实如此。如果用户的 IP 发生变化,他将被注销。虽然如果攻击者知道 IP,他仍然可以模仿它,但它并不完全安全。查看这些页面以获取有关如何防止会话劫持的更多信息:

我也强烈推荐 Chris Shiflett。他关于会话劫持的文章可以在这里找到:

http://shiflett.org/articles/session-hijacking

于 2013-04-09T10:06:43.090 回答
1
if (isset($_SESSION['last_ip']) === false) {
    $_SESSION['last_ip'] = $_SERVER['REMOTE_ADDR']; 
}

上面的代码意味着如果会话“last_ip”尚未创建,它将被创建并存储用户当前 ip 的值。

if ($_SESSION['last_ip'] != $_SERVER['REMOTE_ADDR']){
    session_unset();
    session_destroy();  
}

上面的代码表示如果“last_ip”的会话值不等于您当前的ip,它将释放所有会话变量(session_unset)并销毁所有注册到会话(session_destroy)的数据。

让我们描述一下真实的场景。

例如,我访问您的网站,因此第一个代码块存储了我当前的 ip。现在我的互联网断开了,我重新连接到我的 isp,它启用了 dhcp 并为我提供了新的 ip。因此,如果再次访问您的网站,第二个代码块会检查我是否拥有不同的 IP,以便将我注销。

还要编辑你的第二个代码块,这样如果会话“last_ip”还没有创建,它就不会抛出 php 通知。

if (isset($_SESSION['last_ip']) && $_SESSION['last_ip'] != $_SERVER['REMOTE_ADDR']){
    session_unset();
    session_destroy();  
}
于 2016-01-27T06:28:55.263 回答