gpt4 book ai didi

PHP 无法从 NFS 共享中读取 session

转载 作者:可可西里 更新时间:2023-10-31 22:54:39 27 4
gpt4 key购买 nike

我将我的 PHP session 文件存储在 NFS 共享上。问题是,PHP 总是创建一个空的 session 文件,但不能从中读取/写入,因此每次重新加载页面都会创建一个新文件。

如果我将 session 存储路径移动到本地文件夹, session 将正常保存。此外,我正在运行具有相同配置的另一个环境,并且运行良好。

在 PHP 出现此问题的同一台服务器上,我能够在保存 session 的同一目录中创建/写入/读取文件(使用 root、非 root 和特别是 www-data 用户进行测试)。

我在 Ubuntu 12.04 LTS 上使用 PHP 5.5.12、Apache 2.4.9 和 NFS v3

我的 php.ini

session.save_handler = files
session.save_path = "2;/mnt/cache/sessions"
session.use_cookies = 1
session.use_only_cookies = 0
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 2592000
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 2592000
session.bug_compat_42 = Off
session.bug_compat_warn = Off
session.referer_check =
session.entropy_length = 0
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 5

我的/etc/fstab

nfs-srv.local:/export/cache   /mnt/cache   nfs    rw,hard,intr  0  0

我在 nfs-srv.local 上的/etc/exports

/export/cache 10.1.10.0/24(rw,nohide,insecure,no_subtree_check,async,all_squash,anonuid=33,anongid=33)

session 文件

ls /mnt/cache/sessions/ -l
drwxrwxrwx 34 nobody nogroup 4096 May 16 10:33 0
drwxrwxrwx 34 nobody nogroup 4096 May 16 10:33 1
drwxrwxrwx 34 nobody nogroup 4096 May 16 10:33 2
...

ls /mnt/cache/sessions/m -l
drwxrwxrwx 2 nobody nogroup 4096 May 16 10:33 0
drwxrwxrwx 2 nobody nogroup 4096 May 16 12:18 1
drwxrwxrwx 2 nobody nogroup 4096 May 16 10:33 2
drwxrwxrwx 2 nobody nogroup 4096 May 16 10:33 3
drwxrwxrwx 2 nobody nogroup 4096 May 16 12:16 4
drwxrwxrwx 2 nobody nogroup 4096 May 16 12:14 5
...

ls /mnt/cache/sessions/m/5 -l
-rw------- 1 nobody nogroup 0 May 16 12:14 sess_m5ifehvhkjdisp7dgtiuu601e2

最佳答案

我想我已经找到了这个问题的根本原因,我在从 PHP 5.5.10 升级到 5.6.5 时也遇到了这个问题。

PHP 5.5.12 变更日志列出了 following bugfix :

When the session.save_path is a directory that everyone can write into (like on Debian), even if it's not possible to find the IDs of existing sessions, a local attacker can just create a new session file with malicious session data, chmod it to 666 and access any webapp hosted on the system with the session ID he chose. The webapp then opens the session file and treats it as if it had created it. My fix: fstat() the session, check the uid that created the file. If it's neither the result of getuid() nor uid 0, ignore the existing file.

简而言之,如果他们发现新创建的 session 文件不属于运行 Apache 的用户帐户或 root,他们将停止写入 session 数据。这是相当荒谬的,因为 NFS 在不同级别实现其安全性,但通常与 远程 UID/GID 映射一起部署,并且经常被压缩。因此,Apache 用户从创建文件的那一刻起就不再拥有该文件。这意味着,从 PHP 5.5.12 开始(或包含相同“修复”的 5.4.28),在大多数现有 NFS 服务器上存储 session 数据变得不可能。

关于PHP 无法从 NFS 共享中读取 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23695548/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com