#php #linux #ubuntu #file-upload #permissions
#php #linux #ubuntu #загрузка файла #разрешения
Вопрос:
Я пытаюсь создать безопасный способ обработки загрузки файлов, загружая файлы в каталог за пределами public_html
.
Я тестирую свой скрипт, и мой скрипт работает при выполнении sudo php receive_files.php
, но когда я запускаю receive_files.php без sudo
я получаю failed to open stream: Permission denied.
Прямо сейчас все разрешения, вплоть до var/www/html/mysite/public_html
, установлены на 755. Я попытался изменить все из них на 775, но команда по-прежнему не работала без sudo
. И я почти уверен, что это было бы небезопасно. Как мне обойти эту проблему?
Мой код:
$encoded_file = $_POST['file'];
$user_id = $_POST['user_id'];
$decoded_file = base64_decode($encoded_file);
$new_directory = "../../../../../../user_uploads/$user_id/";
if(!file_exists($new_directory)){
mkdir($new_directory, 0775, true);
file_put_contents($new_directory . $decoded_file);
}
Комментарии:
1. Разрешения работают следующим образом: xyz — x = владелец, y = группа, z = все. Если вы измените разрешение на 775 и запустите файл в командной строке, пользователь, от имени которого вы запускаете команду, должен либо владеть путем, либо быть в группе, которой принадлежит путь. Пожалуйста, добавьте выходные данные
ls -l user_uploads
иwhoami amp;amp; groups
. Это должно прояснить, есть ли какие-либо проблемы с разрешениями2. Все var/www/ и его подкаталоги принадлежат root и принадлежат корневой группе. То есть вы хотите сказать, что я должен сменить владельца и группу на www-data?
3. Веб-серверу (т.Е. www-data) необходим доступ к файлам (чтение / запись в зависимости от файла), и вам нужен доступ к файлам, если вы собираетесь запускать команды от имени другого пользователя, а не www-data (или пользователя, входящего в группу www-data).
4. Итак, как для тестирования, так и для запуска его из веб-интерфейса, я мог бы добавить www-data и себя в группу, скажем, scriptgroup. Тогда я мог бы имитировать предупреждения / уведомления php, когда пользователь загружает из веб-интерфейса?
5. Просто добавьте себя в www-группу, добавьте веб-каталог / files в www-группу и установите необходимые разрешения для группового разрешения, т.Е.
chmod -R x7z user_uploads
Ответ №1:
Sudo требуется, когда вы не являетесь владельцем чего-либо или пытаетесь изменить разрешения. Итак, если вы хотите, чтобы php-скрипт имел доступ к верхнему каталогу. Измените группу или пользователя-владельца верхнего каталога, такого же, как у php executor, в большинстве случаев его www-данные
Вы можете проверить владельца php-скрипта, используя
ls -al
Затем измените владельца, используя
chown -hR www-data:www-data directorypath
Для получения более подробной информации ознакомьтесь с руководством по команде chown
Это, скорее всего, решит вашу проблему
Дополнительная информация
указание абсолютного пути вместо относительного решило проблему
Комментарии:
1. Я попытался изменить владельца и группу на www-data:www-data для /var / и подкаталогов вплоть до receive.php (все эти каталоги: var/www/html/mysite/public_html/receive.php ) но я получаю ту же ошибку
2. Работает ли ваш скрипт в public_html, я имею в виду, когда вы создаете непосредственно внутри public_html
3. Да, это так. Ранее у меня все работало с файлами, записанными в public_html, и все, что я сделал, это добавил ../../../../../../ в переменную $new_directory
4. Попробуйте использовать полный путь вместо относительного пути, например /var/ html /somedir
5. также проверьте комментарии относительно umask по этому php.net/manual/en/function.mkdir.php