Przejdź do treści
← Powrót do bloga

Opublikowano 7 października 2026 · 4 min czytania

Trzy sposoby sprawdzenia zabezpieczeń skłamały. Czwarty nie potrafił

W moim panelu każde wejście broni się samo. Nie ma warstwy z góry, która przepuszcza albo odrzuca ruch — jest jedna linijka sprawdzająca sesję, powtórzona w każdym pliku z osobna. Zapomnienie jej daje otwarte wejście bez żadnego objawu: kod się kompiluje, testy przechodzą, panel działa.

6 sierpnia 2026 policzyłem, ile tych wejść jest naprawdę i które z nich odmawiają. Wyszło 266 uchwytów HTTP w 188 plikach. Interesująca jest nie liczba, tylko to, że trzy pierwsze sposoby jej policzenia dały złą odpowiedź.

Trzy metody, trzy kłamstwa

Szukanie po pliku. Plik potrafi mieć cztery wejścia i jedno sprawdzenie sesji. Przy poprzednim audycie ta metoda naliczyła dziewięć tras publicznych. Naprawdę publicznych wejść było szesnaście, w czternastu plikach — pięć z tych plików wspominało sprawdzenie sesji w komentarzu, więc wyszukiwarka uznała je za chronione. Wynik wyglądał jak wynik.

Szukanie po pojedynczym wejściu. Lepsze, ale ochrona bywa o jedno wywołanie dalej — wejście woła funkcję, a sprawdzenie siedzi w niej. Ta metoda pokazała 21 dziur, z czego prawdziwych zero.

Liczenie plików zamiast wejść. Popełnione przeze mnie w dokumencie, który ostrzegał przed metodą pierwszą: napisałem „osiem stron publicznych", a uchwytów jest dziesięć. Ta sama pomyłka, w zdaniu przestrzegającym przed nią.

Sonda zamiast czytania

Rozstrzygnęło dopiero strzelanie na żywo. Uruchomiłem system lokalnie, wyłączyłem deweloperskie obejście logowania i wysłałem żądanie do każdego z 266 wejść — bez ciastka sesji, bez żadnego nagłówka uwierzytelniającego.

252 odmówiły. 14 odpowiedziało, każde z nazwanym mechanizmem, który pilnuje go zamiast sesji: formularz kontaktowy z hamulcem na liczbę zgłoszeń, dane z definicji publiczne, dokumenty otwierane linkiem, w którym token pełni rolę hasła.

I tu zaczyna się właściwa część.

Sprawdzenie, które widzi same odmowy, może być zepsute

Sonda, która na wszystko odpowiada „odmówiono", wygląda identycznie niezależnie od tego, czy system jest szczelny, czy ona sama nie działa. Zieleń na całej liście nie jest dowodem — jest brakiem informacji.

Dlatego dowodu szukałem w jej własnych wynikach: jedno wejście oddało pełne dane, inne odrzuciło żądanie z powodu błędnie wypełnionego formularza. Gdyby sonda była zepsuta, te dwa też pokazałyby odmowę. To, że rozróżnia trzy różne odpowiedzi, jest dowodem, że odmowy w pozostałych 252 miejscach coś znaczą.

Drugi wariant tego samego błędu złapałem w połowie pracy. Cztery trasy chronione są nie sesją, tylko sekretem — i pierwsze podejście wysyłało im sekret nie tam, gdzie go czytają: jednej w parametrze adresu zamiast w nagłówku, drugiej w treści żądania zamiast w parametrze. Obie odmówiły, i wyglądało to na poprawną ochronę. Odmowa z powodu źle zadanego pytania jest nie do odróżnienia od odmowy z powodu ochrony. Dopiero pokazanie, że z poprawnym sekretem te trasy wpuszczają, zamyka sprawę w obie strony.

Przy okazji wyszedł trzeci automat czasowy, którego nie było na żadnej mojej liście. Nie znalazłem go czytaniem — znalazł się sam, bo sonda odpytała wszystko.

Czego nie zrobiłem

Nie dopisałem sprawdzenia sesji do czternastu wejść publicznych. To była najbardziej kusząca rzecz w całym dniu: czternaście miejsc bez ochrony wygląda jak czternaście rzeczy do naprawienia, a taka zmiana wygląda w historii projektu jak poprawka bezpieczeństwa. Byłaby zepsuciem produktu — po tych wejściach chodzą klienci, którzy nie mają i nie będą mieli konta.

Nie ruszyłem progów hamulca, nawet na czas pomiaru. Kuszące, bo sonda strzelająca 266 razy potrafi go zjeść. Zamiast tego ułożyłem ją tak, żeby drugie przejście omijało trasy publiczne. Pomiar, który dla własnej wygody rozluźnia mierzoną rzecz, mierzy coś innego niż produkt.

Nie napisałem, że sonda dowodzi więcej, niż dowodzi. Podstawia nieistniejące identyfikatory, więc trasa chroniona tylko dla niektórych wartości wyglądałaby na chronioną. Wejścia o najwyższej stawce przeczytałem dodatkowo, ręcznie.

Trzy rzeczy, które z tego biorę

Sprawdzenie, które nie potrafi dać złej wiadomości, nie jest sprawdzeniem. Zanim uwierzysz w zielony wynik, pokaż, że ten sam mechanizm umie zapalić czerwone światło.

Odmowa bywa objawem zepsucia, nie ochrony. Zamknięte drzwi i drzwi, do których zapukałem w niewłaściwą ścianę, wyglądają z zewnątrz tak samo.

Pusty wynik jest wart tyle, ile metoda, która go dała. Zero dziur to dobra wiadomość tylko wtedy, gdy da się powtórzyć drogę do niej — dlatego sonda została w repozytorium jako skrypt i odmawia uruchomienia przy włączonym obejściu logowania.


Liczby — 266 wejść, 252 odmowy, 14 świadomie publicznych, 21 fałszywych alarmów poprzedniej metody — pochodzą z jednego pomiaru z 6 sierpnia 2026, wykonanego na lokalnej kopii mojego systemu z bazą testową. Produkcji nie odpytywałem.

Patryk Piecyk

Patryk Piecyk

Warszawa · na etacie od 10.2026 · rozwój w stronę ERP/SAP i AI

Przez 7,5 roku pracowałem w niemieckiej firmie, pięć lat prowadząc jej biuro: zamówienia, faktury, reklamacje, ERP. Od czerwca 2026 buduję własne narzędzia do tej samej roboty — nie jestem programistą z wykształcenia, kod powstaje w parze z asystentem AI, a projekt, decyzje i testy są moje. Te notatki opisują, co się w tych systemach zepsuło i co z tego wyszło.

Masz pytanie do tego tekstu?

Napisz do mnie →