0Pricing
Cyber Security Academy · Lekcja

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 value

Escapowanie 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, UPDATE do potrzebnych tabel.
  • Nigdy nie używaj konta superużytkownika/root dla aplikacji.
  • Odmawiaj uprawnień DROP, FILE oraz 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

  1. Ochrona przed SQL injection
  2. Kontrola dostępu i szyfrowanie
  3. Audytowanie i monitorowanie
  4. Bezpieczeństwo kopii zapasowych i odzyskiwania
← Powrót do Cyber Security Academy