【问题标题】:How to store IP in the PHPSESSID?如何在 PHPSESSID 中存储 IP?
【发布时间】:2013-12-07 21:04:27
【问题描述】:

今天我了解了 COOKIES 和 SESSION 的区别。

现在我想创建一个登录。主要思想如下:

$ip = $_SERVER['REMOTE_ADDR'];
$session_ip = $_SESSION['PHPSESSID']['ip'];

if ( (session_id() === $_COOKIE['PHPSESSID']) && ($ip === $session_id) ){
    return (true);
} else {
    return (false);
}

我想检查 IP 是否与用户上次登录时的 IP 相同。 因此,当 SESION 启动时,它将在客户端站点上创建 $_COOKIE['PHPSESSID']。服务器会将 SESSION 存储在服务器上的某个位置,并且可以使用 session_id() 识别 SESSION

基本上应该和这部分说的一样:

session_id() === $_COOKIE['PHPSESSID']

现在,probem 是将 IP 保存到该 SESSION 的部分。

如何访问此 SESSION 以像处理数组一样处理它?通常我会这样做:

$ip = $_SERVER['REMOTE_ADDR'];
$_COOKIE['PHPSESSID']['ip'] = $ip;

所以我只是将 IP 保存到客户端站点$_COOKIE['PHPSESSID'],但是来自服务器站点的 SESSION 呢?我怎样才能在那里存储IP?

非常感谢。

【问题讨论】:

  • 你的意思是$ip === $session_ip而不是$ip === $session_id
  • 请记住,有些人的 IP 地址会随着每个请求而变化,例如,如果他们在企业或大学等大型网络中。 IP 锁定可能是个坏主意。
  • 它只是为了确保没有滥用。

标签: php html session cookies


【解决方案1】:

将 IP 保存到会话就像这样简单:

session_start();  //near beginning of script
$_SESSION['ip'] = $ip;

比设置 ip 值后的任何其他页面:

session_start(); //near beginning of script
if(!empty($_SESSION['ip'])) {
    // do something with it
}

我想不出你会直接使用 $_COOKIE['PHPSESSID'] 值的任何原因。

虽然我不太明白为什么需要将此值存储到会话中,因为它始终可以通过$_SERVER['REMOTE_ADDR'] 获得。

回答您评论中指定的用例。您的代码可以很简单:

session_start(); //near beginning of script
if(!isset($_SESSION['ip'])) {
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
} else if ($_SERVER['REMOTE_ADDR'] !== $_SESSION['ip']) {
   // invalid session
   // exit program, redirect, or whatever you want to do here
   // just make sure you exit script execution
}
// continue with rest of code

【讨论】:

  • 逻辑是保存会话已启动的 IP,并检查来自页面的每个请求。如果它们不相等,则无法访问保护区。
  • @bonny 查看更新的答案以获取有关如何完成此操作的建议。
  • @bonny 这显然是一个非常简单的观点。在现实世界中,REMOTE_ADDR 可能不是那么可靠(用户可能在代理后面,该值可能不会被中继,它们不是移动设备并且会更改单元格(因此会更改 IP)等),因此您可能需要考虑注销不匹配项以查看您是否在某些情况下可能会阻止合法用户。
  • 您知道在不使用 COOKIES 的情况下处理此问题的更安全的方法吗?我介意使用 COOKIES,因为它们不够安全。谢谢。
  • @bonny 对什么不够安全?在这里,cookie 除了存储会话 ID 之外什么都不做。会话数据永远不会暴露给客户端。这确实是在客户端和服务器之间传递会话 ID 的首选方法。
【解决方案2】:

如果您想检查 上次登录 IP 是否等于 当前使用的 IP,则必须将数据存储在数据库中,而不是使用会话。会话的一般行为之一是任何会话数据在会话达到其生命结束后丢失。

【讨论】:

    【解决方案3】:

    您似乎试图通过要求 IP 地址不更改来阻止连接 MIM 攻击?这可能是有问题的——因为 IP 在现实世界中并不总是保持不变。但是,您可以这样做:

    <?php
    
    //start a session
    session_start();
    
    //check cookie and ip
    if((session_id() === $_COOKIE['PHPSESSID']) && (!isset($_SESSION['ip']) || (isset($_SESSION['ip']) && $_REQUEST['REMOTE_ADDR'] === $_SESSION['ip']))){
        echo 'attempt ok';
    } else { 
        die('IP changed');
    }
    
    //set ip in session
    if(!isset($_SESSION['ip'])){
        $_SESSION['ip'] = $_REQUEST['REMOTE_ADDR'];
    }
    

    【讨论】:

    • 逻辑是保存会话已启动的 IP,并检查来自页面的每个请求。如果它们不相等,则无法访问保护区。
    猜你喜欢
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    相关资源
    最近更新 更多