SessionHandler::gc(): ps_files_cleanup_dir |权限被拒绝 (13)
Posted
技术标签:
【中文标题】SessionHandler::gc(): ps_files_cleanup_dir |权限被拒绝 (13)【英文标题】:SessionHandler::gc(): ps_files_cleanup_dir | Permission denied (13) 【发布时间】:2018-04-13 02:11:38 【问题描述】:我在 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)
【问题讨论】:
您是否尝试过使该目录可写? 在 FileZilla 中检查您的目录权限 "ps_files_cleanup_dir" 可能意味着您应该尝试允许此目录中的删除操作 【参考方案1】:背景
当 PHP 尝试对过期会话进行垃圾收集时会发生此错误,但包含会话文件的目录无法被 PHP 运行的用户列出(缺少r
访问位)。
这通常是针对 PHP 会话劫持的安全措施。 Debian 将会话目录的权限设置为drwx-wx-wt
。这些权限允许任何人创建会话,如果创建会话的用户知道文件名(会话 ID),他们可以再次读取它,但只有 root 可以获取所有活动会话的列表。 p>
具有此配置的发行版通常还会设置一个 cronjob 或计时器,定期清理会话并禁用 php.ini 中的本机垃圾收集:session.gc_probability = 0
。
可能的原因
-
您或其他人修改了
php.ini
并将session.gc_probability
更改为0
以外的值。
PHP 脚本在运行时使用ini_set()
修改session.gc_probability
。一些 PHP 框架容易出现这种情况。例如。 Symfony always sets session.gc_probability
to 1
if not configured otherwise。
您或管理服务器的其他人在不使用 cronjob 或计时器清理过期会话的系统上搞砸了会话目录权限。
解决方案
在验证您的安装使用 cronjob/timer 进行会话清理后,将 php.ini 中的 session.gc_probability
更改为 0
。
/usr/local/cpanel/scripts/clean_user_php_sessions
删除过期会话,因此所有 CPanel 安装都使用 cronjob。
Debian、Ubuntu 和 Linux Mint 使用 systemd 计时器 phpsessionclean.timer
进行会话清理。
防止 Web 应用程序覆盖 session.gc_probability
。对于基于 Symfony 的应用程序,这可以通过修改 config/packages/framework.yaml
来完成:
framework:
session:
gc_probability: null
如果您的系统确实使用本机会话垃圾收集而不是 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 并可能访问所有会话。仅当您确定上述解决方案不适用时才这样做!
(潜在危险) 将 session.save_path
更改为 /tmp
或 PHP 可以访问以进行读写的类似目录。
安全通知:将会话保存路径更改为全球可读目录允许任何程序和任何 PHP 脚本枚举所有活动会话 ID 并可能访问所有会话。仅当您确定上述解决方案不适用时才这样做!
【讨论】:
【参考方案2】:用于修复
«Notice: SessionHandler::gc(): ps_files_cleanup_dir: opendir("/var/cpanel/php/sessions/ea-php70") failed: Permission denied"
我建议将此特定文件夹 (/var/cpanel/php/sessions/ea-php70) 的写入访问权限授予您用于 PHP 解释器的操作系统帐户。
使用 session.gc_probability=0 PHP 设置禁用 PHP 的会话垃圾收集器不是一个好的解决方案,因为会话文件夹中会有很多孤立的会话文件,它会浪费磁盘空间并减慢您的速度服务器。
【讨论】:
“因为你会在会话文件夹中有很多孤立的会话文件” --- debian php 包不是带有一个专门的 cron 作业来独立于 php 清理会话吗? @zerkms 不,它没有。 php 在脚本执行期间根据 php.init / 中设置的信息运行它的会话垃圾收集器。但是您应该始终为每个项目会话设置专用目录,因为它们的生命周期设置可能不同,如果目录是共享的,则会导致会话提前到期。 @SteveB 好吧,debian 和 ubuntu 软件包禁用了内置 GC,并带有通过 cron 或 systemd 运行的外部清理脚本。只需安装它并检查自己。 @zerkms 好吧,你找到我了。链接有关 serverfault 的相关问题以供参考:serverfault.com/questions/511609/…. @Dmitriy Buteiko,当我以 root 身份授予权限时,它可以工作,但第二天我又遇到了同样的异常!!!我应该怎么做才能使它永久化?我总是运行这两个命令:1-sudo chown username: -R /var/cpanel/php/sessions/ea-php70
## 2- sudo chmod u+w -R /var/cpanel/php/sessions/ea-php70
【参考方案3】:
我清除了缓存,问题已经解决了:)
【讨论】:
我有同样的错误,在php.ini中将路径文件更改为/tmp并清除了缓存,但仍然显示相同的错误。【参考方案4】:出现此错误,因为您需要文件夹权限才能将会话文件存储在会话文件夹中。
此错误在所有流行的框架中都很常见。解决方案是 1. 授予会话文件夹权限,以显示存储文件或 2.在你的项目中创建一个本地会话文件夹,并重写你项目中的会话文件存储路径。
【讨论】:
【参考方案5】:我有同样的问题,我在我的 php.ini 中将 session.save_path
更改为“/tmp”
【讨论】:
将会话文件夹更改为“tmp”而不是“var/cpanel/php/sessions/ea-php73”目录是否存在安全问题? 更改为“/tmp”之前的值是多少? @Kat 是的,有一个问题:任何用户 (rwt
) 都可以列出 /tmp。这意味着服务器上的每个程序都可以枚举所有活动会话 id,每个 PHP 脚本都可以列出和访问所有活动会话。以上是关于SessionHandler::gc(): ps_files_cleanup_dir |权限被拒绝 (13)的主要内容,如果未能解决你的问题,请参考以下文章