SQL injection — co to jest, jak działa i jak się chronić? Przykład w PHP i Pythonie
Spis treści
- Co to jest SQL injection?
- Jak działa atak SQL injection?
- SQL injection — przykład podatnego kodu i jego poprawki
- Jakie są rodzaje SQL injection?
- Jakie są skutki ataku SQLi?
- Czy wstrzyknięcie SQL to nadal problem w 2026 roku?
- Jak się chronić przed SQL injection? Zasady OWASP
- Jak legalnie sprawdzić, czy aplikacja jest podatna?
- Gdzie nauczyć się SQLi w praktyce?
- Najczęstsze pytania (FAQ)
- Podsumowanie
W skrócie
SQL injection to podatność, w której tekst wpisany przez użytkownika staje się częścią zapytania do bazy danych i zmienia jego sens. Skutek: wyciek danych, ominięcie logowania, a czasem przejęcie serwera. W OWASP Top 10:2025 kategoria Injection jest na 5. miejscu, a w 2026 roku (do 9 października) CISA dodała do katalogu KEV 8 podatności tego typu. Skuteczna ochrona to zapytania parametryzowane — poniżej przykład podatnego i poprawionego kodu w PHP i Pythonie, rodzaje SQLi i zasady OWASP.
Co to jest SQL injection?
SQL injection (SQLi, po polsku: wstrzyknięcie SQL) to podatność aplikacji, w której dane od użytkownika zostają wklejone do zapytania SQL i baza danych wykonuje je jak fragment polecenia, a nie jak zwykłą wartość.
SQL to język, w którym aplikacje rozmawiają z bazami danych (MySQL, PostgreSQL, SQLite) — używa go sklep pytający o produkty, formularz logowania i panel z listą zamówień.
W katalogu słabości CWE ma ona numer CWE-89, a źródło problemu jest zawsze to samo: pomieszanie kodu (polecenia SQL) z danymi (tym, co wpisał użytkownik).
Jak działa atak SQL injection?
Atak SQL injection działa, bo aplikacja skleja stały tekst zapytania z danymi od użytkownika, a baza nie odróżnia, co pochodzi od programisty, a co od gościa strony.
- Użytkownik wysyła dane — fraza w wyszukiwarce, login, parametr w adresie URL.
- Aplikacja skleja zapytanie — wkleja dane w tekst zapytania SQL.
- Dane zmieniają strukturę zapytania — znak apostrofu kończy wartość, a dalszy tekst staje się nowym warunkiem lub poleceniem.
- Baza wykonuje zmienione zapytanie — z uprawnieniami aplikacji, więc zwraca lub zmienia cudze dane.
Jeśli w kroku 2 aplikacja przekaże dane osobno od polecenia (zapytanie parametryzowane), krok 3 nie zachodzi.
SQL injection — przykład podatnego kodu i jego poprawki
Poniższy przykład SQL injection pochodzi z typowego scenariusza laboratoryjnego: prosta wyszukiwarka produktów w aplikacji testowej, uruchomionej we własnym środowisku do ćwiczeń. Pokazujemy, dlaczego kod jest podatny i jak go naprawić — w PHP i w Pythonie.
Podatny kod w PHP — sklejanie zapytania
<?php
// PODATNE — dane od użytkownika wklejone w tekst zapytania
$nazwa = $_GET['nazwa'] ?? '';
$sql = "SELECT id, nazwa, cena FROM produkty WHERE nazwa = '$nazwa'";
$wynik = $pdo->query($sql);
Gdy użytkownik wpisze rower, baza dostanie zapytanie ... WHERE nazwa = 'rower' i wszystko działa. Problem pojawia się, gdy w polu znajdzie się apostrof. Klasyczny, podręcznikowy przykład to wartość ' OR '1'='1 — po wklejeniu zapytanie wygląda tak:
SELECT id, nazwa, cena FROM produkty WHERE nazwa = '' OR '1'='1'
Warunek '1'='1' jest zawsze prawdziwy, więc baza zwraca wszystkie wiersze tabeli, a nie tylko szukany produkt. Ten sam błąd w formularzu logowania może oznaczać wejście na cudze konto.
Poprawiony kod w PHP — PDO i zapytanie parametryzowane
<?php
$pdo = new PDO('mysql:host=localhost;dbname=sklep;charset=utf8mb4', $uzytkownik, $haslo, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false, // natywne zapytania przygotowane
]);
// BEZPIECZNIE — treść zapytania jest stała, dane idą osobno jako parametr
$stmt = $pdo->prepare('SELECT id, nazwa, cena FROM produkty WHERE nazwa = :nazwa');
$stmt->execute(['nazwa' => $_GET['nazwa'] ?? '']);
$produkty = $stmt->fetchAll(PDO::FETCH_ASSOC);
Zapytanie parametryzowane (prepared statement) ma w miejscu wartości znacznik — tu :nazwa. Struktura zapytania jest ustalona, zanim trafi do niej wartość: sterownik przekazuje ją osobno do bazy albo — w trybie emulacji, domyślnym w PDO dla MySQL — sam ją bezpiecznie wstawia. W obu przypadkach wartość nie jest interpretowana jako kod SQL. Dokumentacja PHP mówi wprost: parametrów nie trzeba ujmować w cudzysłowy, bo zajmuje się tym sterownik, a aplikacja, która używa wyłącznie zapytań przygotowanych, jest chroniona przed tym atakiem — pod warunkiem, że żadnej innej części zapytania nie buduje z niezabezpieczonych danych.
Ten sam przykład w Pythonie — sqlite3
import sqlite3
con = sqlite3.connect("sklep.db")
nazwa = input("Szukaj produktu: ")
# PODATNE — f-string wkleja dane w treść zapytania
cur = con.execute(f"SELECT id, nazwa, cena FROM produkty WHERE nazwa = '{nazwa}'")
# BEZPIECZNIE — znacznik ? i wartość przekazana osobno (krotka)
cur = con.execute("SELECT id, nazwa, cena FROM produkty WHERE nazwa = ?", (nazwa,))
print(cur.fetchall())
Dokumentacja Pythona 3.15 każe zamiast operacji na napisach używać znaczników ? lub nazwanych (:nazwa). Zasada jest ta sama w każdym języku: nigdy nie skleja się zapytania z danymi — dane przekazuje się osobno.
Czego nie da się sparametryzować? Sortowanie i nazwy kolumn
Znacznik parametru zastępuje tylko wartość. Nazwy tabel i kolumn czy kierunek sortowania (ORDER BY ... ASC/DESC) to część struktury zapytania — OWASP zauważa, że nazw tabel i kolumn nie da się escapować, a Cheat Sheet zaleca dla nich i dla kierunku sortowania listę dozwolonych wartości ustaloną w kodzie:
<?php
// Użytkownik wybiera klucz, a aplikacja podstawia własną, znaną wartość
$kolumny = ['nazwa' => 'nazwa', 'cena' => 'cena'];
$kolumna = is_string($_GET['sortuj'] ?? null) ? ($kolumny[$_GET['sortuj']] ?? 'nazwa') : 'nazwa';
$kierunek = (($_GET['kierunek'] ?? '') === 'malejaco') ? 'DESC' : 'ASC';
$stmt = $pdo->prepare(
"SELECT id, nazwa, cena FROM produkty WHERE nazwa LIKE :fraza " .
"ORDER BY $kolumna $kierunek"
);
$stmt->execute(['fraza' => '%' . ($_GET['q'] ?? '') . '%']);
Do zapytania nie trafia nic, czego programista wcześniej nie wpisał w kod — tekst od użytkownika służy tylko do wyboru z gotowej listy.
Jakie są rodzaje SQL injection?
Rodzaje SQLi dzieli się najczęściej według tego, jak atakujący dowiaduje się o wyniku zapytania: in-band (wynik widać w odpowiedzi aplikacji), blind (wynik trzeba wywnioskować) i out-of-band (wynik wychodzi innym kanałem).
| Rodzaj | Techniki | Skąd atakujący zna wynik | Co chroni |
|---|---|---|---|
| In-band (w tym samym kanale) | error-based (na podstawie błędów), UNION-based (dołączenie drugiego zapytania) | dane lub komunikat błędu bazy widać bezpośrednio na stronie | zapytania parametryzowane; ogólne komunikaty błędów zamiast szczegółów z bazy |
| Blind (ślepe, inferencyjne) | boolean-based (prawda/fałsz), time-based (opóźnienie odpowiedzi) | z różnic w odpowiedzi albo z czasu jej przyjścia — znak po znaku | zapytania parametryzowane |
| Out-of-band (poza pasmem) | wymuszenie połączenia sieciowego z bazy, np. zapytania DNS | dane przychodzą osobnym kanałem, np. w zapytaniu DNS do serwera atakującego | zapytania parametryzowane; ograniczenie ruchu wychodzącego z serwera bazy |
| Second-order (drugiego rzędu) | dane zapisane w bazie, użyte później w innym zapytaniu | zależnie od miejsca użycia — jak w trzech wierszach wyżej | parametryzacja każdego zapytania, także z danymi „z własnej” bazy |
In-band — wynik widać w odpowiedzi aplikacji
Najprostszy rodzaj: dane lub komunikat błędu bazy pojawiają się w tej samej odpowiedzi (warianty error-based i UNION-based, w którym operatorem UNION dokleja się drugie zapytanie).
Blind — ślepe wstrzyknięcie SQL
Aplikacja nie pokazuje wyników ani błędów, więc według PortSwigger atakujący wnioskuje z różnic w odpowiedzi (boolean-based) albo z jej opóźnienia (time-based) — wolniej, ale równie skutecznie.
Out-of-band — dane wychodzą innym kanałem
Zapytanie zmusza serwer bazy do połączenia sieciowego, najczęściej zapytania DNS, z serwerem atakującego. To rzadszy rodzaj, zależny od funkcji bazy i od tego, czy serwer może łączyć się z internetem.
Second-order — atak drugiego rzędu
Dane zapisane w bazie zostają później użyte w innym zapytaniu bez parametryzacji — dlatego dane z własnej bazy też traktuj jak niezaufane.
Jakie są skutki ataku SQLi?
Skutkiem udanego ataku SQLi jest najczęściej nieuprawniony dostęp do danych, a w gorszych przypadkach ich zmiana i przejęcie aplikacji lub serwera.
- Wyciek danych — odczyt tabel z danymi klientów, skrótów haseł, tokenów i kluczy API.
- Ominięcie logowania — zmiana warunku w zapytaniu sprawdzającym login i hasło.
- Zmiana lub usunięcie danych — np. podmiana cen, uprawnień, numerów kont.
- Eskalacja uprawnień i wykonanie kodu — CISA w katalogu KEV opisuje podatność SQLi w Drupalu (CVE-2026-9082) jako taką, która może prowadzić do podniesienia uprawnień i zdalnego wykonania kodu.
Skala skutków zależy od uprawnień konta, którym aplikacja łączy się z bazą — stąd zasada minimalnych uprawnień.
Czy wstrzyknięcie SQL to nadal problem w 2026 roku?
Tak — to jedna z najstarszych podatności aplikacji webowych, a wciąż trafia do katalogów aktywnie wykorzystywanych luk.
Miejsce SQL injection w OWASP Top 10:2025
W OWASP Top 10:2025 wstrzyknięcie SQL należy do kategorii A05:2025 Injection, która spadła z 3. na 5. miejsce. OWASP opisuje SQLi jako podatność o niskiej częstotliwości i dużym wpływie, z ponad 14 tys. CVE (publicznych identyfikatorów podatności). Całą listę 2025 z przykładami omawiamy w artykule OWASP Top 10 po polsku.
Przypadki z 2026 roku: CISA KEV i CERT Polska
Do katalogu KEV amerykańskiej agencji CISA (Known Exploited Vulnerabilities — podatności aktywnie wykorzystywane) w 2026 roku, według stanu na 9 października, dodano 8 podatności tego typu. Wybrane przykłady:
| Oprogramowanie | CVE | Data | Co się stało |
|---|---|---|---|
| LiteLLM (bramka do modeli AI) | CVE-2026-42208 | KEV: 8.05.2026 | wartość klucza API wklejana w treść zapytania zamiast parametru; odczyt i możliwa zmiana bazy proxy bez logowania; CVSS 4.0: 9,3 (wg GitHub, CNA); NVD: 9,8 (CVSS 3.1) |
| Drupal Core | CVE-2026-9082 | KEV: 22.05.2026 | wstrzyknięcie SQL przez API abstrakcji bazy; możliwe podniesienie uprawnień i zdalne wykonanie kodu |
| WordPress Core | CVE-2026-60137 | KEV: 21.07.2026 | SQLi, gdy wtyczka lub motyw przekaże niezaufane dane; w połączeniu z CVE-2026-63030 zdalne wykonanie kodu bez logowania |
| Simple.ERP (system ERP firmy Simple SA) | CVE-2026-1198 | CERT Polska: 26.02.2026 | SQLi w wyszukiwaniu okna „Obroty na kontach”, dla zalogowanego atakującego; CVSS 4.0: 8,6 (wg CERT Polska); poprawka w wersji [email protected]_u06 |
Najbardziej pouczający jest LiteLLM — bramka do wywoływania modeli językowych. Według opisu w NVD w wersjach od 1.81.16 do wersji przed 1.83.7 zapytanie sprawdzające klucz API „mieszało wartość klucza przekazaną przez wywołującego z tekstem zapytania, zamiast przekazać ją jako osobny parametr”. To błąd z naszego przykładu, tylko w narzędziu, które pilnuje kluczy do modeli AI: nowa warstwa technologii stoi na starych fundamentach i dziedziczy ich słabości. Więcej w artykule czy warto uczyć się cyberbezpieczeństwa w czasach AI.
Polski przykład to Simple.ERP: CERT Polska opublikował 26 lutego 2026 roku informację o podatności typu SQLi, której przyczyną był brak walidacji danych wejściowych. Ujawnienie koordynował CERT Polska w procesie CVD — tą drogą może zgłosić lukę każdy, kto trafi na nią w polskim oprogramowaniu.
Jak się chronić przed SQL injection? Zasady OWASP
Najskuteczniejsza ochrona przed SQLi to zapytania parametryzowane — tak zaczyna listę obron OWASP SQL Injection Prevention Cheat Sheet (stan na 9 października 2026).
| Zasada | Rodzaj | Co robić w praktyce |
|---|---|---|
| 1. Zapytania przygotowane z parametrami | obrona podstawowa | PDO prepare() + execute(), znaczniki ? w Pythonie; żadnego sklejania |
| 2. Procedury składowane — bezpiecznie | obrona podstawowa | dynamiczny SQL wewnątrz procedury też wymaga parametrów |
| 3. Lista dozwolonych wartości | obrona podstawowa | dla elementów, których nie da się sparametryzować (sortowanie, nazwy kolumn) — mapowanie wyboru użytkownika na wartości z kodu |
| 4. Ręczne escapowanie | zdecydowanie odradzane | nie zastępuj nim parametrów — łatwo o błąd |
| Minimalne uprawnienia | utwardzenie | osobne konto bazy dla każdej aplikacji, bez praw administratora; widoki (views) ograniczające dostęp do kolumn |
| Wykrywanie | kontrola | przegląd kodu budującego zapytania (także w procedurach) i testy wg OWASP Web Security Testing Guide |
- ORM też pomaga — jeśli używasz go zgodnie z przeznaczeniem. OWASP Top 10:2025 jako preferowaną opcję wskazuje bezpieczne API — parametryzowany interfejs albo ORM (w praktyce np. Doctrine, Django ORM, SQLAlchemy). Surowe zapytania sklejane w ORM-ie są tak samo podatne.
- Walidacja danych wejściowych to dodatek. OWASP pisze, że pozytywna walidacja po stronie serwera „nie jest pełną obroną” — sprawdzaj format, ale nie traktuj tego jako ochrony przed SQLi.
- Minimalne uprawnienia ograniczają szkody, ale nie zapobiegają atakowi.
- Komunikaty błędów dla użytkownika — ogólne. Szczegóły błędu bazy zapisuj w logach, a nie wyświetlaj na stronie, bo ułatwiają wariant error-based.
Jak legalnie sprawdzić, czy aplikacja jest podatna?
Aplikację pod kątem wstrzyknięcia SQL sprawdzasz legalnie tylko wtedy, gdy jest twoja albo masz pisemną zgodę właściciela na test w ustalonym zakresie. Trzy drogi:
- Przegląd własnego kodu — znajdź zapytania sklejane z tekstem (
., f-stringi,+) i zamień je na parametry. - Testy we własnym środowisku — kopia aplikacji na twoim komputerze, nie produkcja.
- Laboratoria do nauki — celowo podatne aplikacje stworzone do ćwiczeń.
Uwaga
Techniki i narzędzia do SQLi (w tym SQLmap) stosuj tylko w swoim laboratorium lub za zgodą właściciela systemu. Uzyskanie dostępu do cudzego systemu lub danych bez zgody jest w Polsce przestępstwem (art. 267 Kodeksu karnego). Jeśli przypadkiem trafisz na podatność, nie sprawdzaj jej dalej — zgłoś ją właścicielowi albo przez CERT Polska.
Gdzie nauczyć się SQLi w praktyce?
SQLi najlepiej zrozumieć, przechodząc atak w laboratorium, a potem naprawiając kod. Do wyboru masz kilka dróg, które można łączyć.
| Droga | Język | Środowisko | Mocne strony | Dla kogo / uwagi |
|---|---|---|---|---|
| PortSwigger Web Security Academy | angielski | laboratoria online | bezpłatna; kilkanaście laboratoriów z SQLi, od podstaw po blind i out-of-band | kolejność nauki i podstawy (Linux, HTTP, Burp) trzeba ułożyć samodzielnie |
| TryHackMe, Hack The Box | angielski | maszyny i pokoje w przeglądarce lub przez VPN | szeroki wybór zadań; TryHackMe ma plan darmowy i płatny Premium | SQLi to jeden z wielu tematów; porównujemy je w artykule TryHackMe i Hack The Box |
| Własne laboratorium | dowolny | maszyna wirtualna z celowo podatną aplikacją | pełna kontrola, możesz też naprawiać kod | konfiguracja zajmuje czas na starcie |
| Cyberium (szkolenie 7) | polski | laboratoria w przeglądarce, w CyberBoxie (Kali Linux), bez instalacji | moduł SQL Injection w ścieżce od podstaw, misje do portfolio, wsparcie eksperta | dla osób, które chcą przejść po polsku całą ścieżkę testów penetracyjnych — od Linuksa po aplikacje webowe |
Jak wygląda nauka SQLi w Cyberium?
W Cyberium — polskim kursie cyberbezpieczeństwa online — SQLi ma własny moduł w szkoleniu 7 „Atakowanie aplikacji webowych — Podstawy” (poziom „Średni”: 3 moduły, 26 lekcji, 15 laboratoriów praktycznych). Moduł „SQL Injection” obejmuje:
- wprowadzenie do SQL i baz danych (MySQL),
- różne techniki ataków — od technik Union po zaawansowane,
- SQLmap — narzędzie automatyzujące wstrzyknięcia SQL — gdy już rozumiesz, co narzędzie robi za ciebie.
Umiejętności sprawdzasz w laboratoriach i w misjach projektowych #03 i #04 do portfolio i CV. Wcześniej w tym szkoleniu poznajesz Burp Suite, IDOR i ataki na formularze logowania. Pozostałe ataki typu injection czekają w szkoleniu 8 „Atakowanie aplikacji webowych — techniki zaawansowane”: XSS, Command Injection (wstrzykiwanie poleceń systemowych) oraz LFI i RFI.
Lekcję o SQLmap możesz obejrzeć przed zakupem: to jedna z dwóch bezpłatnych lekcji DEMO na stronie kursu. Prowadzący pokazuje w niej, jak szybko narzędzie dociera do bazy danych w laboratorium — i dlaczego trzeba nim posługiwać się ostrożnie, bo może nieodwracalnie uszkodzić bazę. Pokazuje też zasadę pracy pentestera: podatność najpierw znajduje się ręcznie, a w raporcie dla klienta wystarczy kilka rekordów jako dowód — bez zrzucania całej bazy.
Co jeszcze daje taka droga nauki:
- Po polsku i w jednej kolejności — od pierwszego laboratorium i Linuksa (szkolenia 1–2), przez metodykę pentestów (szkolenie 3), do aplikacji webowych (szkolenia 7–8).
- Praktyka przede wszystkim — w programie podział 80/20 między praktyką a teorią; łącznie 57 laboratoriów i 5 misji projektowych.
- Laboratoria w przeglądarce — CyberBox, czyli Kali Linux w przeglądarce, bez instalacji.
- Raport jak w pracy pentestera — w szkoleniu 6 tworzysz raport z pentestu krok po kroku, a jako bonus dostajesz szablon raportu gotowy do wykorzystania.
- Wsparcie eksperta i aktualizacje przez cały dostęp.
- Dostęp od razu po zakupie, subskrypcja z rezygnacją w każdej chwili.
- Egzamin praktyczny C:CCE na końcu — test penetracyjny maszyny i raport; po zaliczeniu dostajesz certyfikat.
Na start przyda ci się plan z artykułu podstawy cyberbezpieczeństwa: jak zacząć w 30 dni, a szerszą ścieżkę rozpisaliśmy w planie nauki od podstaw w 8 krokach. Program wszystkich szkoleń znajdziesz w programie kursu cyberbezpieczeństwa.
Najczęstsze pytania (FAQ)
Co to jest SQL injection w prostych słowach?
SQL injection (SQLi, wstrzyknięcie SQL) to podatność, w której dane od użytkownika trafiają do zapytania do bazy jako jego część, a nie zwykła wartość. Atakujący może wtedy odczytać cudze dane, ominąć logowanie albo zmienić bazę. Najprostszy przykład: aplikacja wkleja tekst z pola wyszukiwarki do zapytania WHERE nazwa = '…'; wpisanie ' OR '1'='1 zmienia warunek na zawsze prawdziwy i baza zwraca wszystkie wiersze.
Jak najskuteczniej chronić się przed SQL injection?
Podstawą są zapytania parametryzowane (prepared statements): treść zapytania jest stała, a dane od użytkownika przekazujesz osobno jako parametry, np. przez PDO w PHP albo znaczniki ? w Pythonie. Nazwy kolumn i kierunek sortowania wybieraj z listy dozwolonych wartości. Do tego konto bazy z minimalnymi uprawnieniami. OWASP odradza ręczne escapowanie jako zamiennik parametrów.
Czy SQL injection to nadal problem w 2026 roku?
Tak. W OWASP Top 10:2025 kategoria Injection, do której należy SQL injection, zajmuje 5. miejsce, a samo SQLi ma ponad 14 tys. CVE. Według katalogu CISA KEV w 2026 roku (do 9 października) potwierdzono aktywne wykorzystywanie 8 podatności nazwanych „SQL Injection”, m.in. w Drupalu, WordPressie i bramce AI LiteLLM.
Jakie są rodzaje SQL injection?
Najczęściej wyróżnia się trzy grupy. In-band: wynik ataku widać w tej samej odpowiedzi aplikacji (np. komunikat błędu albo dane dołączone operatorem UNION). Blind, czyli ślepe: aplikacja nie pokazuje danych, więc wnioskuje się z różnic w odpowiedzi albo z czasu jej przyjścia. Out-of-band: dane wychodzą innym kanałem, np. przez zapytanie DNS. Osobno opisuje się second-order SQL injection.
Gdzie legalnie nauczyć się SQL injection?
Tylko w laboratoriach przeznaczonych do nauki albo we własnym środowisku, nigdy na cudzych stronach. W Cyberium — polskim kursie cyberbezpieczeństwa online — SQLi ma własny moduł w szkoleniu 7: podstawy SQL i MySQL, różne techniki ataków i automatyzacja w SQLmap, w laboratoriach w przeglądarce i w misji projektowej. Bezpłatnie możesz też ćwiczyć w Web Security Academy od PortSwigger.
Podsumowanie
Wstrzyknięcie SQL to prosty błąd — dane od użytkownika mieszają się z poleceniem dla bazy — który w 2026 roku wciąż trafia do katalogu aktywnie wykorzystywanych podatności, także w narzędziach AI. Ochrona: zapytania parametryzowane, lista dozwolonych wartości i minimalne uprawnienia. Najlepiej zrozumiesz to w laboratorium — po polsku i ze wsparciem eksperta w kursie cyberbezpieczeństwa Cyberium.
Źródła
Stan na 9 października 2026.
- OWASP Top 10:2025 — A05:2025 Injection (stan na 9.10.2026)
- OWASP Cheat Sheet Series — SQL Injection Prevention Cheat Sheet (stan na 9.10.2026)
- OWASP Cheat Sheet Series — Query Parameterization Cheat Sheet (stan na 9.10.2026)
- PHP Manual — PDO: prepared statements and stored procedures (stan na 9.10.2026)
- Python 3.15 — dokumentacja sqlite3, placeholders (stan na 9.10.2026)
- PortSwigger Web Security Academy — SQL injection (stan na 9.10.2026)
- PortSwigger Web Security Academy — Blind SQL injection (stan na 9.10.2026)
- CISA — Known Exploited Vulnerabilities Catalog (stan na 9.10.2026)
- NVD — CVE-2026-42208, LiteLLM (opublikowano 8.05.2026)
- CERT Polska — Podatność w oprogramowaniu Simple.ERP, CVE-2026-1198 (26.02.2026)
- NVD — CVE-2026-1198, Simple.ERP (opublikowano 26.02.2026)
- CERT Polska — koordynowane ujawnianie podatności (stan na 9.10.2026)
- TryHackMe — cennik i plan darmowy (stan na 9.10.2026)
