apache — PHP file_put_contents, возвращающий «Отказано в доступе» (из-за настройки SELinux)

Я знаю, что это общая проблема, но я не смог выделить проблему для моего конкретного случая использования, так что терпите меня.

У меня есть простой скрипт PHP send_id который просто отправляет идентификационный номер и сохраняет его в файл TXT на моем RHEL-сервере под управлением 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

2

Решение

Я решил эту проблему, просто запустив chcon -Rt httpd_sys_content_rw_t в каталоге, где жил мой проблемный PHP-скрипт.

Дополнительное примечание

ls -alZ *

Ключ -Z будет работать с большинством утилит, чтобы показать контексты безопасности SELinux

1

Другие решения

Попробуйте изменить владельца папки и файла на (chown) к «www-data» или к «www-data: www-data» и посмотреть, что-то изменится …

-1

Используйте относительный путь к файлу из «ROOT DOOUMENT ROOT» Apache для ссылки на файлы в PHP. Это разрешения Apache, которые имеют значение, и по соображениям безопасности он закодирован, чтобы запретить доступ к файлам вне DOCUMENT_ROOT .. (да, даже если ваш путь ведет в него, Apache блокируется, как только он видит, что путь начинается с «/ VAR». ,

Предполагая, что этот скрипт PHP находится в том же каталоге, что и файл id.txt, просто используйте

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

Или если текстовый файл был в подкаталоге

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

Мало того, что это безопасно, это намного короче, чтобы напечатать также.

-1
По вопросам рекламы [email protected]