• Время чтения ~1 мин
  • 16.05.2023

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

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

Первое, что мы хотим сделать, думая о безопасности в нашем приложении Laravel, - это подумать о заголовках, которые мы не хотим раскрывать. Как правило, приложение по умолчанию отображает следующие заголовки:
X-Powered-By - Это отобразит технологический стек, на котором работает ваше приложение.
server/Server - это покажет серверную технологию, на которой запущено ваше приложение. Например, apache или nginx и т.д.

Первое, что мы хотим здесь сделать, это удалить эти заголовки.

Я работаю в компании под названием Treblle, которая похожа на Google Analytics для вашего API. Скоро мы выпустим новую проверку безопасности API , и я открыл исходный код промежуточного программного обеспечения , которое мы используем для сокрытия определенных заголовков. Это выглядит следующим образом:

final class RemoveHeaders
{
    public function handle(Request $request, Closure $next): Response
    {
        /**
         * @var Response $response
         */
        $response = $next($request);

        /**
         * @var string $header
         */
        foreach ((array) config('headers.remove') as $header) {
            $response->headers->remove(
                key: $header,
            );
        }
        return $response;
    }
}

Это промежуточное ПО проходит через настроенные заголовки в моем файле конфигурации и гарантирует, что они будут удалены из ответа, прежде чем вернуть его пользователю.

Следующее, что я обычно делаю здесь, это устанавливаю заголовок, Referrer-Policy когда no-referrer-when-downgrade запрос возвращается к тому же источнику, но не для каких-либо запросов между источниками. Я делаю это, используя другую часть промежуточного программного обеспечения:

final class SetReferrerPolicy
{
    public function handle(Request $request, Closure $next): Response
    {
        /**
         * @var Response $response
         */
        $response = $next($request);

        $response->headers->set(
            key: 'Referrer-Policy',
            values: config('headers.referrer-policy'),
        );
        return $response;
    }
}

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

Давайте немного поговорим о Strict-Transport-Security заголовке. Это сообщит клиенту/браузеру подключиться к нашему приложению по протоколу HTTPS и как долго должно действовать это правило. Этот заголовок помогает защитить пользователей приложения от атак типа "злоумышленник посередине". Вы также можете добавить в includeSubdomains этот заголовок, указав браузеру применить эту политику ко всем поддоменам веб-сайта.

final class StrictTransportSecurity
{
    public function handle(Request $request, \Closure $next): Response
    {
        /**
         * @var Response $response
         */
        $response = $next($request);

        $response->headers->set(
            key: 'Strict-Transport-Security',
            values: config('headers.strict-transport-security'),
        );
        return $response;
    }
}

Следующий заголовок, на который мне нравится смотреть, - это Content-Security-Policy заголовок, один из наиболее часто используемых. Я не создавал собственное промежуточное программное обеспечение для этого, так как у Spatie есть фантастический пакет , который вы можете использовать. Ссылка на статью Laravel News содержит отличные инструкции о том, как это настроить, поэтому я не буду вдаваться в подробности этого. Итак, идем дальше.

Ваш SSL-сертификат может иметь разные уровни прозрачности для ваших пользователей. Этот общедоступный механизм ведения журнала позволит любому контролировать выдачу сертификатов. Это поможет обнаружить и предотвратить такие вещи, как поддельные сертификаты. Он также имеет различные варианты конфигурации:
max-age укажет максимальное время (в секундах), за которое браузер должен запомнить политику.
enforce укажет, хотите ли вы, чтобы браузер применял политику. Если мы установим это значение true, браузер не будет разрешать подключения без SSL к вашему приложению.
report-uri укажет URL-адрес, по которому браузер должен отправлять любые отчеты о нарушениях политики CT вашего приложения.
Давайте посмотрим на промежуточное ПО для этого и посмотрим, что мы хотим сделать:

final class CertificateTransparencyPolicy
{
    public function handle(Request $request, \Closure $next): Response
    {
        /**
         * @var Response $response
         */
        $response = $next($request);

        $response->headers->set(
            key: 'Expect-CT',
            values: config('headers.certificate-transparency'),
        );
        return $response;
    }
}

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

Последнее промежуточное программное обеспечение, Permissions-Policy на которое мы хотим обратить внимание, - это заголовок. Мы можем использовать этот заголовок, чтобы сообщить браузеру, какие функции и API браузеру разрешено использовать. Это поможет защитить вас от таких вещей, как XSS-атаки и кликджекинг.

final class PermissionsPolicy
{
    public function handle(Request $request, \Closure $next): Response
    {
        /**
         * @var Response $response
         */
        $response = $next($request);

        $response->headers->set(
            key: 'Permissions-Policy',
            values: config('headers.permissions-policy'),
        );
        return $response;
    }
}

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

Есть ли у вас какое-либо дополнительное промежуточное программное обеспечение, которое вы используете? Или, может быть, конкретная настройка для одного из перечисленных? Расскажите нам об этом в Twitter!

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297