【问题标题】:PHP locked ip addressPHP锁定IP地址
【发布时间】:2013-03-31 17:01:48
【问题描述】:

我锁定了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();  
}

【问题讨论】:

    标签: php


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果会话被删除,用户登录后是否能够从新IP获取新会话
    • 我添加了 session_regenerate_id(true);那么这两者是如何协同工作的呢?
    • session_regenerate 会给用户一个新的session_id。会话由session_id 标识,用户将其作为cookie 发送。当您重新生成会话时,您是在告诉用户从现在开始发送不同的session_id。会话数据将保持不变,除了一些边缘情况,这是非常透明的(即用户不会注意到)。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:
      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 并提供新 IP 的 isp 我。因此,如果再次访问您的网站,第二个代码块会检查我是否拥有不同的 IP,以便将我注销。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-01
        • 2011-02-07
        • 2012-02-29
        • 2016-12-06
        • 1970-01-01
        • 2013-08-22
        • 2011-02-05
        相关资源
        最近更新 更多