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!