Разрешения с mkdir не будут работать

#php #linux

#php #linux

Вопрос:

Я не могу понять, почему я должен использовать chmod для получения правильных разрешений.. Файл создан успешно, но с 0755, а не с 0775, который я указываю в mkdir .

( http://php.net/manual/en/function.mkdir.php )

Я должен сделать chmod после mkdir , чтобы установить правильные разрешения.

Безопасный режим в php.ini отключен, и папка принадлежит группе php и владельцу (www-data)

Это не работает:

   if(!is_dir("/var/www/customers/$username/$project_name")) 
  {
    mkdir("/var/www/customers/$username/$project_name",0775);

  }
  

Но это делает:

   if(!is_dir("/var/www/customers/$username/$project_name")) 
  {
    mkdir("/var/www/customers/$username/$project_name");
    chmod("/var/www/customers/$username/$project_name",0775);

  }
  

Ответ №1:

Да, это из-за umask…

из комментариев к документам: http://php.net/manual/en/function.mkdir.php

Вы можете заметить, что при создании нового каталога с использованием этого кода:

mkdir($ dir, 0777);

Созданная папка на самом деле имеет разрешения 0755, вместо указанного 0777. Почему вы спрашиваете? Из-за umask():http://php.net/manual/en/function.umask.php

Значение umask по умолчанию, по крайней мере, в моей настройке, равно 18. Которое равно 22 восьмеричному числу или 0022. Это означает, что когда вы используете mkdir() для CHMOD созданной папки в 0777, PHP принимает 0777 и вычитает текущее значение umask, в нашем случае 0022, так что результатом будет 0755 — что, вероятно, не то, что вы хотели.

«Исправить» это просто, включите эту строку:

$old_umask = umask(0);

Прямо перед созданием папки с mkdir(), чтобы фактическое значение, которое вы вводите, использовалось в качестве CHMOD. Если вы хотите вернуть umask к его исходному значению, когда закончите, используйте это:

umask($old_umask);

Комментарии:

1. значит, umask не влияет на chmod?

2. нет … umask влияет на вас только при создании папок / файлов.

Ответ №2:

Я думаю, вам, возможно, придется изменить вашу umask.

Как указано на странице руководства mkdir:

Режим также изменяется текущей umask, которую вы можете изменить с помощью umask().

Теперь, глядя на справочную страницу umask (), один из перечисленных комментариев подтверждает мою внутреннюю мысль:

«Лучше изменить права доступа к файлу с помощью chmod() после создания файла».

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

Настройте свою umask так, чтобы файлы создавались конфиденциально для вашего пользователя, затем используйте chmod, чтобы открыть их.

Комментарии:

1. Чтобы уточнить, на общем сервере использование chmod после создания абсолютно не более безопасно. Кто-то мог бы скрыть крошечный скрипт для получения уведомлений о вновь созданных файлах с распространенными именами, такими как LocalSettings, и захватить дескриптор файла в момент его создания; затем он может прочитать его даже после того, как он будет изменен и вы добавите туда свои данные пароля. Это не относится к большинству настроек хостинга, но по привычке в UNIX вы всегда должны создавать файлы с теми разрешениями, которые вы им предоставляете.

2. @Nicholas Я заметил, что существует противоречивая информация по вопросу разрешений на создание файлов. На мой взгляд, разумно или безопасно использовать chmod () для файла после создания, когда вы хотите предоставить дополнительные разрешения вместо их удаления. Например, совершенно безопасно установить для umask значение 0077, а затем изменить chm для файлов, которые вы создаете впоследствии. Создание файла и последующее удаление разрешений — это сценарий, в котором существует (очень минимальный) риск для безопасности. Я думаю, что шансы злоумышленника получить дескриптор файла для вновь созданного файла между двумя вызовами функции очень, очень малы.

Ответ №3:

Попробуйте вызвать эту функцию, прежде чем создавать свой каталог: clearstatcache(); Также, возможно, вам следует проверить, можете ли вы сделать это, используя только mkdir, если вы подключаетесь к другому пользователю.