• Czas czytania ~4 min
  • 16.05.2023

Oprogramowanie pośredniczące nie jest niczym nowym. Używamy go w naszych aplikacjach od dłuższego czasu do różnych zastosowań, od uwierzytelniania po autoryzację i nie tylko.

W tym samouczku omówię, w jaki sposób można wykorzystać moc oprogramowania pośredniczącego w aplikacji Laravel, aby zwiększyć bezpieczeństwo aplikacji. Możesz dodać niezliczone nagłówki do swojej aplikacji, które robią różne rzeczy. Zanurzmy się w kilku różnych nagłówkach bezpieczeństwa, aby zobaczyć, co robią - i co lubię robić w moich aplikacjach.

Pierwszą rzeczą, którą chcemy zrobić, myśląc o bezpieczeństwie w naszej aplikacji Laravel, jest zastanowienie się nad nagłówkami, których nie chcemy ujawniać. Zazwyczaj aplikacja domyślnie wyświetla następujące nagłówki:
X-Powered-By - Spowoduje to wyświetlenie stosu technicznego, na którym zasilana jest aplikacja.
server/Server - Spowoduje to ujawnienie technologii serwera, na którym działa Twoja aplikacja. Na przykład, apache lub nginx itp.

Pierwszą rzeczą, którą chcemy tutaj zrobić, jest usunięcie tych nagłówków.

Pracuję dla firmy Treblle, która jest jak Google Analytics dla twojego API. Wkrótce wydamy nowy test bezpieczeństwa API , a ja udostępniłem oprogramowanie pośredniczące , którego używamy do ukrywania określonych nagłówków. Wygląda to następująco:

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;
    }
}

To oprogramowanie pośredniczące przechodzi przez skonfigurowane nagłówki w moim pliku konfiguracyjnym i zapewnia, że zostaną one usunięte z odpowiedzi przed zwróceniem jej użytkownikowi.

Następną rzeczą, którą zwykle tutaj robię, jest ustawienie Referrer-Policy nagłówka na no-referrer-when-downgrade moment, w którym żądanie powraca do tego samego źródła - ale nie dla żadnych żądań między źródłami. Robię to za pomocą innego oprogramowania pośredniczącego: Dzielę te działania na oddzielne klasy oprogramowania pośredniczącego, aby móc określić poziom,

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;
    }
}

który jest dla mnie ważny w odniesieniu do bezpieczeństwa w każdej trasie. Chcę być bardziej otwarty na niektóre trasy, podczas gdy chcę, aby były nieco mniej otwarte dla innych.

Porozmawiajmy przez chwilę o nagłówku Strict-Transport-Security . To powie klientowi/przeglądarce, aby połączyć się z naszą aplikacją za pomocą HTTPS i jak długo ta reguła powinna obowiązywać. Ten nagłówek pomaga chronić użytkowników aplikacji przed atakami typu man-in-the-middle. Możesz również dodać do tego nagłówka, informując przeglądarkę, aby stosowała includeSubdomains tę zasadę do wszystkich subdomen witryny.

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;
    }
}

Poniższy nagłówek, na który lubię patrzeć, to Content-Security-Policy nagłówek, jeden z częściej używanych. Nie stworzyłem dla tego niestandardowego oprogramowania pośredniczącego, ponieważ Spatie ma fantastyczny pakiet , którego możesz użyć. Powiązany artykuł Laravel News zawiera doskonałe instrukcje, jak to skonfigurować, więc nie będę omawiał szczegółów tego. Idźmy więc dalej.

Certyfikat SSL może mieć różne poziomy przezroczystości dla użytkowników. Ten publiczny mechanizm rejestrowania pozwoli każdemu monitorować wydawanie certyfikatów. Pomoże to wykryć i zapobiec takim rzeczom, jak fałszywe certyfikaty. Posiada również różne opcje konfiguracji:
max-age określi maksymalny czas (w sekundach), przez który przeglądarka powinna zapamiętać politykę.
enforce określi, czy przeglądarka ma wymuszać zasady. Jeśli ustawimy tę wartość na true, przeglądarka nie zezwoli na połączenia bez SSL z Twoją aplikacją.
report-uri określi adres URL, pod którym przeglądarka powinna wysyłać wszelkie raporty o naruszeniach zasad CT aplikacji.
Spójrzmy na oprogramowanie pośredniczące i zobaczmy, co chcemy zrobić:

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;
    }
}

Jak widać, niektóre z tych klas oprogramowania pośredniczącego są proste. Połączenie ich zapewni najlepszą ochronę przed potencjalnymi atakami.

Ostatnim oprogramowaniem pośredniczącym, któremu chcemy się przyjrzeć, jest Permissions-Policy nagłówek. Możemy użyć tego nagłówka, aby poinformować przeglądarkę, z jakich funkcji i interfejsów API przeglądarka może korzystać. Pomoże to chronić Cię przed atakami XSS i click-jackingiem.

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;
    }
}

Korzystając z tego oprogramowania pośredniczącego, mogę szczegółowo określić funkcje, które chcę włączyć, co oznacza, że mogę zapewnić większe bezpieczeństwo mojemu użytkownikowi końcowemu i sobie.

Czy masz jakieś dodatkowe oprogramowanie pośredniczące, którego używasz? A może konkretne ustawienie dla jednego z wymienionych? Daj nam znać na Twitterze!

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

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...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297