Lektion 06 - Sicherheit
Fehlerbehandlung, SQL-Injection und sichere API-Antworten
APIs muessen nicht nur funktionieren, sondern auch sicher und verstaendlich reagieren. In dieser Lektion lernst du typische Fehler und sichere Grundregeln.
1. SQL-Injection einfach erklaert
SQL-Injection passiert, wenn fremde Eingaben als SQL-Code interpretiert werden. Ein Angreifer versucht dann, deine SQL-Abfrage zu veraendern.
Gefaehrlich:
$email = $_GET['email'];
$sql = "SELECT * FROM users WHERE email = '$email'";
Angreifer-Eingabe:
' OR '1' = '1
Dadurch kann aus einer normalen Suche eine manipulierte Abfrage werden.
2. Prepared Statements fuer Werte
$stmt = $conn->prepare(
'SELECT id, name, email FROM users WHERE email = ?'
);
$stmt->bind_param('s', $email);
$stmt->execute();
Werte werden getrennt vom SQL-Befehl uebergeben. Dadurch behandelt die Datenbank die Eingabe als Wert und nicht als SQL-Code.
3. Whitelist fuer Tabellen, Spalten und Sortierung
Prepared Statements sind fuer Werte gut. Fuer Tabellen- oder Spaltennamen brauchst du eine Whitelist.
$allowedSorts = [
'name' => 'name',
'points' => 'points',
];
$sort = $_GET['sort'] ?? 'name';
if (!array_key_exists($sort, $allowedSorts)) {
$sort = 'name';
}
$sql = 'SELECT id, name, points FROM users ORDER BY ' . $allowedSorts[$sort];
4. API-Fehler einheitlich ausgeben
function sendJsonError(int $statusCode, string $message): void
{
http_response_code($statusCode);
echo json_encode([
'success' => false,
'message' => $message,
]);
exit;
}
Einheitliche Fehlerantworten machen deine API leichter testbar und verstaendlicher.
5. Entwicklungsfehler vs. Live-System
display_errors = 1display_errors = 06. API-Regeln als Checkliste
- Immer JSON-Header setzen.
- Eingaben immer pruefen.
- Werte mit Prepared Statements binden.
- Tabellen und Spalten nur per Whitelist erlauben.
- Bei Fehlern sinnvolle HTTP-Statuscodes setzen.
- Keine Datenbankpasswoerter oder SQL-Fehler live ausgeben.
- Antworten einheitlich strukturieren.
7. Uebungen
- Erklaere SQL-Injection in eigenen Worten.
- Schreibe ein Prepared Statement fuer User-Suche per E-Mail.
- Baue eine Whitelist fuer erlaubte Sortierungen.
- Schreibe eine Funktion
sendJsonError. - Erweitere deine API um Fehlerstatus
400und500. - Erklaere, warum Tabellennamen nicht direkt aus
$_GETkommen duerfen.