Jak zapobiegać wstrzykiwaniu SQL w PHP (ze zdjęciami)

Spisu treści:

Jak zapobiegać wstrzykiwaniu SQL w PHP (ze zdjęciami)
Jak zapobiegać wstrzykiwaniu SQL w PHP (ze zdjęciami)

Wideo: Jak zapobiegać wstrzykiwaniu SQL w PHP (ze zdjęciami)

Wideo: Jak zapobiegać wstrzykiwaniu SQL w PHP (ze zdjęciami)
Wideo: Jak ukryć przewody od telewizora? 2024, Może
Anonim

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

    2542820 1
    2542820 1

    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

    2542820 2
    2542820 2

    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

    2542820 3
    2542820 3

    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

    2542820 4
    2542820 4

    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(); }

Zalecana: