• Час читання ~4 хв
  • 16.05.2023

Middleware не є чимось новим. Ми вже досить давно використовуємо його в наших додатках для різних застосувань, від аутентифікації до авторизації та не тільки.

У цьому підручнику я розповім, як ви можете використовувати потужність проміжного програмного забезпечення у вашому додатку 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;
    }
}

перш ніж повернути її користувачеві.

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

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-адресу, куди браузер повинен надсилати будь-які повідомлення про порушення політики КТ вашого додатка.
Давайте подивимося на проміжне програмне забезпечення для цього і подивимося, що ми хочемо зробити:

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