Как защитить composer.json и /vendor в production-среде?

280
04 сентября 2021, 02:10

Вопрос следует сформулировать более широко: насколько вообще безопасно размещение директория /vendor в структуре сайте в production-среде?

То есть сейчас я могу сделать вызов http://mysite.com/composer.json или http://mysite.com/vendor/composer/installed.json и увидеть содержимое файлов.

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

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

А есть ли альтернативные способы? Кто и как решает эту задачу в продакшене?

Answer 1

Допустим, вам проект находится в c:\inetpub\site1.ru. На примере cakephp структура папок проекта выглядит следующим образом

\config
\src
 --\controller
 --\template
\tmp
\vendor
\webroot        -- папка, которая должна играть роль корня сайта
 --\css
 --\img
 --\js
 --\index.php
\composer.json
\index.php
\web.config    -- конфиг для IIS

в терминах апача у вашего сайта долженбыть указан document root, папка которая собственна и видна снаружи. Все http-запросы приходят сюда, а вот код, может иметь доступ и к папкам верхнего уровня. Фактически в IIS такой настройки и и нет и корнем является сама папка проекта. Но! index.php (в папке сайта) в данном случае имеет одну строку кода

require 'webroot' . DIRECTORY_SEPARATOR . 'index.php';

а webconfig должен настроить перенаправление всего, что приходит, в webroot. Правила описываются в разделе

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>

Далее сначала мы игнорируем прямые запросы к site.ru/webroot

<rule name="Exclude direct access to webroot/*" stopProcessing="true">
    <match url="^webroot/(.*)$" ignoreCase="false" />
    <action type="None" />
</rule>             

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

 <rule name="Rewrite routed access to assets(img, css, files, js, favicon)" stopProcessing="true">
     <match url="^(img|css|js|fonts|favicon.ico|favicon.png|robots.txt)(.*)$" />
     <action type="Rewrite" url="webroot/{R:1}{R:2}" appendQueryString="false" />
 </rule>                

а все остальные запросы мы перенаправляем в index.php (что в целом справедливо для любого фреймворка)

 <rule name="Rewrite requested file/folder to index.php" stopProcessing="true">
       <match url="^(.*)$" ignoreCase="false" />
       <action type="Rewrite" url="index.php" appendQueryString="true" />
 </rule>

таким образом клиент может обратиться только к содержимому папки webroot, и не видит ни composer.json ни vendor и ничего иного, чего ему не положено видеть.

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

Answer 2

Серверному коду в document_root вебсервера вовсе нечего делать. В document_root должен быть index.php. И всё, всё остальное здесь не нужно и размещается где-то уровнем выше.

laravel

After installing Laravel, you should configure your web server's document / web root to be the public directory. The index.php in this directory serves as the front controller for all HTTP requests entering your application.

Yii

By setting basic/web as the document root, you also prevent end users from accessing your private application code and sensitive data files that are stored in the sibling directories of basic/web. Denying access to those other folders is a security improvement.

symfony

The public directory is the home of all of your application's public and static files, including images, stylesheets and JavaScript files. It is also where the front controller (index.php) lives.

The public directory serves as the document root when configuring your web server. In the examples below, the public/ directory will be the document root. This directory is /var/www/project/public/.

Что там ещё из популярного? Уверен что найдёте в документации всё то же самое: document_root вашего веб-сервера должен смотреть куда-то внутрь проекта, но не в корень. Следовательно, вас вовсе никак не волнует что кто-то попытается загрузить что-то. Пусть пытается, для веб-сервера существуют файлы в document_root, где лежит только то что вы сами решили публиковать.

Иначе говоря, нормальная структура проекта:

.
.git/
.gitignore
/vendor/
/public/
/public/index.php
composer.json
composer.lock

Веб-сервер смотрит строго в public.

READ ALSO
корзина в telegram bot

корзина в telegram bot

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

196
Thread pool и ForkJoin pool

Thread pool и ForkJoin pool

Я делаю свой домашний проект и столкнулся с проблемой производительностиВ моей бд лежит около 10000 записей, в каждой записи лежит ссылка

203
Java веб стэк технологий

Java веб стэк технологий

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

156
Бесконечное меню

Бесконечное меню

Здраствуйте, может кто знает, как сделать так, чтобы меню бесконечно повторялось после выполнение задания (выход с меню в 4 пункте есть)То...

345