Trzecia część cyklu Wychowany na PHP, tym razem osobiście. Z Perla przesiadłem się na PHP 4, przeprowadziłem na nie swoje i cudze projekty, przeszedłem przez piątkę i zatrzymałem się na siódemce. Dziś nowe projekty zaczynam zwykle w Pythonie – nie dlatego, że PHP jest zły, tylko dlatego, że wzorzec MVC poznany w Laravelu i Symfony znalazłem we Flasku i Django, a razem z nim wersje przypięte w repozytorium, migracje, panel admina i jeden język do backendu i skryptów. Plus jeden przypadek, w którym nadal sięgam po PHP: jeden plik index.php i SQLite na najtańszym hostingu.
PHP2Shell zaatakował, zanim aplikacja zdążyła się odezwać – więc jakość jej kodu nie miała znaczenia. To dobry pretekst, żeby zapytać o coś, o czym na tanim hostingu nikt nie myśli: co stoi między internetem a moim kodem, kto wybiera wersję interpretera i co staje się punktem wejścia. Cztery modele wdrożenia, od mod_php po statyczną stronę, porównane pod kątem tego, co atakujący dostaje za darmo. Bez tezy, że PHP jest zły – bo PHP podany porządnie wygląda dziś prawie tak samo jak Python.
20 października 2026 wyciekły szczegóły dwóch krytycznych luk w samym silniku PHP (CVE-2026-109618 i CVE-2026-109619, razem nazywanych PHP2Shell): zdalne wykonanie kodu bez logowania, zanim aplikacja zdąży się w ogóle uruchomić. W Polsce COI wyłączył strony BIP w systemie SSDIP, za granicą gasły serwisy rządowe w Holandii, Finlandii i Francji. Co dokładnie się zepsuło, ile serwerów było wystawionych, co wiemy o włamaniach – i dlaczego najgorsza liczba w tej historii to nie CVSS, tylko 69 procent.
Trzy lata temu pokazałem na blogu klasyczny SQL Injection: formularz logowania w PHP, sklejane zapytanie i wpisane w pole username „' OR 1=1#. Wróćmy do tamtego kodu i zadajmy inne pytanie: czy dziś dałoby się go tak w ogóle napisać? Bo domyślna ścieżka współczesnego PHP i frameworków – obsługa formularza, ORM, zapytania parametryzowane z pudełka – prowadzi do kodu bezpiecznego, a żeby wstrzyknąć SQL, trzeba dziś z tej ścieżki świadomie zejść. Z uczciwym rozdziałem o tym, gdzie wstrzyknięcie wciąż jest łatwe.
Widziałem rolkę: programiści COBOL-a na bruku, bo AI ich zastąpiło. Postanowiłem sprawdzić, ile w tym prawdy – i okazało się, że mem sklejono z trzech prawdziwych rzeczy w jedno wydarzenie, które się nie zdarzyło. Przy okazji: dlaczego 65-letni język wciąż liczy pieniądze świata, co naprawdę potrafią modele językowe przy starym kodzie, a gdzie obietnica wyprzedza fakty.
We wrześniu 2014 okazało się, że bash – powłoka obecna niemal na każdym serwerze uniksowym – ma błąd pozwalający na zdalne wykonanie kodu. Nie w nowej funkcji, tylko w mechanizmie działającym niezmiennie od 1992 roku, uruchamianym przez wysłużone skrypty CGI. Anatomia podatności, która pokazała, że stare i sprawdzone znaczy bezpieczne tylko do momentu, w którym ktoś każe temu zrobić coś nowego.
Pierwsza część serii o strukturach danych. Jak z funkcji skrótu robi się dostęp w czasie stałym, co się dzieje przy kolizjach, czym różni się łańcuchowanie od adresowania otwartego i dlaczego słownik czasem nagle zwalnia. Kontrakt hash i eq w Pythonie, klucz, który gubi dane, koszt amortyzowany przy rozrastaniu tablicy oraz trzy różne rzeczy nazywane tym samym słowem hash: skrót do wyszukiwania, kryptograficzny i do haseł.
Tabelki złożoności czyta też atakujący. Jak kilka kilobajtów dobranego wejścia zajmuje rdzeń procesora na sekundy: kolizje w tablicach mieszających (HashDoS z 2011 roku), katastrofalny nawrót w wyrażeniach regularnych (27 minut awarii Cloudflare w 2019), pesymistyczny przypadek quicksorta, bomby dekompresyjne i encje XML. Z pomiarami w Pythonie, prawdziwymi liczbami i listą obron, które faktycznie działają.
Narzędzia do monitorowania Debiana: procesy (top, htop), obciążenie CPU (mpstat), pamięć i dysk (vmstat, iostat) oraz ruch sieciowy (iftop). Co i czym sprawdzić.
Konfiguracja ochrony poczty na FreeBSD: SpamAssassin z bazą MySQL (Bayes), ClamAV, Razor oraz Maia-Mailguard (amavisd-new) jako filtr i panel kwarantanny.
Konfiguracja Postfix na FreeBSD: SASL z Dovecot, TLS, domeny i skrzynki wirtualne w MySQL, antyspamowe RBL, oraz PostfixAdmin do zarządzania pocztą przez WWW.
Kompilacja i konfiguracja Dovecot z obsługą MySQL na FreeBSD: POP3/IMAP, SSL/TLS, Maildir, Sieve (Pigeonhole), quota oraz uwierzytelnianie skrzynek z bazy.
Jak działa serwer poczty elektronicznej i z czego się składa: SMTP, POP3/IMAP, Postfix, Dovecot, Apache, MySQL, Roundcube na FreeBSD 13. Część 1 serii.