Jak zabezpieczyć bazę danych przed SQL Injection?

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.

Leave a Comment

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Scroll to Top