【问题标题】:PHP SESSION handling - invalid valuesPHP SESSION 处理 - 无效值
【发布时间】:2019-02-19 17:21:15
【问题描述】:

我们需要在很多现有代码中使用 session_write_close()。但这对我们来说看起来很危险,因为 PHP 会执行以下操作 - 没有给出任何警告或错误:

session_name('goodoldasdf');
session_start();

if (!empty($_SESSION['var'])) {
print ' Session-Data: '. $_SESSION['var'];
}

$_SESSION['var'] = "before";

session_write_close();

$_SESSION['var'] = "after"; // notice: definition after write close!

print ' B: '. $_SESSION['var'];

当我们在 session_write_close 之后定义一个 SESSION-var 时,PHP 不会将 SESSION 写入 MemcacheD 会话处理程序(如预期的那样) - 但它仍然在同一脚本运行时使用覆盖。

输出:“伪会话数据:之后”。

第二次运行:

输出:“会话数据:之前伪会话数据:之后

问题是:如何确保 PHP 没有使用 pseudo SESSION-vars,实际上并没有写入会话中? 有没有办法在这里得到 PHP 警告?或者有什么解决这个问题的建议?


为什么我们需要到处添加 write close: 将“PHP 5.x”更新为“PHP 7”后,一切都变慢了。特别是在 AJAX 请求或同时加载多选项卡上。这是因为 PHP 7 似乎改变了它的会话处理/阻塞。

很好的演示:https://demo.ma.ttias.be/demo-php-blocking-sessions/

所以我们需要将 session_write_close 添加到很多脚本中 - 不会冒无效会话值的风险。

【问题讨论】:

  • 所以使用带有乐观锁定的非阻塞处理程序。
  • 了解更多相关信息吗?
  • 这里包含一个非阻塞处理程序(在一个框架中,您可以使用它来添加存储基板和乐观锁定作为绝望的关注点)phpclasses.org/package/…

标签: php validation session


【解决方案1】:

你可以看看session_status()(Docs)的输出

switch(session_status()) {
    case PHP_SESSION_DISABLED:
        die('Sessions disabled on this server');
    case PHP_SESSION_NONE:
        die('Session has not been started, or has been closed');
    case PHP_SESSION_ACTIVE:
        die('There is currently an active session');
}

您可以将其与包装函数一起用于获取/设置会话变量。

【讨论】:

  • 感谢您的评论。每次写入 SESSION 之前检查 session_status 似乎很费力。我想知道 PHP 是否对此进行了任何全局错误处理。
【解决方案2】:

代替session_write_close(); 编写自己的函数并取消设置超全局:

function session_stop() {
    session_write_close();
    unset($_SESSION);
}

现在你会得到:

注意:未定义变量:文件 X 行 Y 中的 _SESSION

【讨论】:

  • 你也不能再读取会话数据了,不是吗?
猜你喜欢
  • 2015-11-16
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
  • 2017-06-10
  • 2023-02-05
  • 2013-09-12
相关资源
最近更新 更多