SessionHandler::gc():ps_files_cleanup_dir \|权限被拒绝 (13)

新手上路,请多包涵

我在 CentoOS (WHM/CPANEL) 和 Prestashop 1.7 中遇到 PHP7 问题

系统给我这个消息:

 Notice on line 429 in file /home/onywf3fr9a/public_html/app/cache/dev/classes.php

[8] SessionHandler::gc(): ps_files_cleanup_dir: opendir(/var/cpanel/php/sessions/ea-php70) 失败:权限被拒绝 (13)

原文由 user3250372 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
1 个回答

背景

当 PHP 尝试垃圾收集过期会话时会发生此错误,但包含会话文件的目录不可列出(缺少 r 访问位)用户 PHP 运行为。

这通常是针对 PHP 会话劫持的安全措施。 例如,Debian 将会话目录的权限设置为 drwx-wx-wt 。这些权限允许任何人创建会话,创建会话的用户如果知道文件名(会话 ID)可以再次读取它,但只有 root 才能获得所有活动会话的 _列表_。

具有此配置的发行版通常还会设置一个 cronjob 或计时器,定期清理会话并禁用 php.ini 中的本机垃圾收集: session.gc_probability = 0

可能的原因

  1. 您或其他人修改了 php.ini 并将 --- 更改为 --- 0 session.gc_probability 以外的值。
  2. PHP脚本使用 ini_set() session.gc_probability 。一些 PHP 框架容易出现这种情况。例如 ,Symfony 总是将 session.gc_probability 设置为 1 如果没有另外配置的话
  3. 您或其他管理服务器的人在不使用 cronjob 或计时器清理过期会话的系统上搞砸了会话目录权限。

解决方案

  1. 将 php.ini 中的 — 更改为 session.gc_probability 0 在验证您的安装使用 cronjob/timer 进行会话清理之后。

    • CPanel 使用 /usr/local/cpanel/scripts/clean_user_php_sessions 删除过期会话,因此所有 CPanel 安装都使用 cronjob。
    • Debian、Ubuntu 和 Linux Mint 使用 systemd 计时器 phpsessionclean.timer 进行会话清理。
  2. 防止 Web 应用程序覆盖 session.gc_probability 。对于基于 Symfony 的应用程序,这可以通过修改 config/packages/framework.yaml 来完成:

    framework:
       session:
           gc_probability: null

  1. 如果您的系统确实使用本机会话垃圾收集而不是 cronjob 或计时器,请更改会话文件夹的权限以允许列出运行 PHP 的用户:
    # Check beforehand which group php-fpm runs as. Here I assume www-data:
   chgrp www-data /var/cpanel/php/sessions/ea-php70
   chmod g+r /var/cpanel/php/sessions/ea-php70

安全通知:更改权限允许 任何 PHP 脚本枚举所有活动会话 ID 并可能访问所有会话。仅当您确定上述解决方案不适用时才这样做!

  1. (潜在危险)session.save_path 更改为 /tmp 或 PHP 可以访问以进行读写的类似目录。

安全通知:将会话保存路径更改为世界可读目录允许 任何 程序和任何 PHP 脚本枚举所有活动会话 ID 并可能访问所有会话。仅当您确定上述解决方案不适用时才这样做!

原文由 cg909 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏