这是代码。通过验证 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;
}
如果我插入var_dump($_SESSION)
就在之后session_start()
再次在脚本末尾,第一次运行代码(没有设置会话 cookie)时,我看到数组首先是空的,然后它将我的 IP 地址分配给键“SESSION_IP_ADDRESS”。到目前为止,一切都很好。但是当我再次运行代码时,现在它显示“SESSION_IP_ADDRESS”存储为参考会话开始后立即(我可以通过字符串前面的&符号来判断)。当我第三次运行它时,我看到“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"
}
会话变量唯一被引用的情况是当您将一个会话变量引用到另一个会话变量时(或者原始引用仍在范围内)。
每个例子:
session_start();
$x = 'foo';
$_SESSION['x'] = &$x;
这会给你:
array(1) {
["x"]=>
string(3) "foo"
}
虽然这样:
$x = 'foo';
$_SESSION['x'] = $x;
$_SESSION['y'] = &$_SESSION['x']; // reference to another $_SESSION var
Or this:
session_start();
$x = 'foo';
$_SESSION['x'] = $x;
$_SESSION['y'] = &$x;
var_dump($_SESSION); // reference still in scope
会给你:
array(2) {
["x"]=>
string(3) "foo"
["y"]=>
&string(3) "foo"
}
不管怎样,这样做:
session_start();
$y = $_SESSION['y'];
$y = 'bar';
不会修改y
会话变量。为了做到这一点,你必须这样做:
session_start();
$y = &$_SESSION['y'];
$y = 'bar';
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)