我发现了一些奇怪的行为 - 我很感兴趣 - 任何人都可以在这个问题上找到答案。
概述
花了一些时间今晨找到其产生的$_SESSION
阵列清空中的错误的原因。最终发现它的底部,发现当为$_SESSION
变量之一定义索引时,&
被用于连接而不是.
。它只在两个特定字符串为&
ed时破坏,其他字符串导致无意义键,但$_SESSION
未空。
这是运行在PHP5.5.9-1ubuntu4.20和本地PHP5.6.15。
亲自试一试!
使用下面的示例代码,
- 运行设置session.php文件
- 运行检查session.php文件 - 所有的好
- 运行突破session.php文件 - 至今仍然不错...
- 运行check-session.php再次 -
$_SESSION
现在是空的!
实施例代码
设定session.php文件
session_start();
$_SESSION = [
'colour' => 'blue',
'shape' => 'round',
'size' => 'medium'
];
检查session.php文件
session_start();
echo '<pre>';
print_r($_SESSION);
破裂session.php文件
session_start();
$killer_string = 'Admin_CH_1_' & '101_';
$_SESSION[$killer_string] = null;
echo '<pre>';
print_r($_SESSION);
我的猜测
我猜位运算结果在一个字符串,在这种情况下$killer_string
的结果,导致PHP上火当它试图存储$_SESSION
阵列在服务器上。奇怪的是,$killer_string
不再是作为$_SESSION
中的子数组的键的杀手。
想法?
我知道代码实际上没有意义,所以PHP没有错。然而,我很好奇幕后究竟发生了什么,以及这是什么造成的......
干杯!
您是否var_dump($ killer_string);'?产量'☺!I' – AbraCadaver
您使用的是什么PHP版本?我只用5.6.25进行了测试,'$ killer_string'被设置为一个类似于@AbraCadaver的字符串的数组键' –
我的结果与@MichaelBerkowski在php-7中的结果相同 – arkascha