30 Datenverarbeitung und -speicherung

30.1 Arbeiten mit Formularen

Formulare sind ein essentieller Bestandteil moderner Webanwendungen und bilden die Grundlage für die Interaktion zwischen Nutzern und dem Backend. In PHP gibt es verschiedene Methoden, um Formulardaten zu verarbeiten, zu validieren und sicher zu speichern.

30.1.1 Grundlagen der Formularverarbeitung

Ein HTML-Formular wird in der Regel mit der <form>-Tag-Syntax erstellt und enthält verschiedene Eingabefelder. PHP kann die übermittelten Daten über die superglobalen Arrays $_GET, $_POST und $_REQUEST verarbeiten.

<!-- Einfaches Kontaktformular (contact.html) -->
<form action="process.php" method="post">
    <div>
        <label for="name">Name:</label>
        <input type="text" id="name" name="name" required>
    </div>
    <div>
        <label for="email">E-Mail:</label>
        <input type="email" id="email" name="email" required>
    </div>
    <div>
        <label for="message">Nachricht:</label>
        <textarea id="message" name="message" required></textarea>
    </div>
    <button type="submit">Absenden</button>
</form>

Im PHP-Skript process.php können wir auf die übermittelten Daten zugreifen:

<?php
// Verarbeitung des Kontaktformulars (process.php)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = $_POST['name'] ?? '';
    $email = $_POST['email'] ?? '';
    $message = $_POST['message'] ?? '';
    
    // Weitere Verarbeitung...
    echo "Formular wurde abgesendet von: $name ($email)";
}

30.1.2 Formular-Methoden: GET vs. POST

Die beiden häufigsten Methoden für die Datenübermittlung sind GET und POST:

<?php
// GET-Methode
if (isset($_GET['search'])) {
    $searchTerm = $_GET['search'];
    echo "Sie haben nach '$searchTerm' gesucht.";
}

// POST-Methode
if (isset($_POST['password'])) {
    $password = $_POST['password'];
    // Niemals Passwörter im Klartext ausgeben!
    echo "Passwort wurde übermittelt.";
}

30.1.3 Validierung von Formulardaten

Die Validierung von Eingabedaten ist ein kritischer Sicherheitsaspekt. Niemals sollten ungeprüfte Benutzerdaten verarbeitet werden.

<?php
// Einfache Validierung von Formulardaten
$errors = [];

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Name validieren
    $name = trim($_POST['name'] ?? '');
    if (empty($name)) {
        $errors[] = "Name ist erforderlich.";
    } elseif (strlen($name) > 100) {
        $errors[] = "Name darf maximal 100 Zeichen lang sein.";
    }
    
    // E-Mail validieren
    $email = trim($_POST['email'] ?? '');
    if (empty($email)) {
        $errors[] = "E-Mail ist erforderlich.";
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = "E-Mail-Format ist ungültig.";
    }
    
    // Wenn keine Fehler aufgetreten sind, weiterverarbeiten
    if (empty($errors)) {
        // Erfolgreiche Verarbeitung
        echo "Formular erfolgreich validiert!";
    } else {
        // Fehler anzeigen
        echo "<ul>";
        foreach ($errors as $error) {
            echo "<li>$error</li>";
        }
        echo "</ul>";
    }
}

30.1.4 Sanitization - Bereinigung von Eingabedaten

Neben der Validierung ist auch die Bereinigung (Sanitization) von Eingabedaten wichtig, um beispielsweise XSS-Angriffe zu verhindern:

<?php
// Bereinigung von Eingabedaten
$name = htmlspecialchars(trim($_POST['name'] ?? ''), ENT_QUOTES, 'UTF-8');
$email = filter_var(trim($_POST['email'] ?? ''), FILTER_SANITIZE_EMAIL);
$message = htmlspecialchars(trim($_POST['message'] ?? ''), ENT_QUOTES, 'UTF-8');

30.1.5 Persistente Formulardaten

Eine gute Nutzererfahrung beinhaltet das Beibehalten von bereits eingegebenen Daten, wenn das Formular aufgrund von Validierungsfehlern erneut angezeigt wird:

<?php
// Formular mit persistenten Daten
$name = $_POST['name'] ?? '';
$email = $_POST['email'] ?? '';
$message = $_POST['message'] ?? '';
?>

<form method="post">
    <div>
        <label for="name">Name:</label>
        <input type="text" id="name" name="name" value="<?php echo htmlspecialchars($name); ?>" required>
    </div>
    <div>
        <label for="email">E-Mail:</label>
        <input type="email" id="email" name="email" value="<?php echo htmlspecialchars($email); ?>" required>
    </div>
    <div>
        <label for="message">Nachricht:</label>
        <textarea id="message" name="message" required><?php echo htmlspecialchars($message); ?></textarea>
    </div>
    <button type="submit">Absenden</button>
</form>

30.1.6 Datei-Uploads

PHP unterstützt auch das Hochladen von Dateien über Formulare. Hierzu wird das enctype-Attribut auf multipart/form-data gesetzt:

<form action="upload.php" method="post" enctype="multipart/form-data">
    <div>
        <label for="profileImage">Profilbild:</label>
        <input type="file" id="profileImage" name="profileImage">
    </div>
    <button type="submit">Hochladen</button>
</form>

Die Verarbeitung des Uploads in PHP:

<?php
// Datei-Upload-Verarbeitung (upload.php)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['profileImage'])) {
    $file = $_FILES['profileImage'];
    
    // Prüfen auf Fehler
    if ($file['error'] === UPLOAD_ERR_OK) {
        // Validieren des Dateityps
        $allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
        if (in_array($file['type'], $allowedTypes)) {
            // Zielverzeichnis
            $uploadDir = 'uploads/';
            
            // Eindeutigen Dateinamen generieren
            $filename = uniqid() . '_' . basename($file['name']);
            $destination = $uploadDir . $filename;
            
            // Datei verschieben
            if (move_uploaded_file($file['tmp_name'], $destination)) {
                echo "Datei wurde erfolgreich hochgeladen: $destination";
            } else {
                echo "Fehler beim Verschieben der Datei.";
            }
        } else {
            echo "Ungültiger Dateityp. Erlaubt sind nur JPG, PNG und GIF.";
        }
    } else {
        echo "Fehler beim Upload: " . $file['error'];
    }
}

30.1.7 CSRF-Schutz bei Formularen

Cross-Site Request Forgery (CSRF) ist eine häufige Angriffsmethode. Ein einfacher Schutz besteht in der Verwendung von Token:

<?php
// CSRF-Token-Generierung
session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
$csrfToken = $_SESSION['csrf_token'];
?>

<form method="post">
    <input type="hidden" name="csrf_token" value="<?php echo $csrfToken; ?>">
    <!-- Weitere Formularfelder -->
    <button type="submit">Absenden</button>
</form>

<?php
// CSRF-Token-Validierung bei Formularübermittlung
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die('CSRF-Token-Validierung fehlgeschlagen.');
    }
    
    // Formularverarbeitung fortsetzen...
}

30.1.8 Formularverarbeitung mit PHP-Frameworks

In modernen PHP-Frameworks wie Laravel oder Symfony wird die Formularverarbeitung durch spezielle Komponenten vereinfacht. Diese bieten erweiterte Funktionen für Validierung, CSRF-Schutz und Dateiuploads. Details dazu werden im Kapitel zu PHP-Frameworks behandelt.

30.1.9 Zusammenfassung

Die sichere Verarbeitung von Formulardaten in PHP umfasst mehrere Schritte:

  1. Datenübermittlung durch GET oder POST
  2. Zugriff auf die Daten über superglobale Arrays
  3. Validierung und Bereinigung der Eingabedaten
  4. Persistentes Speichern der Daten bei Validierungsfehlern
  5. Implementierung von Sicherheitsmaßnahmen wie CSRF-Schutz

Diese Grundlagen bilden die Basis für die Entwicklung von sicheren und benutzerfreundlichen Webanwendungen in PHP. In den folgenden Abschnitten werden wir uns mit der Verarbeitung und Speicherung dieser Daten in Dateien und Datenbanken beschäftigen.