Sicherheit in PHP

Erste Schritte: Sicherheit in PHP: Sessions, Cookies, CSRF, XSS, Passwort‑Hashing

Web­anwendungen verarbeiten sensible Daten – daher ist ein sicheres Handling von Sitzungen, Cookies
und Benutzereingaben essenziell. Dieses Tutorial fasst die wichtigsten Schutzmechanismen zusammen
und zeigt jeweils kurze PHP‑Beispiele nur in <pre>‑Blöcken.

1. Sessions – Absichern & richtig starten

  • session_start() vor jeglicher Ausgabe aufrufen.
  • Session‑ID regenerieren nach Login (session_regenerate_id(true)), um Fixation zu verhindern.
  • Cookie‑Flags – httponly (kein JS‑Zugriff) & secure (nur HTTPS).
 0,
    'path'     => '/',
    'secure'   => true,      // nur über HTTPS übertragen
    'httponly' => true,      // kein Zugriff via JS
    'samesite' => 'Lax'      // CSRF‑Basis­schutz
]);
session_start();

// Nach erfolgreichem Login
session_regenerate_id(true); // alte ID ungültig
$_SESSION['userid'] = $userId;
?>

2. Cookies sicher setzen

Vermeide Klartext‑Infos in Cookies; nutze Flags wie secure, httponly und samesite.

setcookie(
    'remember_token',
    $token,          // zufälliger Hash, kein Klartext‑PW
    [
        'expires'  => time()+60*60*24*30,
        'path'     => '/',
        'secure'   => true,
        'httponly' => true,
        'samesite' => 'Strict'
    ]
);

3. CSRF‑Schutz (Cross‑Site Request Forgery)

CSRF verhindert man, indem man pro Session ein zufälliges Token generiert
und als verstecktes Feld in jedem state‑changing Formular mitsendet.


4. XSS‑Schutz (Cross‑Site Scripting)

Grundregel: Escape Output. Gib Benutzereingaben nie roh zurück.


Für HTML‑Attribute, URLs oder JavaScript‑Kontexte gelten weitere spezialisierte Escaper
(z. B. FILTER_SANITIZE_URL, CSP‑Header).

5. Passwort‑Hashing mit password_hash()

  • Verwende nie md5 / sha1 – nutze password_hash (BCRYPT / ARGON2).
  • Speichere nur den Hash, nie das Klartext‑Passwort.
  • Zum Prüfen: password_verify.
prepare("INSERT INTO users (user, pass) VALUES (:u, :p)")
    ->execute([':u' => $user, ':p' => $hash]);

// Login
$stmt = $pdo->prepare("SELECT pass FROM users WHERE user=:u");
$stmt->execute([':u' => $user]);
$hash = $stmt->fetchColumn();

if ($hash && password_verify($password, $hash)) {
    echo "Login OK";
} else {
    echo "Falsche Daten";
}
?>

6. Weitere Schutzmaßnahmen

  • Content‑Security‑Policy (CSP)‑Header gegen XSS.
  • Strict‑Transport‑Security (HSTS) – erfordert HTTPS.
  • Prepared Statements (PDO / mysqli) gegen SQL‑Injection.
  • Rate‑Limiting & Captcha bei Login/Forms.

Fazit

Sichere PHP‑Apps bauen auf mehreren Ebenen:

  1. Session‑Handling mit sicheren Cookie‑Flags.
  2. CSRF‑Tokens für alle gefährlichen POST/PUT/DELETE‑Aktionen.
  3. Konsequentes htmlspecialchars gegen XSS.
  4. Starkes Passwort‑Hashing via password_hash.

Kombiniert mit Prepared Statements, CSP und HTTPS machst du deine Anwendung
robust gegenüber den meisten gängigen Angriffsvektoren.