Navigation
 Startseite
 Fachbücher
 Anzeigenmarkt
 Forum
 Webmaster News
 Script Newsletter
 Kontakt
 Script Installation
 Php
 Php Tutorials
 Webhoster Vergleich
 Impressum

Community-Bereich
 kostenlos Registrieren
 Anmelden
 Benutzerliste

Script Datenbank
 Script Archiv
 Script Top 20
 Screenshots
 Testberichte

Suche
 

Unsere Php Scripts
 Counter Script
 Umfrage Script
 Bilder Upload Script
 Terminverwaltung
 Simple PHP Forum
 RSS Grabber

Script Mods
 phpBB Adsense Mode

Tools und Generatoren
 .htpasswd Generator
 md5 Generator
 base64 Generator
 Markdown to HTML
 Colorpicker
 Unix timestamp Tool
 TLD Liste
 Webkatalog‑Verzeichnis

Partner
 Sprüche Treff

Hosterplus.de
Bekommen Sie Speicherplatz (Webspace), Domains und...
https://www.Hosterplus.de
Artfiles.de
Bietet Serviceorientierte Internetdienstleistungen...
https://www.Artfiles.de
 
 
 

PHP session_id(): Der komplette Session Guide zur sicheren Verwaltung von Session-Funktionen

Sie befinden sich: Home > Php Tutorial > Sitzungs-IDs sicher setzen ...

Sitzungs-IDs sicher setzen und verwalten mit session_id()


Eintrag am:  29.06.2025
Hits / Besucher:  2888
Sprache:  Deutsch
Kategorie:  Fortgeschrittene Tut...
Tutorial Art:  eigenes
Eingetragen von   schubertmedia schubertmedia
 
Beschreibung

Jede PHP-Session hat eine eindeutige ID, die den Besucher identifiziert. Mit session_id() kannst du diese ID auslesen oder vor dem Start manuell setzen. Das Tutorial zeigt, wann das nötig ist, wie du die Sicherheit der ID konfigurierst und wie die verschiedenen Session-Funktionen zusammenspielen. Die Grundlagen zum Starten und Absichern von Sessions findest du im Tutorial zu session_start().

Illustration zu PHP session_id() mit Funktionsaufrufen und Titel zur sicheren Verwaltung von Sitzungs-IDs

Das folgende Diagramm zeigt, wie Browser und Server bei der Session-Verwaltung zusammenspielen. Vom ersten Request ohne Cookie bis zur erneuerten ID nach dem Login durchläuft jede Sitzung mehrere Schritte.

sequenceDiagram
    participant B as Browser
    participant S as Server
    B->>S: Request (ohne Cookie)
    S->>S: session_id() erzeugt ID
    S->>S: session_start()
    S->>B: Response + Set-Cookie
    B->>S: Request (mit Cookie)
    S->>S: session_start() laedt Session
    S->>S: session_regenerate_id(true)
    S->>B: Response + neues Cookie

Session-ID auslesen

Nach dem Aufruf von session_start() gibt session_id() die aktuelle Session-ID als String zurück:

<?php

session_start();

echo session_id();
/* z.B. "abc123def456ghi789jkl012mno345pq" */
?>

Vor session_start() liefert session_id() einen leeren String. Die ID wird erst beim Start der Session erzeugt oder aus dem Cookie gelesen.

Session-ID manuell setzen

In seltenen Fällen musst du die Session-ID vor dem Start selbst festlegen. Der Aufruf muss zwingend vor session_start() stehen:

<?php

/* ID muss VOR session_start() gesetzt werden */
session_id("meine_eigene_session_id_123");
session_start();

echo session_id();
// meine_eigene_session_id_123
?>

Erlaubte Zeichen

Die Session-ID darf nur Buchstaben (a-z, A-Z), Ziffern (0-9), Komma und Bindestrich enthalten. Sonderzeichen wie Leerzeichen, Schrägstriche oder Punkte führen zu einem Fehler.

Praxisbeispiel: Session-Migration

Ein konkreter Anwendungsfall für das manuelle Setzen der Session-ID ist die Migration zwischen verschiedenen Session-Speichern. Wenn du etwa von dateibasierter Session-Speicherung auf Redis umstellst, müssen die bestehenden Sessions übernommen werden:

<?php

/* Alte Session-ID aus dem Cookie lesen */
$alteId = $_COOKIE[session_name()] ?? "";

if ($alteId !== "") {
/* Session-Handler auf Redis umstellen */
ini_set(
"session.save_handler",
"redis"
);
ini_set(
"session.save_path",
"tcp://127.0.0.1:6379"
);

/* Alte ID uebernehmen, damit der
Benutzer eingeloggt bleibt */
session_id($alteId);
}

session_start();
?>

Ein weiterer Anwendungsfall ist Single-Sign-On zwischen Subdomains. Wenn app.example.com und api.example.com dieselbe Session teilen sollen, kann die ID über ein gemeinsames Cookie übergeben und manuell gesetzt werden.

Session-ID Konfiguration: Länge und Entropie

Die Sicherheit einer Session-ID hängt direkt von ihrer Länge und der verwendeten Zeichenmenge ab. PHP bietet zwei ini-Einstellungen dafür:

EinstellungDefaultEmpfehlungBedeutung
session.sid_length3248Anzahl Zeichen der Session-ID
session.sid_bits_per_character46Bits pro Zeichen (4=hex, 5=0-9a-v, 6=0-9a-zA-Z,-)

Mit den Standardwerten (32 Zeichen, 4 Bits) hat die Session-ID 128 Bit Entropie. Das reicht in den meisten Fällen. Für höhere Sicherheitsanforderungen erhöhst du die Länge auf 48 und die Bits auf 6, was 288 Bit Entropie ergibt und Brute-Force-Angriffe praktisch unmöglich macht:

<?php

/* In der php.ini oder per ini_set */
ini_set("session.sid_length", "48");
ini_set("session.sid_bits_per_character", "6");

session_start();
echo session_id();
/* z.B. "aB3xY7kM9pQ2wE5rT8uI1oL4nJ6fH0gD3cV7bN9mK2" */
?>

Session-ID erneuern mit session_regenerate_id()

Nach sicherheitsrelevanten Aktionen wie dem Login sollte die Session-ID erneuert werden. Das verhindert Session-Fixation-Angriffe, bei denen ein Angreifer dem Opfer eine bekannte ID unterschiebt:

<?php

session_start();

/* Nach erfolgreichem Login: neue ID */
session_regenerate_id(true);

$_SESSION["user_id"] = $userId;
/* true loescht die alte Session-Datei */
?>

Der Parameter true ist wichtig: Er löscht die alte Session-Datei. Ohne diesen Parameter bleibt die alte Datei unter der alten ID bestehen. Ein Angreifer, der die alte ID kennt, könnte sie dann weiterhin verwenden.

Infografik zur sicheren Sitzungsverwaltung mit den drei Schritten: Sitzung starten, Sitzungs-ID verwalten und Sitzung beenden, farblich dargestellt.

Neben der Erzeugung und Erneuerung der Session-ID spielt die Cookie-Konfiguration eine entscheidende Rolle für die Sicherheit. Die folgenden Einstellungen schützen die ID auf dem Transportweg zwischen Browser und Server.

Sicherheit: Session-Cookies richtig konfigurieren

Die Session-ID wird standardmäßig als Cookie übertragen. Die Cookie-Einstellungen bestimmen, wie gut die ID geschützt ist:

<?php

session_start([
"cookie_httponly" => true,
"cookie_secure" => true,
"cookie_samesite" => "Lax",
"use_strict_mode" => true
]);
?>

cookie_httponly verhindert den JavaScript-Zugriff auf das Cookie und schützt damit vor XSS-Angriffen. use_strict_mode weist Session-IDs ab, die PHP nicht selbst erzeugt hat. Die Details zu SameSite und weiteren Sicherheitsmaßnahmen findest du im session_start()-Tutorial.

Datenschutz: Session-IDs in Logs

Session-IDs können als personenbezogene Daten gelten, da sie einen Benutzer über mehrere Requests hinweg identifizieren. In Logdateien sollten sie daher maskiert oder zeitnah gelöscht werden. Die DSGVO verlangt, dass solche Identifikatoren nur so lange gespeichert werden, wie es für den Zweck notwendig ist. Als Faustregel gilt: Session-IDs in Logs nach spätestens 30 Tagen löschen oder vor dem Schreiben auf die ersten 8 Zeichen kürzen.

Auch in Analyse-Tools und Monitoring-Systemen tauchen Session-IDs häufig auf. Prüfe regelmäßig, ob diese Systeme die IDs anonymisieren oder automatisch rotieren. In Fehlermeldungen, die an externe Dienste wie Sentry oder Bugsnag gesendet werden, sollten Session-IDs ebenfalls herausgefiltert werden. Ein einfacher Ansatz ist, die ID vor dem Logging auf die ersten acht Zeichen zu kürzen und den Rest durch Sternchen zu ersetzen.

Verwandte Funktionen

Rund um die Session-ID gibt es weitere nützliche Funktionen.

session_name()

Liest oder setzt den Namen des Session-Cookies (Standard: PHPSESSID). Der Name muss wie session_id() vor session_start() gesetzt werden:

<?php

session_name("meine_app");
session_start();

echo session_name(); // meine_app
?>

session_create_id()

Erzeugt eine neue Session-ID ohne die aktuelle Session zu verändern. Optional akzeptiert die Funktion ein Präfix, das für Server-Routing oder Sharding genutzt werden kann:

<?php

session_start();

/* ID mit Praefix erzeugen */
$neueId = session_create_id("srv1-");
echo $neueId;
/* z.B. "srv1-abc123def456..." */

/* Praefix fuer Load-Balancer-Routing:
Der Praefix bestimmt, welcher Server
die Session verarbeitet */
?>

Mit Präfixen lässt sich steuern, auf welchem Backend-Server eine Session gespeichert wird. Der Load Balancer leitet Requests anhand des Präfixes an den richtigen Server weiter.

session_status()

Gibt den aktuellen Session-Zustand zurück: PHP_SESSION_DISABLED, PHP_SESSION_NONE oder PHP_SESSION_ACTIVE. Nützlich, um doppelte session_start()-Aufrufe zu vermeiden.

Typische Fehler

Wer viel mit Sessions arbeitet, trifft früher oder später auf klassische Stolperfallen. Oft entstehen Fehler durch die falsche Reihenfolge oder unbewusste Ausgaben im Code.

Fehler 1: "Headers already sent"

Dieser Fehler tritt auf, wenn session_id() oder session_start() nach einer HTML-Ausgabe aufgerufen wird. Auch ein unsichtbares BOM-Zeichen am Dateianfang kann die Ursache sein. Lösung: Den Session-Code an den Anfang des Scripts setzen und die Datei als UTF-8 ohne BOM speichern.

Fehler 2: session_id() nach session_start()

Wer die ID manuell setzen möchte, muss das zwingend vor session_start() tun. Ein Aufruf danach wird stillschweigend ignoriert. PHP gibt keine Warnung aus, was die Fehlersuche erschwert.

Fehler 3: Ungültige Zeichen in der ID

Leerzeichen, Punkte oder Schrägstriche in einer manuell gesetzten ID führen zu einem Fehler. Verwende nur a-z, A-Z, 0-9, Komma und Bindestrich. Im Zweifel erzeugst du eine sichere ID mit session_create_id().

Fehler 4: session_regenerate_id() ohne true

Ohne den Parameter true bleibt die alte Session-Datei auf dem Server bestehen. Ein Angreifer, der die alte ID kennt, könnte sie weiterhin nutzen. Verwende daher immer session_regenerate_id(true), um die alte Datei zu löschen.

Fehler 5: Session-ID in der URL

Manche ältere Tutorials empfehlen, die Session-ID per GET-Parameter zu übertragen. Das ist ein erhebliches Sicherheitsrisiko, weil die ID in Bookmarks, Referrer-Headern und Server-Logs landet. Stelle sicher, dass session.use_only_cookies in der php.ini auf 1 steht.

Fazit und Checkliste

Zum Schluss fassen wir die wichtigsten Aspekte für die sichere und effektive Nutzung von session_id() zusammen. Wer Sessions in PHP nutzt, sollte nicht nur die Grundlagen kennen, sondern auch mögliche Gefahrenquellen und deren Gegenmaßnahmen.

Checkliste für den sicheren Einsatz von PHP-Sessions:

  • Nach jeder kritischen Aktion (Login, Berechtigungswechsel) immer session_regenerate_id(true) aufrufen
  • Die Session-Konfiguration absichern: cookie_httponly, cookie_secure, use_strict_mode und cookie_samesite setzen
  • session.sid_length auf mindestens 48 und session.sid_bits_per_character auf 6 erhöhen
  • Session-IDs niemals in URLs übertragen, immer nur per Cookie
  • Session-IDs in Logdateien maskieren oder zeitnah löschen (DSGVO)
  • session_id() nur vor session_start() aufrufen, nie danach
  • Bei der Migration zwischen Session-Speichern die alte ID sauber übernehmen
  • Regelmäßig prüfen, ob gc_maxlifetime und cookie_lifetime zueinander passen

Verwandte Tutorials

 


Kommentare (0)

Noch keine Kommentare. Sei der Erste!

Melde dich an, um einen Kommentar zu schreiben.
Bücherregal mit drei Büchern: 'PHP 4 - Grundlagen und Profiwissen' von Hanser Verlag, 'Webdesign in a Nutshell' von O'Reilly Verlag, und 'Webgestaltung' von Galileo Computing.