PHP Kurs Uebungen

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

EntwicklungLive-System
Fehler anzeigen.Fehler nicht offen anzeigen.
display_errors = 1display_errors = 0
Debuggen und lernen.Logs nutzen und sensible Daten schuetzen.

6. API-Regeln als Checkliste

  1. Immer JSON-Header setzen.
  2. Eingaben immer pruefen.
  3. Werte mit Prepared Statements binden.
  4. Tabellen und Spalten nur per Whitelist erlauben.
  5. Bei Fehlern sinnvolle HTTP-Statuscodes setzen.
  6. Keine Datenbankpasswoerter oder SQL-Fehler live ausgeben.
  7. Antworten einheitlich strukturieren.

7. Uebungen

  1. Erklaere SQL-Injection in eigenen Worten.
  2. Schreibe ein Prepared Statement fuer User-Suche per E-Mail.
  3. Baue eine Whitelist fuer erlaubte Sortierungen.
  4. Schreibe eine Funktion sendJsonError.
  5. Erweitere deine API um Fehlerstatus 400 und 500.
  6. Erklaere, warum Tabellennamen nicht direkt aus $_GET kommen duerfen.
Weiter zu PHP Uebungen