【发布时间】:2017-02-14 08:28:55
【问题描述】:
我发现了一些奇怪的行为 - 我很感兴趣 - 任何人都可以对此有所了解..?
概述
今天早上花了一些时间寻找导致$_SESSION 数组为空的错误的原因。最终找到了它的底部,发现在为$_SESSION 变量之一定义索引时,& 被用于连接而不是.。仅当两个特定字符串为&ed 时才会中断,其他字符串导致无意义的键但$_SESSION 没有为空。
这是在 PHP5.5.9-1ubuntu4.20 和本地 PHP5.6.15 上运行的。
自己试试吧!
使用下面的示例代码,
- 运行set-session.php
- 运行 check-session.php - 一切正常
- 运行 break-session.php - 到目前为止还不错...
- 再次运行 check-session.php -
$_SESSION现在为空!
示例代码
set-session.php
session_start();
$_SESSION = [
'colour' => 'blue',
'shape' => 'round',
'size' => 'medium'
];
check-session.php
session_start();
echo '<pre>';
print_r($_SESSION);
break-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 -
您使用的是什么 PHP 版本?我刚刚用 5.6.25 进行了测试,
$killer_string被设置为一个数组键,其字符串类似于@AbraCadaver -
我的结果与 php-7 中的@MichaelBerkowski 相同
-
用我得到的版本更新了问题。
-
错误跟踪器中也有一些错误报告报告了此问题。
标签: php