【问题标题】:One of SESSION variables gets changedSESSION 变量之一被更改
【发布时间】:2012-09-11 00:36:40
【问题描述】:

我正在开发一个具有每个角色的用户界面和功能的 Web 应用程序。在users 表中,我有一个role 列,一个enum,它存储每个用户的角色。在登录脚本中,如果找到用户/通行证的匹配记录,我将SESSION['role'] 变量设置为记录的角色字段的值。除了角色,我还存储了其他几位数据,例如其他 SESSION 变量中的 display_name。然后,SESSION['role'] 在整个应用程序中用于向浏览器发送正确的用户界面并强制执行访问规则。

这在我的本地主机上一切正常,但在远程服务器上,SESSION['role'] 只是第一次工作 - 即正确的用户界面被发送到浏览器。在那之后,SESSION['role'] 以某种方式更改为不同的(现有)角色,因此访问规则不允许这些功能可用。更诡异的是,只有SESSION['role']发生变化,SESSION['displayname']SESSION['username']保持不变。

我没有在login.php 以外的任何地方设置SESSION 变量。非常感谢我应该寻找潜在原因的任何想法。

【问题讨论】:

  • 也许您在if 语句中有分配?
  • 你确定这两个环境中的代码是一样的吗?
  • @WaleedKhan,很好的候选人,谢谢!我向上帝祈祷就是这个。
  • 您是否在 prod 服务器上运行了另一个使用相同 session_name() 的应用程序?如果是这样,它可以覆盖您的会话变量。使用session_name('app1'), session_name('app2')设置不同的名称
  • @Ddorda,我检查了很多次,我重新上传了几次,但还是一样。

标签: php session session-variables


【解决方案1】:

检查您的数据库结构是否相同。最值得注意的是 ENUM 具有相同的角色/标识符。如果您指定的值无效,SQL 将在“STRICT MODE”中失败,否则它将回退到其中一个值。

(提示:总是在“严格模式”下开发,除非有什么理由不这样做。这样你就不会在分发到 live 时感到紧张)。

如果您有一个包含角色的单独表(例如 LEFT JOIN),请也检查一下。

【讨论】:

  • 我不知道这一点,所以+1,谢谢!但这不太可能是问题——实际上,为了便于测试,我已经添加了一个旁路来记录检查login.php,并且使用meta-ROLENAME 将以角色ROLENAME 的有效用户身份登录。这些登录也存在问题。
【解决方案2】:

我发现了问题。在 prod 服务器上 register_globals 已打开(顺便说一下,这对于 PHP 5.3.6 来说是一个无味的选择)。

但是,我不怀疑这是原因,因为我不知道它如何影响超级全局变量。我虽然打开register_globals 相当于在所有脚本的开头添加这段代码:

foreach($_SESSION as $kn => $val) eval("$kn = $val;");
same for other super globals ...

换句话说,我认为定义 $_SESSION['role'] 并等于 'Manager' 与此行具有相同的效果:

$role = $_SESSION['role'];
or
$role = 'Manager';

但这只是故事的一半作为下面的第二行

$role = $_SESSION['role'];
$role = 'Something else';

不影响SESSION['role'],它的价值仍然是它原来的样子。但如果register_globals 开启,更改$role 将更改$_SESSION['role']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 2021-10-17
    • 2014-10-21
    • 2023-03-08
    相关资源
    最近更新 更多