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

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

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

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

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

  • имя исполняемого файла, .php, .py, .pl и т. д.
  • папки не обязательно должны быть доступны напрямую (но все равно создайте конфигурацию на основе каждого файла в этих папках)
  • ограничения скорости для каждой папки или, по крайней мере, для файлов, с которыми сталкивается пользователь

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

решение1

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

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

Соблюдение этих общих правил — хороший подход к созданию безопасного веб-сервера или сервера веб-приложений.

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

Все 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;
  }
}

Связанный контент