У меня возникла идея написать простой скрипт для создания файла конфигурации 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;
}
}