如何在PHPSESSID中存储IP?

如何在PHPSESSID中存储IP?,php,html,session,cookies,Php,Html,Session,Cookies,今天我学习了Cookie和SESSION之间的区别 现在我想创建一个登录名。主要思想如下: $ip = $_SERVER['REMOTE_ADDR']; $session_ip = $_SESSION['PHPSESSID']['ip']; if ( (session_id() === $_COOKIE['PHPSESSID']) && ($ip === $session_id) ){ return (true); } else { return (false)

今天我学习了Cookie和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启动时,它将在客户端站点上创建
$\u COOKIE['PHPSESSID']
。服务器将会话存储在服务器上的某个位置,并可以使用
SESSION\u id()

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

session_id() === $_COOKIE['PHPSESSID']
现在,问题是将IP保存到该会话的部分

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

$ip = $_SERVER['REMOTE_ADDR'];
$_COOKIE['PHPSESSID']['ip'] = $ip;
因此,我只是将IP保存到客户端站点
$\u COOKIE['PHPSESSID']
,但是服务器站点的会话呢?如何在那里存储IP


非常感谢。

将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
}
我想不出任何理由可以直接使用
$\u COOKIE['PHPSESSID']

我想说的是,我不太明白为什么您需要将此值存储到会话,因为它始终可以通过
$\u服务器['REMOTE\u 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保存到会话将非常简单:

session_start();  //near beginning of script
$_SESSION['ip'] = $ip;
在设置ip值后的任何其他页面上:

session_start(); //near beginning of script
if(!empty($_SESSION['ip'])) {
    // do something with it
}
我想不出任何理由可以直接使用
$\u COOKIE['PHPSESSID']

我想说的是,我不太明白为什么您需要将此值存储到会话,因为它始终可以通过
$\u服务器['REMOTE\u 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地址不更改来阻止连接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地址不更改来阻止连接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是否等于当前使用的IP,则必须将数据存储在数据库中,而不是使用会话。会话的一般行为之一是,在会话到达其生命的终点后,任何会话数据都会丢失。

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

您的意思是
$ip===$session\u ip
而不是
$ip====$session\u id
?请记住,有些人的ip地址会随着每次请求而变化,例如,如果他们在一个大的网络中,比如一个企业或大学。IP锁可能是个坏主意。这只是为了确保不被滥用。你是说
$IP====$session\u IP
而不是
$IP===$session\u id
?请记住,有些人的IP地址会随着每个请求而变化,比如他们在一个大型网络中,比如企业或大学。IP锁可能是个坏主意。它只是为了确保没有滥用。逻辑是在会话启动后保存IP,并在来自页面的每个请求中检查IP。如果它们不相等,则无法访问保护区。@bonny请参阅更新的答案,以了解如何完成此操作的建议。@bonny这显然是一个非常简单的视图。在现实世界中,REMOTE_ADDR可能并不那么可靠(用户可能在代理之后,值可能不会被中继,它们不是移动设备,并且会更改单元格(因此IP)等等),因此,您可能需要考虑注销错配,以查看是否有某些情况下可能会阻塞合法用户。您是否知道在不使用Cookie的情况下更好地处理这个问题的安全方法?我介意用饼干,因为它们不够安全。谢谢。@bonny不够安全做什么?在这里,cookie除了存储会话ID之外什么都不做。会话数据永远不会向客户端公开。这确实是在客户端和服务器之间传递会话ID的首选方法。逻辑是保存会话启动后的IP,并在来自页面的每个请求中检查IP。如果它们不相等,则无法访问保护区。@bonny请参阅更新的答案,以了解如何完成此操作的建议。@bonny这显然是一个非常简单的视图。在现实世界中,REMOTE_ADDR可能并不那么可靠(用户可能在代理之后,值可能不会被中继,它们不是移动设备,并且会更改单元格(因此IP)等等),因此,您可能需要考虑注销错配,以查看是否有某些情况下可能会阻塞合法用户。您是否知道在不使用Cookie的情况下更好地处理这个问题的安全方法?我介意用饼干,因为它们不够安全。谢谢。@bonny不够安全做什么?在这里,cookie除了存储会话ID之外什么都不做。会话数据永远不会向客户端公开。这确实是在客户端和服务器之间传递会话ID的首选方法。逻辑是保存会话启动后的IP,并在来自页面的每个请求中检查IP。如果它们不相等,则无法访问受保护区域。逻辑是保存会话启动后的IP,并在来自页面的每个请求中检查IP。如果它们不相等,则无法访问保护区。