Начинать нужно с запрета функции
chmod и
chown в
php.ini — иначе все манипуляции с правами будут бессмысленны, так как любой шелл сможет поменять права ваших файлов и снять все ваши запреты. Битовые значения прав, как уже было отмечено выше, всегда выставляются по ситуации. Универсального рецепта нет. Существует 3 вида прав:
- Права владельца файла
- Права группы пользователей
- Публичные права
Если вы имеете аккаунт на shared хостинге, то установка публичных прав
xx7 будет означать, что любой пользователь этого хостинга потенциально сможет произвести над файлом любые манипуляции. Хостинги взламывают, вместе с ними взламывают сайты клиентов. Хостинги не афишируют факты взломов, клиенты ничего не знают, думают, что если шелл на сайте появился, то это "само прилетело". Поэтому права
xx7 на shared хостингах = самоубийство. Публичные права в этом случае целесообразно для всех файлов и директорий поставить как
xx0. Хостеры могут объединять пользователей в группы, поэтому и для групп желательно выставить
x0x. То есть, только владелец должен иметь право читать, писать и исполнять файл. Следовательно, в данном случае, нужны права
700 для папок и
600 для файлов. Это позволит ограничить доступ к файлам посторонним пользователям, которые имеются на сервере. В данной конфигурации ниже
chmod 700/600 выставить права не получится, потому что в противном случае владелец файлов/пользователь не сможет иметь к ним доступ, например, если захочет отредактировать файлы через FTP или перезалить их. Публичные файлы, например изображения, скрипты, стили,
robots.txt,
sitemap.xml, другие файлы которые должны быть доступны извне, и папки, в которых они лежат, должны быть открыты публично (644 и 755). Все остальные файлы и папки должны быть закрыты (600 и 700).
При установке прав нужно отталкиваться от того,
под каким пользователем стартует пул PHP. Если PHP стартует под пользователем, совпадающим с владельцем файлов и папок (так почти всегда и бывает), то для любого шелла права
755 будет означать
777, а
644 будет означать
666. В этом случае не стоит париться вообще ни о чём — каталоги и файлы "дырявые", и вы не измените это никак. Можно запретить читать и писать файлы самому себе, тем самым вы запретите файлы для чтения и/или записи серверу, но это безумие.
Для того, чтобы запретить что-либо для сервера не во вред себе, нужно отделить себя от сервера, то есть пул будет работать под одним пользователем, вы будете работать под другим пользователем. Вы сможете делать с файлами всё, что захотите, имея права 7xx для директорий, 6xx для файлов, сервер будет иметь права x5x для директорий, x4x для файлов, если вы внесёте себя и сервер в одну группу и установите эту группу по умолчанию для себя (при создании файлов для них будет назначен владелец — Вы и группа-владелец, то есть Вы и сервер). Если Вы на VDS или дедике, владеете им единолично, посторонних пользователей нет вообще, то в этом случае установка группы не требуется. Для файлов можно установить права xx4, для директорий xx5 — собственно, это установлено по умолчанию: 644 и 755.
Проблема заключается в том, что на shared хостинге у вас нет доступа к конфигу PHP, вы не можете изменить его владельца, создать группу и разграничить пользователей, поэтому любые манипуляции с правами не целесообразны. Но если Вы на VDS, то при разграничении прав Вы фактически сводите к нулю вероятность того, что сервер без вашего ведома что-то напишет в публичных директориях, а любая попытка несанкционированного доступа будет отображаться в логе ошибок, что позволит легко определить скрипт, пытающийся что-то написать.
Вы сможете разрешить серверу запись файлов только там, где это необходимо, например в папках logs, tmp, cache, images. Для этого нужно установить права
770 (группа пользователь/сервер) или
707 (пользователь, группы нет, сервер) для этих каталогов, а для файлов на запись, соответственно, устанавливаются права
660 или
606. Если какое-то расширение куда-то пишет файл, то этот файл также можно вычислить по логам и открыть к нему доступ. Тем самым ничего без Вашего ведома в публичных директориях происходить не будет. Если нужно, например, обновить или установить расширения, обновить CMS, то перед этим необходимо открыть все каталоги и файлы на запись рекурсивно с помощью консоли или FTP менеджера, но после массовых манипуляций с файлами, файлы и каталоги необходимо снова закрыть (или же проще — поставить в качестве владельца файлов сервер, обновить расширения/CMS, а потом снова поставить владельцем себя). Вы можете также сделать файл недоступным ни для сервера, ни извне, выставив права
700 и
600, при этом файл останется для Вас открытым (обратите внимание, что на shared хостинге такие права будут означать полный доступ для чтения и записи для сервера).
Всё вышесказанное — ИМХО.