Heim > Backend-Entwicklung > PHP-Tutorial > Schutz von PHP-Anwendungen vor SQL-Injection-Angriffen

Schutz von PHP-Anwendungen vor SQL-Injection-Angriffen

DDD
Freigeben: 2024-09-14 06:23:36
Original
1296 Leute haben es durchsucht

Securing PHP Applications Against SQL Injection Attacks

Das Blockieren von SQL-Injection-Angriffen ist entscheidend für die Aufrechterhaltung der Sicherheit Ihrer PHP-Anwendungen. SQL-Injection ist eine Schwachstelle, die es Angreifern ermöglicht, beliebigen SQL-Code in Ihrer Datenbank auszuführen, was möglicherweise zu Datenschutzverletzungen oder -verlusten führt. Hier ist eine Schritt-für-Schritt-Anleitung zur Verhinderung von SQL-Injection-Angriffen in PHP, komplett mit praktischen Beispielen und Beschreibungen.

1. SQL-Injection verstehen

SQL-Injection tritt auf, wenn Benutzereingaben nicht ordnungsgemäß bereinigt und in SQL-Abfragen integriert werden. Wenn ein Benutzer beispielsweise bösartigen SQL-Code eingibt, könnte er Ihre Abfrage manipulieren, um unbeabsichtigte Aktionen auszuführen.

Beispiel für SQL-Injection:

// Vulnerable Code
$user_id = $_GET['user_id'];
$query = "SELECT * FROM users WHERE id = $user_id";
$result = mysqli_query($conn, $query);
Nach dem Login kopieren

Wenn user_id auf 1 ODER 1=1 gesetzt ist, lautet die Abfrage wie folgt:

SELECT * FROM users WHERE id = 1 OR 1=1
Nach dem Login kopieren

Diese Abfrage gibt alle Zeilen aus der Benutzertabelle zurück, da 1=1 immer wahr ist.

2. Verwenden Sie vorbereitete Anweisungen

Vorbereitete Anweisungen sind ein wichtiger Schutz gegen SQL-Injection. Sie trennen die SQL-Logik von den Daten und stellen sicher, dass Benutzereingaben als Daten und nicht als ausführbarer Code behandelt werden.

MySQLi mit vorbereiteten Anweisungen verwenden:

  1. Mit der Datenbank verbinden:
   $conn = new mysqli("localhost", "username", "password", "database");

   if ($conn->connect_error) {
       die("Connection failed: " . $conn->connect_error);
   }
Nach dem Login kopieren
  1. Bereiten Sie die SQL-Anweisung vor:
   $stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
Nach dem Login kopieren
  1. Bindungsparameter:
   $stmt->bind_param("i", $user_id); // "i" indicates the type is integer
Nach dem Login kopieren
  1. Führen Sie die Anweisung aus:
   $user_id = $_GET['user_id'];
   $stmt->execute();
Nach dem Login kopieren
  1. Ergebnisse abrufen:
   $result = $stmt->get_result();
   while ($row = $result->fetch_assoc()) {
       // Process results
   }
Nach dem Login kopieren
  1. Anweisung und Verbindung schließen:
   $stmt->close();
   $conn->close();
Nach dem Login kopieren

Vollständiges Beispiel:

<?php
// Database connection
$conn = new mysqli("localhost", "username", "password", "database");

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// Prepare statement
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
if ($stmt === false) {
    die("Prepare failed: " . $conn->error);
}

// Bind parameters
$user_id = $_GET['user_id'];
$stmt->bind_param("i", $user_id);

// Execute statement
$stmt->execute();

// Get results
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    echo "User ID: " . $row['id'] . "<br>";
    echo "User Name: " . $row['name'] . "<br>";
}

// Close statement and connection
$stmt->close();
$conn->close();
?>
Nach dem Login kopieren

3. Verwenden Sie PDO mit vorbereiteten Anweisungen

PHP Data Objects (PDO) bieten einen ähnlichen Schutz gegen SQL-Injection und unterstützen mehrere Datenbanksysteme.

PDO mit vorbereiteten Anweisungen verwenden:

  1. Mit der Datenbank verbinden:
   try {
       $pdo = new PDO("mysql:host=localhost;dbname=database", "username", "password");
       $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
   } catch (PDOException $e) {
       die("Connection failed: " . $e->getMessage());
   }
Nach dem Login kopieren
  1. Bereiten Sie die SQL-Anweisung vor:
   $stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
Nach dem Login kopieren
  1. Parameter binden und ausführen:
   $stmt->bindParam(':id', $user_id, PDO::PARAM_INT);
   $user_id = $_GET['user_id'];
   $stmt->execute();
Nach dem Login kopieren
  1. Ergebnisse abrufen:
   $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
   foreach ($results as $row) {
       echo "User ID: " . $row['id'] . "<br>";
       echo "User Name: " . $row['name'] . "<br>";
   }
Nach dem Login kopieren

Vollständiges Beispiel:

setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

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

    // Bind parameters
    $user_id = $_GET['user_id'];
    $stmt->bindParam(':id', $user_id, PDO::PARAM_INT);

    // Execute statement
    $stmt->execute();

    // Fetch results
    $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
    foreach ($results as $row) {
        echo "User ID: " . $row['id'] . "
"; echo "User Name: " . $row['name'] . "
"; } } catch (PDOException $e) { die("Error: " . $e->getMessage()); } ?>
Nach dem Login kopieren

4. Zusätzliche Sicherheitspraktiken

  • Eingabe bereinigen: Benutzereingaben stets bereinigen und validieren, um sicherzustellen, dass sie im erwarteten Format vorliegen.
  • ORM verwenden: Objektrelationale Mapper wie Eloquent (Laravel) kümmern sich intern um den SQL-Injection-Schutz.
  • Datenbankberechtigungen beschränken: Verwenden Sie das Prinzip der geringsten Rechte für Datenbankbenutzerkonten.

5. Fazit

Das Blockieren von SQL-Injection-Angriffen ist für die Sicherheit Ihrer PHP-Anwendungen von entscheidender Bedeutung. Durch die Verwendung vorbereiteter Anweisungen mit MySQLi oder PDO stellen Sie sicher, dass Benutzereingaben sicher verarbeitet und nicht als Teil Ihrer SQL-Abfragen ausgeführt werden. Wenn Sie diese Best Practices befolgen, können Sie Ihre Anwendungen vor einer der häufigsten Web-Schwachstellen schützen.

Das obige ist der detaillierte Inhalt vonSchutz von PHP-Anwendungen vor SQL-Injection-Angriffen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage