OWASP Top 10: podatności aplikacji webowych, które powinien znać każdy programista
OWASP Top 10 to regularnie aktualizowana lista najczęstszych i najpoważniejszych w skutkach podatności spotykanych w prawdziwych aplikacjach webowych, prowadzona przez znaną społeczność non-profit zajmującą się bezpieczeństwem. To nie abstrakcyjne zestawienie akademickie – powstaje na podstawie rzeczywistych danych o tym, co wciąż się psuje w oprogramowaniu produkcyjnym. Jeśli tworzycie lub wdrażacie aplikacje webowe, to podstawowa lista, którą warto naprawdę zrozumieć, a nie tylko raz przejrzeć.
Dlaczego ta lista znaczy więcej niż ogólna checklista w stylu „bezpieczeństwo przede wszystkim”
Porady dotyczące bezpieczeństwa są często zbyt ogólne, by dało się na ich podstawie cokolwiek zrobić. OWASP Top 10 jest przydatne właśnie dlatego, że jest konkretne – każda kategoria opisuje rzeczywistą, dobrze poznaną klasę błędów z dobrze ugruntowanymi rozwiązaniami. Oto, co poszczególne kategorie oznaczają w praktyce, w prostych słowach.
Kategorie w prostych słowach
Błędna kontrola dostępu
Chodzi o sytuacje, w których użytkownik może zrobić lub zobaczyć coś, czego nie powinien – na przykład podejrzeć dane innego użytkownika, zmieniając identyfikator w adresie URL, albo wejść na stronę administracyjną bez uprawnień administratora. To niezmiennie jedno z najczęstszych znalezisk w praktyce, bo kontrole dostępu muszą być poprawnie zastosowane na każdej trasie i przy każdej akcji, a wystarczy jedno pominięte sprawdzenie, by powstała prawdziwa luka.
Błędy kryptograficzne
Wrażliwe dane – hasła, dane płatnicze, dane osobowe – przechowywane lub przesyłane bez właściwej ochrony. Obejmuje to przechowywanie haseł otwartym tekstem lub ze słabym hashowaniem oraz przesyłanie wrażliwych danych przez nieszyfrowane połączenia.
Wstrzykiwanie (injection)
To szersza kategoria, do której należy SQL injection – każdy przypadek, w którym niezaufane dane wejściowe zostają zinterpretowane jako polecenia, a nie dane, niezależnie od tego, czy chodzi o zapytanie do bazy danych, polecenie systemowe, czy coś innego, co aplikacja wykonuje w imieniu użytkownika.
Niebezpieczny projekt
Niektóre podatności w ogóle nie są błędami implementacji – wynikają bezpośrednio z funkcji zaprojektowanej od początku bez myśli o bezpieczeństwie, jak proces resetowania hasła, który nie weryfikuje właściwie tożsamości. Ta kategoria przypomina, że bezpieczeństwo musi być częścią rozmowy o projekcie, a nie tylko etapem przeprowadzanym po napisaniu kodu.
Błędna konfiguracja zabezpieczeń
Nigdy niezmienione domyślne hasła administratora, niepotrzebne funkcje pozostawione włączone, zbyt szczegółowe komunikaty o błędach, które ujawniają każdemu odwiedzającemu wewnętrzne informacje o systemie. Często najłatwiejsza do naprawienia i najłatwiejsza do przeoczenia kategoria – właśnie dlatego, że nic z tego nie wymaga pisania nowego kodu.
Podatne i przestarzałe komponenty
Korzystanie z biblioteki, frameworka lub zależności ze znaną, publicznie ujawnioną podatnością. Problem narasta, bo nowoczesne aplikacje dociągają dziesiątki lub setki pakietów zewnętrznych, a każdy z nich może stanowić realne ryzyko, jeśli pozostanie bez poprawek.
Błędy identyfikacji i uwierzytelniania
Słabe wymagania dotyczące haseł, brak ochrony przed wielokrotnymi próbami logowania, obsługa sesji, które nie wygasają lub nie są poprawnie unieważniane. To kategoria, przez którą uwierzytelnianie wieloskładnikowe jest tak znaczącym usprawnieniem – chroni samo logowanie nawet wtedy, gdy inne elementy po cichu zawiodły.
Błędy integralności oprogramowania i danych
Ufanie danym lub kodowi ze źródła, które nie zostało właściwie zweryfikowane – na przykład mechanizm aktualizacji albo pipeline CI/CD, który nie potwierdza, że instalowany element jest rzeczywiście tym, za co się podaje.
Błędy logowania zdarzeń i monitorowania bezpieczeństwa
Bez właściwego logowania naruszenie może długo pozostać niezauważone, a nawet po jego wykryciu nie ma zapisów, które pozwoliłyby zrozumieć, co dokładnie się stało. Dobre logowanie nie zapobiega atakowi, ale radykalnie ogranicza szkody, jakie może on wyrządzić, zanim ktokolwiek go zauważy.
Fałszowanie żądań po stronie serwera (SSRF)
Nakłonienie serwera do wysłania żądania pod adres, do którego nie powinien mieć dostępu – często do systemu wewnętrznego, który nie jest bezpośrednio osiągalny z publicznego internetu.
Co właściwie zrobić z tą listą
Nie traktujcie jej jak materiału do egzaminu. Traktujcie ją jak prawdziwą checklistę dla własnego kodu: przy każdej kategorii uczciwie zapytajcie, czy wasza aplikacja została pod tym kątem konkretnie sprawdzona – a nie „pewnie jest w porządku, bo używamy nowoczesnego frameworka”. Frameworki pomagają, ale nie chronią w pełni przed decyzjami projektowymi, błędną konfiguracją ani jednym surowym zapytaniem, które ktoś napisał pod presją terminu.
Uporządkowany przegląd oparty dokładnie na tej liście – nie ogólny skan, ale rzeczywista analiza waszego konkretnego kodu i konfiguracji – to fundament pracy Burncode w zakresie bezpieczeństwa aplikacji, obok utwardzania infrastruktury i przygotowywania zespołów do prawdziwego audytu zgodności.