Aktueller Standort: Startseite> Neueste Artikel> Wie kann man SQL -Injektionsangriffe effektiv verhindern, wenn Sie mit Pdostatement :: Fetchall abfragen?

Wie kann man SQL -Injektionsangriffe effektiv verhindern, wenn Sie mit Pdostatement :: Fetchall abfragen?

M66 2025-06-28

Was ist die SQL -Injektion?

Die SQL -Injektion bezieht sich auf den Angreifer, der böswilligen SQL -Code in SQL -Abfragen einfügt, um den Zweck des Diebstahls, Manipulierens der Daten und sogar der Steuerung des Datenbankservers zu erreichen. Wenn ein Entwickler beispielsweise die Benutzereingabe direkt in eine SQL -Abfrageanweisung eingibt, kann ein Angreifer die Abfragelogik ändern, indem sie einen bestimmten SQL -Code eingeben.

Nehmen wir beispielsweise an, es gibt die folgende Abfrageanweisung:

 $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

Wenn der Angreifer als Benutzername oder Passwort Folgendes eingibt:

  • Benutzername: 'oder' 1 '=' 1

  • Passwort: 'oder' 1 '=' 1

Diese Abfrageanweisung wird:

 SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '' OR '1'='1';

Dies umgeht die normale Authentifizierung und Angreifer können leicht sensible Daten erhalten. Um dies zu verhindern, können wir parametrisierte Abfragen (vorbereitete Aussagen) verwenden, um die Anwendung vor SQL -Injektionsangriffen zu schützen.


Verhindern Sie die SQL -Injektion mit PDO

PDO bietet einen leistungsstarken Mechanismus zur Vorbeugung der SQL -Injektion, nämlich vorbereitete Aussagen . Bei Vorverarbeitungsanweisungen wird die Benutzereingabe in der Abfrage eher als Parameter als als Teil des SQL -Codes behandelt, sodass die Datenbank sie nicht ausführt, selbst wenn der Benutzer einen böswilligen SQL -Code eingibt.

1. Mit PDO stellen Sie eine Verbindung zur Datenbank her

Zunächst müssen Sie mit PDO eine Verbindung zur Datenbank herstellen. Stellen Sie sicher, dass die Ausnahmeregelung beim Erstellen einer Verbindung aktiviert ist, was besser Debug -Fehler kann.

 try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
    echo "Die Datenbankverbindung ist fehlgeschlagen: " . $e->getMessage();
}

2. Abfragen Sie die Vorverarbeitungsanweisungen an

Die Vorverarbeitungsanweisungen von PDO verhindern nicht nur die SQL -Injektion, sondern verbessern auch die Abfrageleistung, insbesondere wenn mehrere Abfragen desselben Typs ausgeführt werden.

Angenommen, wir haben eine Abfrage, die Benutzerdaten basierend auf dem Benutzernamen des Benutzers abrufen muss. Wir können den folgenden Code verwenden:

 $sql = "SELECT * FROM users WHERE username = :username";
$stmt = $pdo->prepare($sql);

// Binden Sie Parameter
$stmt->bindParam(':username', $username, PDO::PARAM_STR);

// Eine Frage ausführen
$stmt->execute();

// Abfragenergebnisse erhalten
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);

// Ausgangsergebnis
foreach ($results as $row) {
    echo "Benutzername: " . $row['username'] . "<br>";
    echo "Post: " . $row['email'] . "<br>";
}

Im obigen Code: Der Benutzername ist ein Platzhalter, und der vom Benutzer eingegebene Benutzername wird durch die BindParam -Methode an den Platzhalter gebunden. Diese Methode stellt sicher, dass der Benutzer unabhängig davon als Parameter an die Datenbank übergeben wird, anstatt direkt in die SQL -Abfrage gespleißt zu werden, wodurch die SQL -Injektion effektiv verhindert wird.

3.. Verwenden Sie Fetchall, um die Ergebnisse zu erhalten

Die Pdostatement :: Fetchall -Methode kann die Abfrageergebnisse als Array zurückgeben. Es ist ideal, um mehrere Datenzeilen zu erhalten. Fetchall (pdo :: fetch_assoc) im obigen Code gibt das Abfrageergebnis in die Form eines assoziativen Arrays zurück, wobei jedes Element einer Datenzeile entspricht.

Wenn Sie alle Abfrageergebnisse erhalten möchten, können Sie die folgende Methode verwenden:

 $results = $stmt->fetchAll(PDO::FETCH_ASSOC);

Wenn Sie nur ein einzelnes Zeilenergebnis benötigen, können Sie die Fetch -Methode verwenden. Wenn Sie mehrere Zeilenergebnisse erhalten möchten, ist Fetchall eine gute Wahl.

4. Hinweise bei der Verwendung von URL -Parametern

Vorverarbeitungsanweisungen sollten bei der Verarbeitung von Benutzereingaben, insbesondere bei URL -Parametern, immer verwendet werden. Wenn die URL beispielsweise einen bestimmten ID -Parameter enthält, sollte sie vermeiden, sich direkt in SQL -Anweisungen zu spleißen, diese jedoch durch Vorverarbeitungsanweisungen zu übergeben.

Unter der Annahme, dass ein ID -Parameter in die URL übergeben wird, können Sie den folgenden Code verwenden, um eine sichere Abfrage auszuführen:

 $id = $_GET['id'];  // Erhalten URL Intern id Parameter

$sql = "SELECT * FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);

// Binden Sie Parameter
$stmt->bindParam(':id', $id, PDO::PARAM_INT);

// Eine Frage ausführen
$stmt->execute();

// Abfragenergebnisse erhalten
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
  • Verwandte Tags:

    SQL