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.
0,1 + 0,2 to nie 0,3 – a to znaczy, że typu float nie wolno używać do pieniędzy. Nie chodzi o ostrożniejsze zaokrąglanie, tylko o inny typ danych. Przegląd tego, jak liczy się kwoty poprawnie: grosze jako liczby całkowite, DECIMAL w bazie, decimal w Pythonie, BigDecimal w Javie, BCMath w PHP i BigInt w JavaScripcie. Do tego zaokrąglenie bankierskie i słynny spór o VAT liczony od pozycji czy od sumy.
Ostatnia część cyklu o sortowaniu: co naprawdę dzieje się po wywołaniu sorted() w Pythonie, Arrays.sort w Javie, std::sort w C++, sort() w PHP i JavaScripcie oraz sort_unstable w Ruście. Powersort od CPythona 3.11, dual-pivot quicksort dla typów prostych, stabilność wymuszona specyfikacją, sortowanie zewnętrzne, quickselect zamiast sortowania i klasyczne pułapki: sortowanie liczb jak napisów oraz niespójny komparator.
Ostatnia cyfra PESEL-u, NIP-u, numeru karty płatniczej i dwie cyfry w IBAN-ie nie są losowe – to sumy kontrolne oparte na arytmetyce modularnej. Jakie błędy człowiek robi najczęściej, dlaczego wagi i moduł pierwszy łapią przestawione cyfry, algorytm Luhna w 15 linijkach oraz implementacje walidacji PESEL, NIP i IBAN w Pythonie, PHP i JavaScript.
Dlaczego Wielkanoc skacze po kalendarzu między 22 marca a 25 kwietnia? Computus – najstarszy algorytm świata: reguła paschalna, cykl Metona i kościelna pełnia Księżyca, algorytmy Gaussa i Meeusa z implementacjami w Pythonie i JavaScript, wyliczanie ruchomych świąt oraz wbudowane funkcje PHP easter_date i easter_days.
Pół historii, pół kodu: dlaczego mamy lata przestępne (reguła 4/100/400), jak Europa gubiła dni przy reformie gregoriańskiej – 10 dni w 1582, 11 dni w Anglii w 1752, szwedzki 30 lutego 1712 – oraz algorytmy wiecznego kalendarza: kongruencja Zellera, metoda Sakamoto i Doomsday, z implementacjami i wbudowanymi funkcjami języków.
Zamiana liczb dziesiętnych na binarne – z częścią całkowitą i (rzadko porządnie tłumaczoną) częścią ułamkową. Algorytm mnożenia przez 2, kiedy ułamek jest skończony, a kiedy nieskończony, wykrywanie okresu oraz implementacje w Pythonie, JavaScript, PHP i C++. Plus most do niedokładności liczb zmiennoprzecinkowych.
Jak zamienić liczbę binarną na dziesiętną: algorytm dla części całkowitej i ułamkowej oraz gotowy kod w Pythonie, JavaScripcie, PHP i C++. Krok po kroku.