Input Validation Sanitization
Input Validation: Benutzereingaben sicher verarbeiten
Niemals Benutzereingaben vertrauen! Dieser Guide zeigt, wie Sie Eingaben validieren und sanitisieren, um Ihre Anwendung zu schützen.
Validation vs. Sanitization
| Konzept | Beschreibung | Beispiel |
|---|---|---|
| Validation | Prüft ob Eingabe gültig ist | Ist es eine gültige E-Mail? |
| Sanitization | Bereinigt/transformiert Eingabe | HTML-Tags entfernen |
Wichtige Grundregeln
Goldene Regeln:
- Validiere auf dem Server (Client-Validierung kann umgangen werden)
- Whitelist statt Blacklist (erlaube nur bekannte Werte)
- Sanitisiere bei der Ausgabe, nicht nur bei der Eingabe
- Verwende parametrisierte Queries für Datenbanken
PHP Validation
<?php
// Filter-Funktionen
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
$url = filter_var($_POST['website'], FILTER_VALIDATE_URL);
$int = filter_var($_POST['age'], FILTER_VALIDATE_INT, [
'options' => ['min_range' => 0, 'max_range' => 120]
]);
// Prüfung
if ($email === false) {
$errors[] = 'Ungültige E-Mail-Adresse';
}
// Sanitization
$name = filter_var($_POST['name'], FILTER_SANITIZE_STRING);
$html = filter_var($_POST['content'], FILTER_SANITIZE_FULL_SPECIAL_CHARS);
// Eigene Validierung
function validateUsername(string $username): bool {
// Nur Buchstaben, Zahlen, Unterstriche, 3-20 Zeichen
return preg_match('/^[a-zA-Z0-9_]{3,20}$/', $username) === 1;
}
// Trim und Längenprüfung
$input = trim($_POST['title']);
if (strlen($input) > 255) {
$errors[] = 'Titel zu lang (max. 255 Zeichen)';
}
JavaScript Validation
// Clientseitig (für UX, nicht für Sicherheit!)
function validateEmail(email) {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return regex.test(email);
}
function validateForm(form) {
const errors = [];
const email = form.email.value.trim();
if (!validateEmail(email)) {
errors.push('Ungültige E-Mail');
}
const password = form.password.value;
if (password.length < 8) {
errors.push('Passwort mindestens 8 Zeichen');
}
const age = parseInt(form.age.value);
if (isNaN(age) || age < 0 || age > 120) {
errors.push('Ungültiges Alter');
}
return errors;
}
// Node.js mit express-validator
const { body, validationResult } = require('express-validator');
app.post('/register', [
body('email').isEmail().normalizeEmail(),
body('password').isLength({ min: 8 }),
body('username').trim().isAlphanumeric().isLength({ min: 3, max: 20 }),
body('age').isInt({ min: 0, max: 120 })
], (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
// Weiter verarbeiten...
});
Typische Validierungen
// E-Mail
/^[^\s@]+@[^\s@]+\.[^\s@]+$/
// URL
/^https?:\/\/.+/
// Telefonnummer (DE)
/^(\+49|0)[1-9]\d{1,14}$/
// PLZ (DE)
/^\d{5}$/
// Username
/^[a-zA-Z0-9_]{3,20}$/
// Passwort (min. 8 Zeichen, Groß/Klein, Zahl, Sonderzeichen)
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/
// Datum (YYYY-MM-DD)
/^\d{4}-\d{2}-\d{2}$/
// UUID
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i
Sanitization für Ausgabe
<?php // HTML-Ausgabe (verhindert XSS) echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8'); // In JavaScript const escaped = document.createTextNode(userInput).textContent; // Oder mit Library // DOMPurify für HTML-Inhalt import DOMPurify from 'dompurify'; const clean = DOMPurify.sanitize(dirtyHTML);
Datei-Upload Validation
<?php
$allowed = ['image/jpeg', 'image/png', 'image/gif'];
$maxSize = 5 * 1024 * 1024; // 5 MB
// MIME-Type prüfen (nicht auf Extension verlassen!)
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->file($_FILES['upload']['tmp_name']);
if (!in_array($mimeType, $allowed)) {
die('Ungültiger Dateityp');
}
if ($_FILES['upload']['size'] > $maxSize) {
die('Datei zu groß');
}
// Dateiname sanitisieren
$filename = preg_replace('/[^a-zA-Z0-9_.-]/', '', $_FILES['upload']['name']);
$filename = substr($filename, 0, 100); // Länge begrenzen
// Zufälligen Namen verwenden
$newName = bin2hex(random_bytes(16)) . '.' . pathinfo($filename, PATHINFO_EXTENSION);
Checkliste
Input Validation Checkliste:
- Serverseitige Validierung implementiert
- Eingabelängen begrenzt
- Datentypen geprüft
- Whitelist für erlaubte Werte
- Sanitization bei der Ausgabe
- Parametrisierte DB-Queries
- Datei-Uploads geprüft