SQL-Injection ist eine häufige Angriffstechnik, bei der ein Angreifer Schadcode in SQL-Abfragen einfügt, um unautorisierte Aktionen auf der Datenbank auszuführen. Dies geschieht oft durch die Eingabefelder einer Webanwendung, in denen der Benutzer Daten eingeben kann, die dann in SQL-Abfragen verwendet werden. Ein Angreifer kann spezielle Zeichen und Befehle einfügen, um die ursprüngliche SQL-Abfrage zu manipulieren und beispielsweise Datenbanken zu durchsuchen, zu ändern oder zu löschen.
1. Einfache SQL-Injection:
Angenommen, wir haben eine SQL-Abfrage zur Benutzeranmeldung: ```php $username = $_POST[‘username’]; $password = $_POST[‘password’]; $query = “SELECT * FROM users WHERE username = ‘$username’ AND password = ‘$password’”; ``` Wenn ein Angreifer das `username`-Feld mit `admin’ —` ausfüllt, wird die Abfrage zu: ```sql SELECT * FROM users WHERE username = ‘admin’ —’ AND password = ‘anything‘ ``` Das `—` kommentiert den Rest der Abfrage aus, wodurch die Passwortüberprüfung umgangen wird.2. Union-based SQL-Injection:
Hierbei fügt der Angreifer `UNION`-Statements ein, um zusätzliche Abfragen auszuführen: ```php $id = $_GET[‘id’]; $query = “SELECT name, email FROM users WHERE id = $id”; ``` Wenn der Angreifer `$id` mit `1 UNION SELECT ‘hacker’, ‘hacker@attacker.com’` füllt, erhält er: ```sql SELECT name, email FROM users WHERE id = 1 UNION SELECT ‘hacker’, ‘hacker@attacker.com‘ ```
Um SQL-Injection zu verhindern, sollte man Parameter-binding und vorbereitete Anweisungen verwenden. Dies kann mit den PDO-Erweiterungen (PHP Data Objects) oder MySQLi in PHP erreicht werden.
```php
try {
$pdo = new PDO;
// Bereite die Anweisung vor
$stmt = $pdo->prepare(‘SELECT * FROM users WHERE username = :username AND password = :password’);
// Verbindet die Parameter
$stmt->execute([‘username’ => $_POST[‘username’], ‘password’ => $_POST[‘password’]]);
$user = $stmt->fetch();
if ($user) {
echo ‘Login erfolgreich’;
} else {
echo ‘Login fehlgeschlagen’;
}
} catch (PDOException $e) {
echo ‘Datenbankfehler: ‘ . $e->getMessage();
}
```
```php
$mysqli = new mysqli(‘localhost’, ‘username’, ‘password’, ‘testdb’);
if ($mysqli->connect_error) {
die(‘Verbindungsfehler (’ . $mysqli->connect_errno . ‘) ‘ . $mysqli->connect_error);
}
// Bereiten Sie die Anweisung vor
$stmt = $mysqli->prepare(‘SELECT * FROM users WHERE username = ? AND password = ?’);
$stmt->bind_param(‘ss’, $_POST[‘username’], $_POST[‘password’]);
// Führen Sie die Anweisung aus
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
echo ‘Login erfolgreich’;
} else {
echo ‘Login fehlgeschlagen’;
}
$stmt->close();
$mysqli->close();
```
Durch die Verwendung dieser Techniken stellen wir sicher, dass Benutzereingaben korrekt gehandhabt werden und SQL-Injection-Angriffe verhindert werden.