PHP file_put_contents 返回 'Permission Denied' (由于 SELinux 设置)

PHP file_put_contents returning 'Permission Denied' (Due to SELinux setting)

我知道这是一个常见问题,但我无法针对我的特定用例找出问题,所以请耐心等待。

我有一个简单的 PHP 脚本 send_id,它只是发送一个 ID 号并将其保存到我的 RHEL 服务器 运行ning Apache 2.4.6 上的一个 TXT 文件中 PHP 5.4。

错误信息:Warning: file_put_contents(/var/www/html/id.txt): failed to open stream: Permission denied in /var/www/html/send_id.php on line 6 '1' written to server

PHP 脚本本身:

<?php
$id=$_GET['id'];
$stringData = "$id";
$file = file_put_contents('/var/www/html/id.txt', $stringData.PHP_EOL , FILE_APPEND |LOCK_EX);
echo "'$stringData' written to server";
?>

更改为 777 没有任何作用。此外,我检查了所有权并注意到 id.txt 文件在 user/group 级别都由 root 用户拥有,而 PHP 在 root 级别为 运行。

有人有什么建议吗?如果它有任何帮助,这似乎是在 yum update

之后发生的

尝试将文件夹和文件的所有者更改为 (chown) 至 "www-data" 或 "www-data:www-data",看看它是否改变了什么...

我通过简单地 运行 chcon -Rt httpd_sys_content_rw_t 在我有问题的 PHP 脚本所在的目录中解决了这个问题。

补充说明

ls -alZ *

-Z 开关将与大多数实用程序配合使用以显示 SELinux 安全上下文

使用来自 Apache "DOCUMENT ROOT" 的相对文件路径来引用 PHP 中的文件。重要的是 Apache 的权限,出于安全原因,它被编码为禁止访问 DOCUMENT_ROOT.. 之外的文件(是的,即使您的路径在其中,Apache 一旦看到路径以“ /VAR" ..

假设此 PHP 脚本与 id.txt 文件位于同一目录中,只需使用

$file = file_put_contents('./id.txt', $str...      

或者如果 txt 文件位于 sub-directory

file_put_contents('./sub-dir/id.txt', $str... 

它不仅安全,而且输入起来也更短。