Как создать каталог вне текущего каталога?

#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