PHP锁定IP地址

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();  
}
3个回答

13

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

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

这可以防止会话劫持,但是如果您使用动态IP,则不会很好地工作,因为您的IP地址将不断更改。


如果会话被删除,用户是否可以在登录时从新的IP获取新的会话? - chien pin wang
我已经添加了session_regenerate_id(true);,那么这两个如何一起工作? - chien pin wang
3
session_regenerate 会为用户生成一个新的 session_id。会话通过 session_id 进行标识,用户将其作为cookie发送。 当您重新生成会话时,您告诉用户从现在开始发送不同的 session_id。 会话数据将保持不变,除了一些边缘情况,这是相当透明的(即用户不会注意到)。 - Halcyon

9
它确实会。如果用户的IP地址发生更改,他将被注销。尽管攻击者仍然可以模仿IP地址,但这并不完全安全。请参阅以下页面以获取有关如何防止会话劫持的更多信息: 我还强烈推荐克里斯·希夫莱特(Chris Shiflett)。他关于会话劫持的文章可以在此处找到:

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


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。现在我的互联网断开连接并重新连接到启用DHCP的ISP,给我分配了新的IP。因此,如果再次访问您的网站,第二段代码将检查我是否具有不同的IP,因此它将注销我的登录。
还要将第二段代码编辑为以下内容,以便如果尚未创建会话“last_ip”,它不会抛出php通知。
if (isset($_SESSION['last_ip']) && $_SESSION['last_ip'] != $_SERVER['REMOTE_ADDR']){
    session_unset();
    session_destroy();  
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接