apache PHP file_put_contents返回“权限被拒绝”(由于SELinux设置)

dluptydi  于 2022-11-16  发布在  Apache
关注(0)|答案(3)|浏览(300)

我知道这是一个常见的问题,但我还没有能够挑出我的具体用例的问题,所以请原谅我。
我有一个简单的PHP脚本send_id,它只发送一个ID号,并将其保存到我的RHEL服务器上的TXT文件中,该服务器运行Apache 2.4.6和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";
?>

chmodding到777并没有做任何事情。另外,我检查了所有权,注意到id.txt文件在用户/组级别上都由root用户拥有,PHP在root级别上运行。
有人有什么建议吗?如果它有任何帮助,这似乎发生在一个yum update之后

vpfxa7rd

vpfxa7rd1#

我通过在有问题的PHP脚本所在的目录上运行chcon -Rt httpd_sys_content_rw_t来解决这个问题。
chcon命令可更改文件的SELinux上下文。但是,使用chcon命令所做的更改在文件系统重新标记或restorecon命令的执行过程中并不持久。
-Rt用于更改目录的类型及其内容,httpd_sys_content_rw_t用于给予apache写访问权限
来源:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/selinux_users_and_administrators_guide/sect-security-enhanced_linux-working_with_selinux-selinux_contexts_labeling_files
补充说明

ls -alZ *

Z开关将与大多数实用程序一起使用,以显示SELinux安全上下文

eeq64g8w

eeq64g8w2#

尝试将文件夹和文件的所有者更改为(chown)、“www-data”或“www-data:www-data”,看看是否会发生任何更改...

wxclj1h5

wxclj1h53#

使用Apache的“DOCUMENT ROOT”中的相对文件路径来引用PHP中的文件。Apache的权限很重要,出于安全原因,它被编码为禁止访问DOCUMENT_ROOT之外的文件。(是的,即使您的路径在其中,Apache也会在看到路径以“/VAR”开头时被阻止。)
假设此PHP脚本与id.txt文件位于同一目录中,只需使用

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

或者如果txt文件位于子目录中

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

它不仅安全,而且打字时间也短得多。

相关问题