Ochrona przed SQL injection
Zapobiegaj atakom typu injection
Ochrona przed SQL injection to bezpłatna lekcja Cyber Security Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cyber Security Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cyber Security Academy zawiera 4 lekcji w sumie.
Czym jest SQL injection
SQL injection (SQLi) ma miejsce, gdy niezaufane dane wejściowe użytkownika są bezpośrednio łączone z zapytaniem SQL. Atakujący przemyca składnię SQL do pola, w którym aplikacja oczekuje zwykłych danych, zmieniając znaczenie zapytania.
To nadal jedna z najbardziej szkodliwych podatności internetowych, ponieważ może prowadzić do ujawnienia całych baz danych, ominięcia logowania lub zniszczenia danych.
Podatne zapytanie
Klasycznym błędem jest konkatenacja ciągów znaków. Jeśli dane wejściowe to tom, zapytanie jest poprawne, ale odpowiednio przygotowane dane wejściowe zmieniają jego logikę.
- Pojedynczy cudzysłów przedwcześnie zamyka ciąg znaków.
- Wszystko, co następuje później, staje się wykonywanym kodem SQL.
query = "SELECT * FROM users WHERE name = '" + userInput + "'";
// userInput = tom' OR '1'='1
// becomes: SELECT * FROM users WHERE name = 'tom' OR '1'='1'Ominięcie uwierzytelniania
Formularze logowania są głównym celem ataków. Wstrzykując warunek, który jest zawsze prawdziwy, i zakomentowując resztę, atakujący loguje się bez hasła.
Sekwencja -- zakomentowuje pozostałą klauzulę, więc sprawdzanie hasła zostaje pominięte.
-- attacker enters in the username field:
admin' --
-- resulting query:
SELECT * FROM users WHERE user = 'admin' --' AND pass = '...'Zapytania parametryzowane
Podstawową ochroną są zapytania parametryzowane (instrukcje przygotowane). Struktura SQL jest wysyłana oddzielnie od danych, więc dane wejściowe są zawsze traktowane jako wartość, a nigdy jako kod.
Sterownik bazy danych bezpiecznie wiąże symbole zastępcze ? z dostarczonymi wartościami.
-- Python (sqlite3 / psycopg)
cur.execute(
'SELECT * FROM users WHERE name = ? AND pass = ?',
(username, password)
)Instrukcje przygotowane w Javie
Każdy ważniejszy język oferuje parametryzację. W Javie używaj PreparedStatement zamiast tworzyć ciągi znaków za pomocą Statement.
Powiązane parametry nie mogą wyjść poza przypisane im miejsce, więc w tym przypadku wstrzyknięcie jest niemożliwe ze względów konstrukcyjnych.
PreparedStatement ps = conn.prepareStatement(
"SELECT * FROM users WHERE name = ?");
ps.setString(1, userInput);
ResultSet rs = ps.executeQuery();Procedury składowane
Procedury składowane mogą pomóc, jeśli wewnętrznie używają parametryzowanych danych wejściowych. Uważaj jednak: procedura składowana, która tworzy dynamiczny SQL przez konkatenację, jest równie podatna.
- Bezpieczne: parametry przekazywane do procedury.
- Niebezpieczne: wywołanie
EXEC()na połączonych ciągach znaków wewnątrz procedury.
Walidacja danych wejściowych i listy dozwolonych wartości
Walidacja jest przydatną drugą warstwą ochrony. Używaj list dozwolonych wartości (akceptuj tylko znane, poprawne wzorce), a nie list blokad (prób zakazania nieprawidłowych znaków).
Na przykład pole numerycznego identyfikatora powinno odrzucić wszystko, co nie składa się z cyfr, zanim dane wejściowe trafią do zapytania.
if not user_id.isdigit():
raise ValueError('invalid id')
# only then use the valueEscapowanie to ostateczność
Ręczne escapowanie cudzysłowów jest podatne na błędy i trudne w utrzymaniu. Różne bazy danych mają różne zasady escapowania, a przypadki szczególne (sztuczki z kodowaniem, wstrzyknięcia drugiego rzędu) mogą pozostać niewykryte.
Preferuj zapytania parametryzowane. Escapowania używaj tylko wtedy, gdy ORM lub sterownik nie może sparametryzować konkretnego identyfikatora.
Zasada najmniejszych uprawnień dla kont baz danych
Ogranicz skutki udanego wstrzyknięcia, stosując zasadę najmniejszych uprawnień do użytkownika bazy danych aplikacji.
- Przyznawaj tylko uprawnienia
SELECT,INSERT,UPDATEdo potrzebnych tabel. - Nigdy nie używaj konta superużytkownika/
rootdla aplikacji. - Odmawiaj uprawnień
DROP,FILEoraz uprawnień administracyjnych.
GRANT SELECT, INSERT, UPDATE ON appdb.orders TO 'webapp'@'%';
REVOKE DROP, ALTER ON appdb.* FROM 'webapp'@'%';ORM-y i konstruktory zapytań
Nowoczesne ORM-y (Hibernate, Sequelize, Django ORM, SQLAlchemy) domyślnie parametryzują zapytania, co eliminuje większość ryzyka wstrzyknięcia.
Niebezpieczeństwo powraca, gdy programiści przechodzą na surowy SQL lub używają interpolacji ciągów znaków w konstruktorze zapytań. Nawet w trybie surowym zawsze przekazuj wartości jako powiązane parametry.
Obrona warstwowa
Żaden pojedynczy mechanizm nie wystarczy. Połącz kilka warstw:
- Zapytania parametryzowane wszędzie (podstawowa ochrona).
- Walidacja danych wejściowych i listy dozwolonych wartości.
- Konta baz danych z najmniejszymi uprawnieniami.
- Zapora aplikacji internetowych (WAF) wykrywająca znane wzorce.
- Obsługa błędów, która nigdy nie ujawnia SQL ani śladów stosu.
Szybkie sprawdzenie
Sprawdź, czy rozumiesz główną metodę ochrony.
Podsumowanie
Dowiedziałeś się, jak działa SQL injection i jak mu zapobiegać:
- SQLi wynika z łączenia niezaufanych danych wejściowych z zapytaniami.
- Zapytania parametryzowane są podstawową ochroną.
- Dodaj walidację za pomocą list dozwolonych wartości, konta baz danych z najmniejszymi uprawnieniami oraz WAF.
- Unikaj ręcznego escapowania i dynamicznego SQL wewnątrz procedur składowanych.
Obrona warstwowa sprawia, że pojedynczy błąd nie prowadzi od razu do naruszenia bezpieczeństwa.
Często zadawane pytania
Czy lekcja „Ochrona przed SQL injection” jest bezpłatna?
Tak — pełny tekst „Ochrona przed SQL injection” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cyber Security Academy, przejdź na CoddyKit PRO. Kurs Cyber Security Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Ochrona przed SQL injection”?
Zapobiegaj atakom typu injection Ćwiczysz Cyber Security Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Cyber Security Academy?
Nie wymagamy żadnego doświadczenia. Cyber Security Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Ochrona przed SQL injection”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Cyber Security Academy?
Tak. Każda lekcja Cyber Security Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Ochrona przed SQL injection
- Kontrola dostępu i szyfrowanie
- Audytowanie i monitorowanie
- Bezpieczeństwo kopii zapasowych i odzyskiwania