【问题标题】:PHP adds "532142118" to session variablePHP 将“532142118”添加到会话变量中
【发布时间】:2013-12-29 10:19:29
【问题描述】:

我遇到了一个非常奇怪的问题,希望有一个非常简单的解释,但经过数小时的调试,我无法弄清楚发生了什么。

使用 LAMP 堆栈,php 5.4

这是系统的简化版本,它仍然会重现一些奇怪的行为。

在一个简单的自制框架中,我制作了一个水平菜单(选项卡),它“记住”当该选项卡中的页面用于搜索等时,哪个 url 处于活动状态。因此,如果您稍后返回该选项卡,您立即可以看到最后的搜索结果,因为get参数。

因此,菜单中的一个“选项卡”在此 URL 上激活:

/customer/2/customer_email/

这个变量被放入一个会话变量中: $_SESSION['tab_menu']['customer_email'] = $_SERVER['REQUEST_URI'];

页面刷新或导航到另一个选项卡后,可以从会话中读取选项卡的 url。但由于某种原因,存储的 url 更改为:

/customer/2/customer_email/532142118

如果我把 GET 参数放在 url 后面,同样的奇怪数字会被...插入任何进程。 因此,如果我使用此 url 访问选项卡:

/customer/2/customer_email/?foo=bar

会话数组在同一页面加载时将如下所示:

$_SESSION['tab_menu']['customer_email'] = /customer/2/customer_email/?foo=bar

但是在我导航到另一个页面后,会话数据将显示:

$_SESSION['tab_menu']['customer_email'] = /customer/2/customer_email/532142118

我在代码的最后一点通过 var_dump($_SESSION) 验证了 $_SESSION 数组看起来没问题。 我通过在代码开头的 session_start() 之后转储数据来验证下一次刷新的 $_SESSION 数据已更改。

如果我这样做,为了测试,会话数据中不会添加奇怪的数字:

$_SERVER['REQUEST_URI'] = '/customer/2/customer_email/';

如果我导航到另一个 url,则不会出现同样的问题:

/customer/3/customer_email/

我尝试了更多的东西: C

  1. 更改了会话数组中使用的键,但这没关系。
  2. 在具有相同设置的另一台服务器上进行了测试,但也没有出现这种情况。
  3. 尝试在将 url 放入会话数组后立即写入会话数据,但这也解决不了任何问题。
  4. 使用 strcmp()、strcasecmp() 将变量 $_SERVER['REQUEST_URI'] 与字符串 '/customer/2/customer_email/' 进行比较,在 Notepad++ 中显示为十六进制字符,在 PHP 中使用显示为十六进制字符在 stackoverflow 或 php.net 上找到函数
  5. 尝试在将 URL 放入 $_SESSION['tab_menu']['customer_email'] 之前对其进行序列化,但随后数字 532142118 只是神奇地添加到序列化数据中。
  6. 尝试对数字 532142118 进行解码,但无法将其与任何事物相关联。两周没有变化。
  7. 重新启动服务器
  8. 几乎完全重写了控制“选项卡”的逻辑,系统仍然挂在该服务器变量上。

问题:

  1. 什么在改变会话数据?如何进一步调试?
  2. 为什么不是所有网址都出现这种情况?几年来,我在几个标签上都使用了这个系统,这是第一次出现这种奇怪的行为。
  3. 为什么在使用 $_SERVER 变量时会出现这种情况,而不是在将其添加为自键入字符串时出现?
  4. 这个数字是什么意思? 532142118

希望得到一些反应/输入!

编辑: 将第 7 点和第 8 点添加到“我尝试过的事情”中

【问题讨论】:

  • mysql> SELECT from_unixtime(532142118); 提供1986-11-12 06:45:18 如果有帮助的话。
  • 您的尝试列表不包括重新启动。
  • @HussainTamboli 是的,我看到了,我们认为它与今天的日期有关,所以我将服务器的日期更改为 11 月 30 日,但数字保持不变。一周前也是这个数字,所以我认为它与时间无关。
  • @palindrom 重启是什么意思?重启服务器?可以试一试,但没有解释原因,如果它会解决它。

标签: php session serialization


【解决方案1】:

终于有答案了!

感谢这个答案为我指明了正确的方向:
PHP session variable changes between pages

我创建的页面出现了会话问题,显示的是导入的电子邮件。 一些电子邮件正在加载不存在的图像,其 html 源为:

<img border="0" width="110" height="114" id="_x0000_i1025" src="532142118" />

所以在后台,这将加载附加“532142118”的网址, 完全集成在网络统计中,不会在屏幕上显示任何可见的 var_dumps。
我回过头来在设置会话变量的时候用电子邮件发送给自己的函数跟踪,以得出该页面被多次请求的结论。由于图像源,额外请求的页面会导致会话和请求的 url 格式不正确。
现在我排除了特定的 url 请求,不把 url 放在 session 变量中,所以错误的 img 源不会影响系统:)

谢谢大家的意见!

【讨论】:

    猜你喜欢
    • 2017-07-11
    • 2012-10-23
    • 1970-01-01
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多