今天我了解了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_id() === $_COOKIE['PHPSESSID']
现在,probem是将IP保存到该SESSION的部分。
如何访问此SESSION以像处理数组一样处理它?通常我会这样做:
$ip = $_SERVER['REMOTE_ADDR'];
$_COOKIE['PHPSESSID']['ip'] = $ip;
所以我只是将IP保存到客户端站点$_COOKIE['PHPSESSID']
但是来自服务器站点的SESSION呢?如何在那里存储IP?
非常感谢。
答案 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 之后会丢失任何会话数据。