0Pricing
PHP Academy · Lekcja

SQL injection i zapytania parametryzowane

Eliminuj ryzyko injection, zawsze używając instrukcji przygotowanych z PDO

SQL injection i zapytania parametryzowane to bezpłatna lekcja PHP Academy na CoddyKit. To lekcja 2 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 PHP Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs PHP Academy zawiera 4 lekcji w sumie.

Czym jest SQL injection?

SQL injection występuje, gdy dane dostarczone przez użytkownika są bezpośrednio osadzane w zapytaniu SQL, co pozwala atakującym manipulować zapytaniem w celu uzyskania dostępu do danych, ich modyfikowania lub usuwania.

Klasyczny przykład

Łączenie danych wejściowych użytkownika z zapytaniem SQL:

<?php
// VULNERABLE: attacker enters username = "' OR '1'='1"
$sql = "SELECT * FROM users WHERE username = '".$_GET["username"]."'";
// Becomes: SELECT * FROM users WHERE username = '' OR '1'='1'
// Returns ALL users!

Przykład eksfiltracji danych

Atakujący używa UNION SELECT, aby wyprowadzić dane z innych tabel.

// Input: ' UNION SELECT username, password FROM admin_users--
// This appends a second SELECT returning admin credentials

Instrukcje przygotowane są rozwiązaniem

W przypadku instrukcji przygotowanych struktura zapytania jest ustalana przed przekazaniem jakichkolwiek danych. Baza danych traktuje wszystkie powiązane wartości jako dane literalne — nigdy jako kod SQL.

<?php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_GET["username"]]);
// Safe even if username = "' OR 1=1--"

Nazwane symbole zastępcze

Nazwane symbole zastępcze są czytelniejsze, szczególnie w przypadku wielu parametrów.

<?php
$stmt = $pdo->prepare(
    "SELECT * FROM users WHERE email = :email AND active = :active"
);
$stmt->execute([":email" => $email, ":active" => true]);

Eloquent jest domyślnie bezpieczny

Laravel Eloquent wewnętrznie używa przygotowanych instrukcji PDO we wszystkich standardowych operacjach konstruktora zapytań.

<?php
// Safe:
User::where("email", $email)->first();

// UNSAFE: raw query with user input!
DB::select("SELECT * FROM users WHERE email = ".$email);

Surowe zapytania

Jeśli w Laravel musisz użyć surowego SQL, zawsze stosuj bindowanie parametrów.

<?php
// Safe raw query:
$users = DB::select("SELECT * FROM users WHERE email = ?", [$email]);

// Or with named bindings:
$users = DB::select("SELECT * FROM users WHERE email = :email", [":email" => $email]);

Wstrzyknięcia w klauzuli LIKE

Klauzule LIKE wymagają specjalnego traktowania — symbole wieloznaczne (%, _) trzeba ręcznie escapować przed powiązaniem parametru.

<?php
$search = str_replace(["%", "_", "\\"], ["\%", "\_", "\\\\"], $userInput);
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%$search%"]);

Wstrzyknięcia w ORDER BY

Nie można parametryzować nazw kolumn ani kierunków sortowania ORDER BY. Weryfikuj je względem białej listy.

<?php
$allowedColumns = ["name", "price", "created_at"];
$col = in_array($request->sort, $allowedColumns) ? $request->sort : "name";
$dir = $request->dir === "desc" ? "desc" : "asc";
// Then safely build the query string

Procedury składowane

Procedury składowane również mogą być podatne na ataki, jeśli wewnętrznie łączą dane wejściowe. Zawsze używaj wywołań sparametryzowanych.

Zasada najmniejszych uprawnień

Użytkownik bazy danych łączący się z PHP powinien mieć uprawnienia SELECT/INSERT/UPDATE/DELETE wyłącznie do niezbędnych tabel — nigdy CREATE, DROP ani uprawnień administracyjnych.

Podsumowanie

ZAWSZE używaj instrukcji przygotowanych z powiązanymi parametrami. Nigdy nie łącz danych wejściowych użytkownika z kodem SQL. Weryfikuj nazwy kolumn i ORDER BY względem białej listy. Używaj PDO z wyłączoną emulacją instrukcji przygotowanych.

Szybkie sprawdzenie

Jaki jest prawidłowy sposób ochrony przed SQL injection?

Często zadawane pytania

Czy lekcja „SQL injection i zapytania parametryzowane” jest bezpłatna?

Tak — pełny tekst „SQL injection i zapytania parametryzowane” 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 PHP Academy, przejdź na CoddyKit PRO. Kurs PHP Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „SQL injection i zapytania parametryzowane”?

Eliminuj ryzyko injection, zawsze używając instrukcji przygotowanych z PDO Ćwiczysz PHP 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ąć PHP Academy?

Nie wymagamy żadnego doświadczenia. PHP 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 2 z 4.

Ile czasu zajmuje lekcja „SQL injection i zapytania parametryzowane”?

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 PHP Academy?

Tak. Każda lekcja PHP 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. Zapobieganie Cross-Site Scripting (XSS)
  2. SQL injection i zapytania parametryzowane
  3. Ochrona CSRF
  4. Bezpieczne przechowywanie haseł
← Powrót do PHP Academy