如何在PHPSESSID中存储IP?

时间:2013-11-22 20:41:34

标签: php html session cookies

今天我了解了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?

非常感谢。

3 个答案:

答案 0 :(得分:5)

将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

答案 1 :(得分:1)

看起来你试图通过要求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'];
}

答案 2 :(得分:0)

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