Ten wikiHow uczy, jak zapobiegać wstrzykiwaniu SQL za pomocą przygotowanych instrukcji w PHP. Wstrzyknięcie SQL jest jedną z najczęstszych luk w dzisiejszych aplikacjach internetowych. Przygotowane instrukcje używają powiązanych parametrów i nie łączą zmiennych z ciągami SQL, co uniemożliwia atakującemu zmodyfikowanie instrukcji SQL.
Przygotowane instrukcje łączą zmienną ze skompilowaną instrukcją SQL, dzięki czemu SQL i zmienne są wysyłane osobno. Zmienne są następnie interpretowane jako zwykłe łańcuchy i nie są częścią instrukcji SQL. Korzystając z metod opisanych w poniższych krokach, nie będziesz musiał używać żadnych innych technik filtrowania wstrzykiwania SQL, takich jak mysql_real_escape_string().
Kroki
Część 1 z 2: Zrozumienie wstrzykiwania SQL
Krok 1. SQL Injection to rodzaj luki w aplikacjach korzystających z bazy danych SQL
Luka powstaje, gdy dane wejściowe użytkownika są używane w instrukcji SQL:
$nazwa = $_GET['nazwa użytkownika']; $query = "SELECT hasło FROM tbl_user WHERE nazwa = '$nazwa' ";
Krok 2. Wartość, którą użytkownik wprowadzi do zmiennej URL nazwa użytkownika zostanie przypisana do zmiennej $nazwa
Jest on następnie umieszczany bezpośrednio w instrukcji SQL, umożliwiając użytkownikowi edycję instrukcji SQL.
$name = "administrator LUB 1=1 -- "; $query = "SELECT hasło FROM tbl_user WHERE nazwa = '$nazwa' ";
Krok 3. Baza danych SQL otrzyma następującą instrukcję SQL:
SELECT hasło FROM tbl_users WHERE nazwa = 'admin' OR 1=1 -- '
-
To jest poprawny SQL, ale zamiast zwracać jedno hasło dla użytkownika, instrukcja zwróci wszystkie hasła z tabeli tbl_user. To nie jest coś, czego potrzebujesz w swoich aplikacjach internetowych.
Część 2 z 2: Używanie mySQLi do tworzenia przygotowanych instrukcji
Krok 1. Utwórz zapytanie SELECT mySQLi
Użyj poniższego kodu, aby WYBRAĆ dane z tabeli za pomocą przygotowanych instrukcji mySQLi.
$nazwa = $_GET['nazwa użytkownika']; if ($stmt = $mysqli->prepare("SELECT hasło FROM tbl_users WHERE nazwa=?")) { // Powiąż zmienną z parametrem jako ciąg. $stmt->bind_param("s", $nazwa); // Wykonanie instrukcji. $stmt->wykonaj(); // Pobierz zmienne z zapytania. $stmt->bind_result($pass); // Pobierz dane. $stmt->pobierz(); // Wyświetl dane. printf("Hasło użytkownika %s to %s\n", $name, $pass); // Zamknij przygotowaną instrukcję. $stmt->zamknij(); }
Uwaga: Zmienna $mysqli jest obiektem połączenia mySQLi
Krok 2. Utwórz zapytanie INSERT mySQLi
Użyj poniższego kodu, aby WSTAWIĆ dane do tabeli za pomocą przygotowanych instrukcji mySQLi.
$nazwa = $_GET['nazwa użytkownika']; $hasło = $_GET['hasło']; if ($stmt = $mysqli->prepare("INSERT INTO tbl_users (nazwa, hasło) VALUES (?, ?)")) { // Powiąż zmienne z parametrem jako łańcuchy. $stmt->bind_param("ss", $nazwa, $hasło); // Wykonanie instrukcji. $stmt->wykonaj(); // Zamknij przygotowaną instrukcję. $stmt->zamknij(); }
Uwaga: Zmienna $mysqli jest obiektem połączenia mySQLi
Krok 3. Utwórz zapytanie UPDATE mySQLi
Użyj poniższego kodu, aby UAKTUALNIĆ dane w tabeli za pomocą przygotowanych instrukcji mySQLi.
$nazwa = $_GET['nazwa użytkownika']; $hasło = $_GET['hasło']; if ($stmt = $mysqli->prepare("UPDATE tbl_users SET hasło = ? WHERE nazwa = ?")) { // Powiąż zmienne z parametrem jako ciągi. $stmt->bind_param("ss", $hasło, $nazwa); // Wykonanie instrukcji. $stmt->wykonaj(); // Zamknij przygotowaną instrukcję. $stmt->zamknij(); }
Uwaga: Zmienna $mysqli jest obiektem połączenia mySQLi
Krok 4. Utwórz zapytanie mySQLi DELETE
Poniższy skrypt pokazuje, jak USUNĄĆ dane z tabeli za pomocą przygotowanych instrukcji mySQLi.
$nazwa = $_GET['nazwa użytkownika']; $hasło = $_GET['hasło']; if ($stmt = $mysqli->prepare("DELETE FROM tbl_users WHERE nazwa = ?")) { // Powiąż zmienną z parametrem jako ciąg. $stmt->bind_param("s", $nazwa); // Wykonanie instrukcji. $stmt->wykonaj(); // Zamknij przygotowaną instrukcję. $stmt->zamknij(); }