Nie tak dawno opisywaliśmy bezpieczeństwo w wordpressie. Dziś chcemy Ci przybliżyć jego aspekty w przypadku Symfony – popularnym frameworku PHP bazującym na wzorcu projektowym MVC. Od 2011 roku był on wykorzystywany w dużych projektach webowych takich jak Drupal, phpBB, eZ Platform, OROCRM i Joomla. Symfony dostarcza nam wiele gotowych modułów, które ułatwiają tworzenie aplikacji webowych. Trzeba jednak pamiętać, że bezpieczeństwo jest kluczowym elementem każdego projektu i dlatego pokażemy Ci najważniejsze zabezpieczenia o których należy pamiętać budując projekty z użyciem Symfony.

1. Uwierzytelnienie

Zacznijmy od wytłumaczenia różnicy między uwierzytelnieniem a autoryzacją. Uwierzytelnianie jest odpowiedzialne za jednoznaczną weryfikację tożsamości, którą potwierdzamy np. przy pomocy hasła. Autoryzacja to sprawdzenie jaki poziom dostępu ma uwierzytelniona osoba. Przy pomocy autoryzacji system sprawdza czy użytkownik ma prawa podstawowe, czy rozszerzone (administrator).

W Symfony, konfiguracja uwierzytelnienia przebiega w pliku security.yaml, który zawiera większość ustawień dotyczących bezpieczeństwa. Definicję tworzymy przy pomoc klucza firewalls. Funkcjonalność ta jest niezbędna gdy chcesz, by użytkownicy serwisu mieli swoje konta, bo dzięki niej będziesz wymagał od nich haseł. W celu przechowywania ich skrótów zalecamy korzystanie z funkcji bcrypt, bo korzysta ona z soli przy hashowaniu.

2. Autoryzacja

Autoryzacja może być skonfigurowana na wiele sposobów. Jednym z ciekawszych rozwiązań jest wykorzystanie Access Decision Managera oraz wyborców (voters). Każdy z wyborców decyduje, czy bieżący użytkownik powinien mieć dostęp do danych zasobów, czy nie. Następnie Manager podejmuje decyzję o dostępie bazując na danych dostarczonych przez wyborców. Może on przyjąć różne strategie:

  • affirmative – przyznać dostęp, gdy przynajmniej jeden wyborca wyrazi zgodę

  • consensus – przyznać dostęp, gdy więcej wyborców jest za niż przeciw

  • unanimous – przyznać dostęp, gdy wszyscy wyborcy wyrażą zgodę

Tu chcielibyśmy również wspomnieć, że prawidłowym terminem stosowanym w języku polskim jest uwierzytelnianie, a nie spolszczenie słowa angielskiego – autentykacja. Słowo autentykacja nie występuje w języku polskim, a dość łatwo o tym zapomnieć, zwłaszcza działając w branży IT, przesyconej podobnymi terminami 😉

3. Wymuszenie szyfrowania połączenia (https)

Na pewno wiesz, że w celu podniesienia bezpieczeństwa aplikacji zalecane jest korzystanie z protokołu komunikacyjnego https. Symfony daje możliwość wymuszenia korzystania z niego przy pomocy komponentu Routing. Wymóg użycia https jest również nałożony na ruch przychodzący do aplikacji, co oznacza, że każde żądanie zostanie automatycznie przekierowane na ten sam URL przy użyciu https.

Warto przyjrzeć się bliżej tematowi https, ponieważ przeglądarki nie lubią, gdy przesyłamy nieszyfrowane dane. Więcej informacji na ten temat możecie znaleźć w naszym artykule Dlaczego Twoja strona potrzebuje certyfikatu SSL przed 1 lipca.

4. Mini audyt bezpieczeństwa

Wraz z rozrostem projektu, zaczynasz korzystać z coraz większej ilości zależności. Na szczęcie Symfony przychodzi z pomocą, a dokładniej, z komendą security:check. Sprawdza ona bezpieczeństwo zależności. Działanie komendy opiera się o analizę pliku composer.lock pod kątem wykrycia znanych luk bezpieczeństwa w używanych zależnościach.

Korzystaj z tej komendy jak najczęściej, żeby być na bieżąco z najświeższymi lukami w zabezpieczeniach. Każdorazowo warto dodać ją do builda.

Więcej informacji na ten temat możesz znaleźć w oficialnym repozytorium.

5. Cross-site request forgery (CSRF)

Cross site request forgery jest metodą ataku wykorzystującą przeglądarkę zalogowanego użytkownika do wysłania spreparowanego zapytania w jego imieniu. Serwis internetowy odbiera to żądanie tak, jakby wysłał je uwierzytelniony i zautoryzowany użytkownik, ponieważ atakujący wykorzystuje ciasteczko zestawionej sesji.

Symfony dostarcza funkcjonalność, która chroni przed atakami CSRF. Polega ona na dodaniu ukrytego tokena w wysyłanych żądaniach. Token ten jest unikalny dla każdego użytkownika i jest znany wyłącznie użytkownikowi oraz aplikacji.

6. Cross Site Scripting (XSS)

Cross Site Scripting jest typem ataku skierowanym na użytkowników serwisów internetowych. Jego działanie polega na umieszczeniu skryptu (zazwyczaj javascript) w serwisie webowym, a następnie wywołanie go lub zaczekanie aż wywoła go inny użytkownik.

Sposobem na radzenie sobie z próbą ataku XSS, jest filtrowanie (sanityzacja) danych wejściowych dostarczanych przez użytkowników w serwisie. Doskonałym przykładem może być tutaj uniemożliwienie wpisywania w polu komentarzy niektórych znaków specjalnych lub zezwolenie na wprowadzanie jedynie cyfr w polu numeru telefonu. Symfony ułatwia implementację ochrony przed XSS, wprowadzając weryfikację względem zdefiniowanych wcześniej ograniczeń. Więcej informacji na temat predefiniowanych ograniczeń znajdziesz w dokumentacji Symfony.

7. SQL injections

SQL injection jest atakiem skierowanym na bazy danych aplikacji. Polega na przesłaniu do serwisu fragmentu zapytania SQL dzięki któremu atakujący może ominąć uwierzytelnianie i wprowadzić zmiany w bazie lub uzyskać dostęp do poufnych danych.

Zabezpieczeniem przed takim atakiem jest, tak jak poprzednio, walidacja wprowadzanych przez użytkowników informacji. Wprowadzane dane trzeba również „uwalniać”, czyli poinstruować system, żeby nie interpretował tekstu jako skrypt tylko jako zwykły tekst (string).

Symfony samo w sobie nie obsługuje baz danych, za to jest dobrze zintegrowane z biblioteką Doctrine. Wykorzystanie tej biblioteki implementuje podstawowe zabezpieczenie przeciwko atakom SQL injection.

8. Testowanie aplikacji

Możesz starać się pisać niezawodne aplikacje, jednak nie będziesz pewny ich działania dopóki tego nie sprawdzisz. Testy programu możesz przeprowadzić np. przy pomocy frameworka PHPUnit. Umożliwia on wykonywanie zarówno testów funkcjonalnych jak i jednostkowych.

9. Aktualizacje

Niech Cię nie zmyli to, że o aktualizacjach piszemy na końcu. Chcielibyśmy, żebyś zawsze pamiętał, że nie ma lepszego sposobu na zabezpieczanie aplikacji, niż korzystanie z najnowszej wersji oprogramowania. Praktycznie każda aktualizacja niesie ze sobą zabezpieczenia przed ostatnio wykrytymi podatnościami oraz ważne poprawki.

Pamiętaj też, że to dopiero początek drogi do bezpiecznej aplikacji. Istnieje znacznie więcej elementów konfiguracji, które wymagają Twojej uwagi. Przeczytasz o nich w oficialnej dokumentacji Symfony.

A jeżeli znasz inne ciekawe sposoby na zabezpieczenie aplikacji, koniecznie opisz to w komentarzu 🙂