Какие разрешения для скриптов / каталогов PHP?

Я пытаюсь помочь другу переместить веб-сайт из одного веб-отеля в другой. Старое место уже закрыто, у меня есть только плоский tar-файл того, что было в нем.

Веб-сайт содержал документы HTML, и можно было загрузить небольшое приложение Java (для загрузки на мобильный телефон) для отправки данных на веб-сайт.

Мобильное приложение Java отправило строку в URL=<HOST>/php/register.php . Этот php-скрипт включал еще один php-скрипт ( ../inc/db_login.php ), который подключался к SQL-базе данных с помощью $link=mysql_connect() . Другой файл register.php сделал вставку SQL для размещения новых отправленных данных в БД.

Мой вопрос в основном, где я должен разместить эти 2 PHP-файла на новом веб-сайте и какие разрешения должны иметь каталоги и файлы?

Старый веб-сервер, очевидно, имел каталоги /php и /inc . Ни один из них не существует на новом веб-сервере. Должен ли я их создавать? Какое разрешение они должны иметь? Я предполагаю, что причиной наличия пароля в отдельном файле PHP была безопасность. В каталоге /php и /inc вероятно, были разные разрешения.

На новом сервере есть каталоги:

  • /httpdos
  • /httpsdos
  • /cgi-bin
  • /conf (и некоторые другие, вероятно, не имеют отношения к делу)

Мои вопросы

  1. Расширяет ли файл-расширение ( .php ) что-то на сервере: поскольку PHP-скрипты «включены» в HTML-код (между <?...?> , Нужно ли серверу искать суффикс файла или это не имеет значения? (Я понимаю, что сервер реагирует на <?...?> , Конечно)

  2. должен ли публичный файл ( register.php в моем случае) быть помещен в httpdocs/ или сервер (apache, я думаю) реагирует на что-то и извлекает его в другой каталог?

  3. Если PHP-скрипт имеет разрешение RX (чтение и выполнение), --X (выполнить) или R-- (читать)? С точки зрения ОС я предполагаю, что apache просто читает эти файлы, а это значит, что они должны быть R-- , но это будет означать, что если служба PHP «остановится», клиент получит весь код PHP в своем браузере (?). Я бы предпочел, чтобы это был --X но поскольку это не двоичный код и не имеет #! , Я думаю, это должно быть --R ?

  4. Если публичный PHP-скрипт может быть помещен в другой /httpdocs (например, /php вместо /httpdocs ), для чего нужно /php (и скрипт) иметь разрешение ?. Я предполагаю, что сервер должен знать об этом /php каталоге (или есть обычные значения по умолчанию?)

  5. Сценарий PHP, включенный ( ../inc/db_login.php , содержащий пароль SQL), не должен находиться под /httpdocs я думаю. Это означает, что мой register.php включает файл, который не находится под поддеревом /httpdocs . Это работает? Должен ли сервер знать?

Насколько я понимаю, вам может понадобиться знать конфигурацию сервера. Просто предположите, что по умолчанию в вашем ответе (и вы можете определить, где он изменился, если он есть).

Каталоги должны иметь разрешения на выполнение, которые могут быть использованы. Обычно это 0755 . PHP-скрипты, запущенные через mod_php , не выполняются, а читаются; 0644 этого достаточно 0644 . Каталоги, которые должны быть написаны, должны принадлежать пользователю, на котором работает веб-сервер. Могут возникнуть дополнительные проблемы в отношении разрешений, например SELinux, но приведенное выше поможет вам ознакомиться с основами.

Документы, к которым не должны обращаться другие пользователи или внешние клиенты, должны быть 0600 , принадлежащими пользователю веб-сервера и расположенным за пределами DocumentRoot. Обратите внимание, что запуск mod_php в безопасном режиме предотвратит появление сценариев из-за чего-либо вне DocumentRoot; жалобный недостаток.

Установить php-файлы на 640

Для максимальной безопасности вы должны установить минимальные разрешения, равные 640 .

  • Владелец 6 будет тем, кто загружает файлы.
  • Группа 4 будет той, которая обслуживает файл. Сделайте apache членом группы.
  • Никто не означает, что другие пользователи не могут прочитать этот файл. Это важно, так как у php-скриптов иногда есть пароли и другие конфиденциальные данные.

Никогда не позволяйте скриптам php читать все.

Полезные команды:

 chmod 640 file.php chown user:group file.php usermod -a -G group apache 

Что делают эти команды:

  1. Измените владельца файла file.php, чтобы пользователь мог читать и писать, читать группы.
  2. Измените владельца файла file.php на выбранное имя пользователя и имя группы.
  3. Добавьте apache в группу, чтобы apache мог обслуживать файл. В противном случае 640 не будет работать.

Я закодировал функцию для решения проблем с разрешениями как в PHP / SuPHP, так и в подобном:

 function realChmod($path, $chmod = null) { if (file_exists($path) === true) { if (is_null($chmod) === true) { $chmod = (is_file($path) === true) ? 644 : 755; if (in_array(get_current_user(), array('apache', 'httpd', 'nobody', 'system', 'webdaemon', 'www', 'www-data')) === true) { $chmod += 22; } } return chmod($path, octdec(intval($chmod))); } return false; } 

Может быть, это полезно для вас.

1) Файлы, которые заканчиваются расширением .php, передаются в PHP-компилятор Apache. Если для этой настройки не настроена надлежащая конфигурация, файлы PHP обрабатываются сервером как текстовые файлы. Конфигурационная строка Apache « AddHandler php5-script php » в файле httpd.conf – это метод PHP5 для его настройки.

2) register.php должен быть доступен по адресу http://www.example.com/php/register.php , поскольку приложение java ищет его, поэтому в папке htdocs Apache должен быть «php», папку с файлом register.php.

3) PHP-файлам нужен доступ для чтения пользователем, на котором запущена служба Apache. Использование PHP в качестве модуля Apache не имеет «службы», чтобы говорить об этом отдельно для PHP. Вместо этого служба Apache, когда она получает запрос на файл PHP, делает вызов оболочки для двоичного файла PHP для анализа файла и передает службе Apache результат, который он обслуживает для клиента. Только если вы используете PHP из командной строки (настройка CLI), скрипты должны выполнить разрешение на выполнение и начать с строки #!/path/to/php-bin .

4) Запрошенный файл (register.php) должен быть в htdocs для обслуживания Apache. Если PHP работает с отключенным «безопасным режимом», register.php может включать файл, который находится вне папки htdocs.

5) Путь « ../inc/db_login.php » относится к исходному сценарию PHP (register.php), поэтому, поскольку register.php находится в htdocs/php/register.php , это приведет к тому, что db_login .php в htdocs/inc/db_login.php .

Все файлы PHP, предназначенные для прямого обращения через URL-адреса, могут с радостью находиться в тех же каталогах, что и статический контент (это обычная практика).

Хорошая практика состоит в том, чтобы иметь хотя бы один каталог за пределами видимых с веб-сервера, чтобы содержать включенные файлы, но путь включения PHP должен содержать «.».

Я бы порекомендовал не помещать много нестандартных каталогов в вашу корневую файловую систему – по умолчанию веб-корты меняются по распределению, но я обычно говорю с чем-то вроде:

/ var / www / htdocs – в качестве документа root / usr / local / php – для включения файлов

Очевидно, что если вы намереваетесь запустить ваш сервер chrrot, они должны быть соответствующим образом отображены.

Все файлы должны быть доступны для чтения с помощью uid, под которым работает веб-сервер, однако, если вы можете ограничить доступность этого файла uid как можно больше, вы закрываете потенциальный вектор атаки.

Обычно я занимаюсь настройкой своих dirs как drwxrwSr-x, принадлежащим члену группы webdev с групповым владением в качестве команды webdev (httpd uid не входит в группу webdev), поэтому файлы -rw-rw-r – Поэтому любой пользователь в группе webdex может изменять файлы, а httpd uid может читать только файлы.

1) делает ли файл-расширение (.php) что-то серверу:

Да – прочитайте руководство по установке PHP.

C.