Подтвердить что ты не робот

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

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

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

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

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

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

Новый сервер имеет каталоги:

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

Мои вопросы

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

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

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

Ответ 3

Я закодировал функцию для решения проблем с разрешениями как в 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;
}

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

Ответ 4

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

2) register.php должен быть доступен в http://www.example.com/php/register.php, так как приложение java ищет его, поэтому в Apache htdocs, в нем должна быть папка "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 script (register.php), поэтому, поскольку register.php находится в htdocs/php/register.php, это приведет к тому, что db_login.php при htdocs/inc/db_login.php.

Ответ 5

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

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

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

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

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

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

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

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

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

С.