Назад | Перейти на главную страницу

Укажите все файлы php в конфигурации Nginx, чтобы сделать указанное приложение php более безопасным (nginx)

У меня появилась идея написать простой скрипт для создания файла конфигурации Nginx на основе набора файлов, которые можно было бы запустить. В моем случае это будут файлы .php из приложения. Сценарий просто создает запись конфигурации Nginx для каждого отдельного файла .php в каталоге, где будут находиться файлы .php.

На мой взгляд, указание каждого отдельного файла приложения запретило бы несанкционированное выполнение, и когда рассматриваемое приложение запускается очень просто из указанных файлов php, его должно быть легко реализовать в конфигурации Nginx. Возможно, сценарий также сможет понять, как установить общие пределы скорости для доступных пользователю файлов php и файлов, которые никогда не нужно будет видеть пользователю.

Таким образом, как я вижу идеальный сценарий, он будет создавать конфигурацию, основанную как минимум на этих свойствах:

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

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

Чтобы защитить файлы, сценарии и папки от общего доступа, я рекомендую хранить их не в корневой папке Интернета или ниже ее.

Следование этим общим правилам - хороший способ получить безопасный веб-сервер или сервер веб-приложений.

Чтобы быть более конкретным в отношении вашего случая, я бы рекомендовал хранить (как уже упоминал Майкл Хэмптон) только ваш index.php (и все необходимые изображения и общедоступные JavaScripts) в вашей корневой веб-папке.

Все классы PHP, которые вам понадобятся для предоставления вашего API или приложения, должны храниться отдельно от вашей корневой веб-папки, а также ваших файлов Composer (обычно хранящихся в папке vendor).

Пример структуры:

/project_root
  /htdocs (web root folder)
    index.php
    favicon.ico
    robots.txt
    /images
      logo.png
      background.png
    /javascript
      script.js
  /src
    /php
      /api
        /controller
          /overview
            get.php
          /login
            get.php
            put.php
            delete.php
            post.php
    /javascript
      base.js
      /reload
        plugin.js
  /vendor
    autoload.php

В приведенном выше примере следующая конфигурация Nginx предоставит ваше приложение:

server {

  ...

  # take care to deliver public static content if file exists
  # or execute /index.php if not
  location / {
    try_files $uri /index.php;
  }

  ...

  # do not execute /index.php if requested image or JavaScript does not exists
  location ~ ^/(images|javascript)/ {
    try_files $uri =404;
  }

  ...

  # execute PHP files
  location ~ \.php$ {
    try_files            $uri /index.php;
    include              fastcgi_params;
    fastcgi_keep_conn    on;
    fastcgi_pass         unix:/run/php/php7.2-fpm.sock;
    fastcgi_param        SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param        SCRIPT_NAME     $fastcgi_script_name;
  }
}