2009-10-26 39 views
1

因此,我正在对使用$_SESSION变量的PHP站点进行一些维护。我开始看到一些非常奇怪的行为,经过几个小时的调试后,我才明白了这一点。作为一个例子,可以说我有一个会话变量的设置是这样的:PHP会话变量快捷键?

$sql = "SELECT whatever FROM table"; 
$user = $db->fetchRow($sql); 

现在:

$_SESSION['user']['id'] = 123; 
$_SESSION['user']['firstname'] = 'John'; 
$_SESSION['user']['lastname'] = 'Doe'; 

在脚本中的一个点,一个MySQL表呼叫使用一些Zend类制成这里是怪异开始的地方......在完成这个数据库调用之后,我的$_SESSION['user']数组值突然变为从数据库调用中检索的对象...

基本上:$_SESSION['user']现在是与检索的对象相同使用应该存储在变量$user中的fetchRow DB方法编辑。我从来没有见过这个。

我唯一能想出来的是因为变量名称$user$_SESSION['user']数组键名相同,它的行为就像是一个快捷方式或其他东西。

这是一种奇怪的PHP会话快捷键,我从来没有听说过吗?

在附注中,我知道直接访问$_SESSION变量不是最佳实践。我没有建立这个网站。我的工作只是修复一些东西并添加一些功能。

UPDATE:果然,register_globals已打开。感谢快速帮助的人。难怪我看到这种奇怪的行为。

回答

6

听起来像你有register_globals在PHP.ini中设置为On。关闭它应该解决这个问题。

如果您无权更改PHP.ini,将讨论替代解决方案here

4

检查是否打开register globals。访问$_SESSION是安全访问会话数据的唯一途径。

注册全局变量是一种将全局变量转换为局部变量的旧功能。与此相关的问题是你不能安全地知道数据来自哪里。您可以通过get,post或者cookie变量设置您从会话期望得到的东西。所以绕过安全很容易。