在 Catalina MacOS 10.15 下,Apache 下的 PHP 限制了通过文件链接访问某些文件,这可能是由于隐私更改

Cle*_*ndo 9 apache macos macos-catalina

问题

升级到 MacOS 10.15 Catalina 后,PHP 在读取某些链接而不是其他链接时遇到问题,运行 PHP(作为 Apache 的用户“www”)。问题似乎是对操作系统隐私/安全配置的更改,我们知道已经更改,而不是目录执行权限/FollowSymLink 权限。

细节

$ ls -alt /Users/[MYUSER]/Sites/*info.php
lrwxr-xr-x  1 [MYUSER]  staff   8 Oct 10 11:16 /Users/[MYUSER]/Sites/linfo.php -> info.php
-rwxr-xr-x  1 [MYUSER]  staff  25 Oct 30  2014 /Users/[MYUSER]/Sites/info.php
Run Code Online (Sandbox Code Playgroud)

在上面两个页面 info.php 和 linfo.php 功能正确,我认为这表明 FollowSymLinks 正在工作。

$ ls -alt /Users/[MYUSER]/Sites/*index.php
lrwxr-xr-x  1 [MYUSER]  staff  78 Dec 30  2014 /Users/[MYUSER]/Sites/index.php -> /Users/[MYUSER]/Documents/[ADIR]/Development/GitHub/cms/sitesIndex.php
$ ls -alt /Users/[MYUSER]/Sites/sitesIndex.php
-rwxr-xr-x  1 [MYUSER]  staff  20847 Oct  8 13:11 sitesIndex.php
Run Code Online (Sandbox Code Playgroud)

在上述页面 index.php 中,链接失败,而链接文件sitesIndex.php 的副本则成功。

背景

虽然我不相信它是相关的(因为无法 followSymLinks 有不同的错误消息),但以下是 FollowSymLinks 设置。

<Directory "/Users/*/Sites/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

$ cat $HOME/Sites/.htaccess
Options +FollowSymLinks
Run Code Online (Sandbox Code Playgroud)

Web 服务器以用户“www”的身份运行。

Apache 以 root 身份启动,但工作线程按预期以 _www 运行。

_www             65500   0.0  0.0  4317396   1288   ??  S     9:56AM   0:00.02 /usr/sbin/httpd -D FOREGROUND
_www             28574   0.0  0.0  4317440   2256   ??  S    12:16PM   0:00.03 /usr/sbin/httpd -D FOREGROUND
_www             28546   0.0  0.0  4317520   2612   ??  S    12:15PM   0:00.06 /usr/sbin/httpd -D FOREGROUND
root             28529   0.0  0.0  4317548   1284   ??  Ss   12:15PM   0:04.56 /usr/sbin/httpd -D FOREGROUND
Run Code Online (Sandbox Code Playgroud)

$HOME/Sites 中的所有这些文件都在 iCloud 下,我们在发行说明中被告知在 10.15 中为 iCloud 目录引入了新的额外隐私限制,但我不清楚这些限制是什么,或者限制被记录在案。

错误

在服务器响应页面中,PHP 产生以下错误:

Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0

Fatal error: Unknown: Failed opening required '/Users/owenbrunette/Sites/index.php' (include_path='.:') in Unknown on line 0
Run Code Online (Sandbox Code Playgroud)

在 error.log 中:

[Tue Oct 08 21:49:11.855033 2019] [php7:warn] [pid 83605] [client ::1:64968] PHP Warning:  Unknown: failed to open stream: Operation not permitted in Unknown on line 0, referer: http://localhost/
[Tue Oct 08 21:49:11.855078 2019] [php7:error] [pid 83605] [client ::1:64968] PHP Fatal error:  Unknown: Failed opening required '/Users/[MYUSER]/Sites/index.php' (include_path='.:') in Unknown on line 0, referer: http://localhost/
Run Code Online (Sandbox Code Playgroud)

我已经做了很多文件检查。为其他文件设置的 UNIX 读取和执行标志是为所有通向这些文件的目录设置的。

解决方案的尝试

“操作不允许”的错误是在 MacOS 下与系统完整性保护相关的错误字符串,而不是 Apache SymLink 跟随,虽然“操作不允许”这个词很可能不是唯一的。错误来自 PHP 而不是 Apache ..

我已在以下位置允许完整磁盘访问:系统偏好设置/安全与隐私/隐私/完整磁盘访问。

我还没有尝试在操作系统级别完全禁用 SIP(​​系统完整性保护),因为这远非理想的解决方案。

小智 21

Catalina 具有更多限制性权限。修复很简单:为 http 启用全盘访问。去做这个:

系统偏好设置 => 安全和隐私 => 全盘访问

导航到磁盘的根文件夹,然后按 Cmd+Shift+。(查看root下的所有文件夹)然后转到

/usr/sbin/

选择“httpd”并重新启动它(apachectl -k restart)。

这应该够了吧。