Co to jest SQL Injection?
SQL Injection to jedna z najczęściej spotykanych i najbardziej niebezpiecznych technik ataków na bazy danych. Polega na wstrzyknięciu złośliwego kodu SQL do zapytania, które jest następnie wykonywane przez bazę danych. Atakujący może w ten sposób uzyskać nieautoryzowany dostęp do danych, zmodyfikować je, a nawet usunąć.
Jak działa SQL Injection?
Atak SQL Injection wykorzystuje luki w zabezpieczeniach aplikacji, które pozwalają na wprowadzenie złośliwego kodu SQL. Przykładem może być formularz logowania, w którym użytkownik wprowadza nazwę użytkownika i hasło. Jeśli dane te nie są odpowiednio filtrowane, atakujący może wprowadzić kod SQL, który zmieni działanie zapytania do bazy danych.
Przykład ataku SQL Injection
Załóżmy, że mamy prosty formularz logowania:
W kodzie PHP obsługującym ten formularz może znajdować się zapytanie SQL:
$username = $_POST['username']; $password = $_POST['password']; $query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
Jeśli użytkownik wprowadzi jako nazwę użytkownika ' OR '1'='1
i jako hasło cokolwiek, zapytanie SQL stanie się:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = ''
W wyniku tego zapytania baza danych zwróci wszystkie rekordy, ponieważ warunek '1'='1'
jest zawsze prawdziwy.
Jak zabezpieczyć bazę danych przed SQL Injection?
Aby zabezpieczyć bazę danych przed atakami SQL Injection, należy stosować kilka podstawowych zasad:
Używanie przygotowanych zapytań (prepared statements)
Przygotowane zapytania pozwalają na oddzielenie kodu SQL od danych wprowadzanych przez użytkownika. Przykład w PHP z użyciem PDO:
$stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password'); $stmt->execute(['username' => $username, 'password' => $password]);
Walidacja i filtrowanie danych wejściowych
Każde dane wprowadzane przez użytkownika powinny być walidowane i filtrowane. Można użyć funkcji takich jak filter_var()
w PHP:
$username = filter_var($_POST['username'], FILTER_SANITIZE_STRING); $password = filter_var($_POST['password'], FILTER_SANITIZE_STRING);
Używanie ORM (Object-Relational Mapping)
ORM to narzędzia, które automatycznie generują zapytania SQL na podstawie obiektów w kodzie. Przykładem ORM w PHP jest Doctrine:
$user = $entityManager->getRepository('User')->findOneBy(['username' => $username, 'password' => $password]);
Ograniczenie uprawnień użytkowników bazy danych
Użytkownicy bazy danych powinni mieć minimalne niezbędne uprawnienia. Na przykład, użytkownik obsługujący aplikację webową nie powinien mieć uprawnień do usuwania tabel.
Przykłady i statystyki
Według raportu OWASP, SQL Injection jest jednym z najczęściej spotykanych ataków na aplikacje webowe. W 2020 roku, około 65% wszystkich ataków na aplikacje webowe stanowiły ataki SQL Injection.
Podsumowanie
SQL Injection to poważne zagrożenie dla bezpieczeństwa baz danych. Aby się przed nim zabezpieczyć, należy stosować przygotowane zapytania, walidować i filtrować dane wejściowe, używać ORM oraz ograniczać uprawnienia użytkowników bazy danych. Stosowanie tych praktyk znacząco zmniejsza ryzyko udanego ataku SQL Injection.