2013-04-09 150 views
22

我锁定了IP地址。PHP锁定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(); 
} 

回答

13

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

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

这可以防止会话劫持,但如果您使用动态IP,因为IP会不断变化,所以它不会很好地工作。

+0

如果会话中删除,将用户能够从新的IP获取新的会话,如果他们登录 – 2013-04-09 10:05:40

+0

是的,他们会的。 – Halcyon 2013-04-09 10:05:58

+0

我有添加session_regenerate_id(true);那么这两个如何一起工作呢? – 2013-04-09 10:07:45

8

它的确如此。如果用户的IP更改,他将被注销。虽然攻击者如果知道知识就可以模仿知识产权,但这并不完全安全。看看这些网页的更多信息,如何防止会话劫持:

我还强烈推荐克里斯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。现在我的互联网断开连接 ,我重新连接到我的isp,它启用了dhcp并给了我新的ip给 。因此,如果再次访问您的网站,第二块代码会检查我是否拥有不同的IP,因此它会将我注销。

也编辑你的第二块代码,以便如果会话“last_ip”尚未创建,它不会抛出PHP通知。

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