【发布时间】:2011-01-22 01:09:22
【问题描述】:
这是代码。通过验证 IP 地址来检查会话 ID 是否被欺骗是一个简单的操作:
session_start();
$session_ip_address = $_SERVER['REMOTE_ADDR'];
if((!isset($_SESSION['SESSION_IP_ADDRESS'])) || !$_SESSION['SESSION_IP_ADDRESS']) {
$_SESSION['SESSION_IP_ADDRESS'] = $session_ip_address;
}
if($_SESSION['SESSION_IP_ADDRESS'] != $_SERVER['REMOTE_ADDR']) {
session_destroy();
$_SESSION['security_error'] = true;
}
如果我在session_start() 之后插入var_dump($_SESSION) 并在脚本末尾再次插入,那么我第一次运行代码时(没有设置会话cookie)我首先看到数组是空的,然后它将我的 IP 地址分配给键“SESSION_IP_ADDRESS”。到目前为止,一切都很好。但是当我再次运行代码时,现在它显示“SESSION_IP_ADDRESS”在会话开始后立即存储为 reference(我可以通过字符串前面的 & 号来判断)。当我第三次运行它时,我看到 'SESSION_IP_ADDRESS' 现在是一个空引用 ('SESSION_IP_ADDRESS' => &null) 在会话开始后立即。怎么回事?!
重申一下,这是第一次的输出:
array(0) {
}
array(1) {
["SESSION_IP_ADDRESS"]=>
string(11) "xx.xx.xxx.x"
}
这是第二次的输出:
array(1) {
["SESSION_IP_ADDRESS"]=>
&string(11) "xx.xx.xxx.x"
}
array(1) {
["SESSION_IP_ADDRESS"]=>
&string(11) "xx.xx.xxx.x"
}
从那时起,第三次和每一次:
array(1) {
["SESSION_IP_ADDRESS"]=>
&NULL
}
array(1) {
["SESSION_IP_ADDRESS"]=>
&string(11) "xx.xx.xxx.x"
}
【问题讨论】:
标签: php session pointers reference