<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/session.security.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'features.session.security.management.php',
    1 => 'Grundlagen der Session-Verwaltung',
    2 => 'Grundlagen der Session-Verwaltung',
  ),
  'up' => 
  array (
    0 => 'session.security.php',
    1 => 'Sessions und Sicherheit',
  ),
  'prev' => 
  array (
    0 => 'session.security.php',
    1 => 'Sessions und Sicherheit',
  ),
  'next' => 
  array (
    0 => 'session.security.ini.php',
    1 => 'INI-Einstellungen f&uuml;r die Sicherheit von Sessions',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'reference/session/security.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="features.session.security.management" class="sect1">
  <h2 class="title">Grundlagen der Session-Verwaltung</h2>

  <div class="sect2" id="features.session.security.management.basic">
   <h3 class="title">Session-Sicherheit</h3>

   <p class="para">
    Das Session-Modul kann nicht garantieren, dass die in einer Session
    gespeicherten Informationen nur von dem Benutzer eingesehen werden können,
    der die Session erstellt hat. Es sind zusätzliche Maßnahmen erforderlich,
    um die Vertraulichkeit der Session zu schützen, je nach dem, welcher Wert
    mit ihr verbunden ist.
   </p>

   <p class="para">
    Die Wichtigkeit der Daten, die in der Session enthalten sind, muss
    bewertet werden und weitere Schutzmaßnahmen können erforderlich sein; dies
    hat in der Regel einen Preis, z. B. einen geringeren Komfort für den
    Benutzer. Um den Benutzer zum Beispiel vor einer einfachen Taktik des
    Social Engineering (Sozialmanipulation, Ausnutzung menschlicher Schwächen)
    zu schützen, muss
    <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>
    aktiviert werden. In diesem Fall müssen auf der Client-Seite unbedingt
    Cookies erlaubt sein, sonst funktionieren die Sessions nicht.
   </p>

   <p class="para">
    Es gibt mehrere Wege, eine bestehende Session-ID an Dritte durchsickern zu
    lassen, z. B. JavaScript-Injections, Session-IDs in URLs, Packet Sniffing,
    physischer Zugriff auf das Gerät etc. Eine durchgesickerte Session-ID
    ermöglicht Dritten, auf alle Ressourcen zuzugreifen, die mit einer
    bestimmten ID verbunden sind. Erstens: URLs, die die Session-IDs
    enthalten. Wenn es Links zu einer externen Seite oder Ressource gibt, kann
    die URL einschließlich der Session-ID in den Referrer-Protokollen der
    externen Seite gespeichert werden. Zweitens: Ein aktiverer Angreifer
    könnte den Netzwerkverkehr abhören. Wenn dieser unverschlüsselt ist,
    fließen die Session-IDs im Klartext über das Netzwerk. Die Lösung ist,
    SSL/TLS auf dem Server zu implementieren und für die Benutzer
    obligatorisch zu machen. Für eine verbesserte Sicherheit sollte HSTS
    verwendet werden.
   </p>

   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     Auch HTTPS kann vertrauliche Daten nicht immer schützen. Zum Beispiel
     können die Sicherheitslücken CRIME und Beast einem Angreifer ermöglichen,
     die Daten zu lesen. Zu beachten ist auch, dass viele Netzwerke
     HTTPS-MITM-Proxys zu Prüfzwecken einsetzen. Angreifer können ebenfalls
     einen solchen Proxy einrichten.
    </span>
   </p></blockquote>

  </div>

  <div class="sect2" id="features.session.security.management.non-adaptive-session">
   <h3 class="title">Nicht-adaptive Session-Verwaltung</h3>

   <p class="para">
    Der Session-Verwalter von PHP ist derzeit standardmäßig adaptiv. Ein
    adaptiver Session-Verwalter birgt zusätzliche Risiken.
   </p>

   <p class="para">
    Wenn
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    aktiviert ist und die Session-Speicherroutine dies unterstützt, wird eine
    uninitialisierte Session-ID verworfen und eine neue erstellt. Dies
    verhindert einen Angriff, der Benutzer dazu zwingt, eine bereits bekannte
    Session-ID zu verwenden. Ein Angreifer könnte Links einfügen oder E-Mails
    senden, die die Session-ID enthalten, z. B.
    <code class="literal">http://example.com/page.php?PHPSESSID=123456789</code>. Wenn
    <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a>
    aktiviert ist, startet das Opfer damit eine Session mit der vom Angreifer
    angegebenen Session-ID.
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    entschärft dieses Risiko.
   </p>

   <div class="warning"><strong class="warning">Warnung</strong>
    <p class="simpara">
     Benutzerdefinierte Speicherroutinen können den strikten Session-Modus
     ebenfalls unterstützen, indem sie eine Validierung der Session-ID
     implementieren. Alle benutzerdefinierten Speicherroutinen sollten eine
     Validierung der Session-ID implementieren.
    </p>
   </div>

   <p class="para">
    Das Cookie für die Session-ID kann mit den Attributen domain, path,
    httponly, secure und ab PHP 7.3 mit dem Attribut SameSite gesetzt werden.
    
    Es gibt eine von den Browsern definierte Vorrangigkeit. Durch das
    Ausnutzen der Rangfolge kann ein Angreifer eine Session-ID setzen, die
    dauerhaft verwendet werden kann. Die Verwendung von
    <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>
    wird dieses Problem nicht lösen.
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    entschärft dieses Risiko. Mit
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>=On
    wird die nicht initialisierte Session-ID abgelehnt.
   </p>

   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     Auch wenn
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
     das Risiko der adaptiven Session-Verwaltung abschwächt, kann ein Angreifer
     die Benutzer dazu bringen, eine initialisierte Session-ID zu verwenden,
     die von ihm erstellt wurde, z. B. durch eine JavaScript-Injection. Dieser
     Angriff kann durch die Empfehlungen dieses Handbuchs entschärft werden.
    </span>

    <span class="simpara">
     Wenn Entwickler dieses Handbuch befolgen, sollten sie
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
     aktivieren, die zeitstempelbasierte Session-Verwaltung verwenden und die
     Session-IDs mittels <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> mit den
     empfohlenen Verfahren neu erzeugen. Folgen Entwickler allen oben
     genannten Punkten, wird eine von einem Angreifer generierte Session-ID
     letztlich gelöscht werden.
    </span>

    <span class="simpara">
     Wenn ein Zugriff auf eine veraltete Session erfolgt, sollten Entwickler
     alle aktiven Session-Daten des Benutzers speichern, da diese
     Informationen für eine anschließende Untersuchung relevant sind. Der
     Benutzer sollte zwangsweise von allen Sessions abgemeldet werden, d. h.
     er muss sich neu authentifizieren. Dies verhindert, dass Angreifer
     gestohlene Sessions missbrauchen können.
    </span>
   </p></blockquote>

   <div class="warning"><strong class="warning">Warnung</strong>
    <p class="simpara">
     Der Zugriff auf eine veraltete Session deutet nicht unbedingt auf einen
     Angriff hin. Ein instabiles Netzwerk und/oder die sofortige Löschung der
     aktiven Session kann dazu führen, dass legitime Benutzer veraltete
     Sessions verwenden.
    </p>
   </div>

   <p class="para">
    Ab PHP 7.1.0 wurde <span class="function"><a href="function.session-create-id.php" class="function">session_create_id()</a></span> hinzugefügt.
    Diese Funktion kann verwendet werden, um effizient auf alle aktiven
    Sessions eines Benutzers zuzugreifen, indem den Session-IDs die
    Benutzer-ID vorangestellt wird. Die Aktivierung von
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    ist bei dieser Einrichtung unbedingt erforderlich. Andernfalls können
    böswillige Benutzer schädliche Session-IDs für andere Benutzer setzen.
   </p>

   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     Vor PHP 7.1.0 <em>sollten</em> Benutzer einen CSPRNG
     (kryptographisch sicheren Zufallszahlengenerator) verwenden, um eine neue
     Session-ID zu erzeugen, z. B. /dev/urandom oder
     <span class="function"><a href="function.random-bytes.php" class="function">random_bytes()</a></span> und Hash-Funktionen.
     <span class="function"><a href="function.session-create-id.php" class="function">session_create_id()</a></span> hat eine Kollisionserkennung und
     erzeugt eine Session-ID gemäß den INI-Einstellungen für Sessions. Die
     Verwendung von <span class="function"><a href="function.session-create-id.php" class="function">session_create_id()</a></span> ist vorzuziehen.
    </span>
   </p></blockquote>

  </div>

  <div class="sect2" id="features.session.security.management.session-id-regeneration">
   <h3 class="title">Erneuern von Session-IDs</h3>

   <p class="para">
    Die Anweisung
    <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
    ist ein guter erster Schritt, reicht aber nicht aus. Für die Sicherheit
    von Sessions sollten Entwickler auch die Funktion
    <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> verwenden.
   </p>

   <p class="para">
    Das Erneuern einer Session-ID reduziert das Risiko von gestohlenen
    Session-IDs, daher sollte die Funktion
    <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> regelmäßig aufgerufen werden;
    z. B. sollte die Session-ID für sicherheitsrelevante Inhalte alle 15
    Minuten neu generiert werden. Selbst für den Fall, dass eine Session-ID
    gestohlen wird, läuft die Session sowohl beim legitimen Benutzer als auch
    beim Angreifer ab. Mit anderen Worten: Der Zugriff auf den Inhalt,
    entweder durch den Benutzer oder den Angreifer, erzeugt beim Zugriff auf
    eine veraltete Session einen Fehler.
   </p>

   <p class="para">
    Session-IDs <em>müssen</em> neu generiert werden, wenn die
    Berechtigungen des Benutzers erhöht werden, z. B. nach einer
    Authentifizierung. Die Funktion <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span>
    muss aufgerufen werden, bevor die Authentifizierungsinformationen in
    <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var> gespeichert werden
    (<span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> speichert die aktuellen
    Session-Daten automatisch, um Zeitstempel etc. in der aktuellen Session zu
    speichern). Stellen Sie sicher, dass nur die neue Session das
    Authentifizierungsflag enthält.
   </p>

   <p class="para">
    Entwickler <em>dürfen sich nicht</em> auf den Ablauf der
    Session-ID durch
    <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a>
    verlassen. Angreifer können in regelmäßigen Abständen auf die Session-ID
    eines Opfers zugreifen, um deren Ablauf zu verhindern und sie weiter
    auszunutzen, unter anderem auch bei einer authentifizierten Session.
   </p>

   <p class="para">
    Stattdessen müssen Entwickler eine zeitstempelbasierte
    Session-Datenverwaltung implementieren.
   </p>

   <div class="warning"><strong class="warning">Warnung</strong>
    <p class="simpara">
     Obwohl der Session-Verwalter Zeitstempel transparent verwalten kann, ist
     diese Funktion nicht implementiert. Alte Session-Daten müssen bis zur GC
     aufbewahrt werden. Gleichzeitig müssen die Entwickler sicherstellen, dass
     veraltete Session-Daten entfernt werden. Allerdings dürfen Entwickler
     aktive Session-Daten nicht sofort entfernen, d. h.
     <code class="code">session_regenerate_id(true);</code> und
     <span class="function"><a href="function.session-destroy.php" class="function">session_destroy()</a></span> dürfen niemals zusammen für eine
     aktive Session aufgerufen werden. Dies mag widersprüchlich klingen, ist
     aber eine zwingende Voraussetzung.
    </p>
   </div>

   <p class="para">
    <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> löscht veraltete Sessions
    standardmäßig <em>nicht</em>. Veraltete authentifizierte
    Sessions können zur weiteren Verwendung vorhanden sein. Entwickler müssen
    daher sicherstellen, dass veraltete Sessions von niemandem genutzt werden
    können. Sie müssen den Zugriff auf veraltete Session-Daten selbst mit
    Zeitstempeln verhindern.
   </p>

   <div class="warning"><strong class="warning">Warnung</strong>
    <p class="simpara">
     Das plötzliche Entfernen einer aktiven Session erzeugt unerwünschte
     Nebeneffekte. Sessions können verschwinden, wenn es gleichzeitige
     Verbindungen zur Webanwendung gibt und/oder das Netzwerk instabil ist.
    </p>
    <p class="simpara">
     Potenziell böswillige Zugriffe sind durch das plötzliche Entfernen
     aktiver Sessions nicht zu erkennen.
    </p>
    <p class="simpara">
     Anstatt veraltete Sessions sofort zu löschen, müssen Entwickler eine
     kurzfristige Verfallszeit (Zeitstempel) in <var class="varname"><a href="reserved.variables.session.php" class="classname">$_SESSION</a></var>
     setzen, die den Zugriff auf die Session-Daten verhindert.
    </p>
    <p class="simpara">
     Entwickler dürfen den Zugriff auf alte Session-Daten nicht sofort nach
     <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> verbieten. Das muss zu einem
     späteren Zeitpunkt erfolgen, d. h. ein paar Sekunden später bei stabilen
     Netzwerken, z. B. einem kabelgebundenen Netzwerk, und ein paar Minuten
     später bei instabilen Netzwerken, z. B. einem Mobiltelefon oder Wi-Fi.
    </p>
    <p class="simpara">
     Wenn ein Benutzer auf eine veraltete (abgelaufene) Session zugreift,
     sollte der Zugriff auf diese verweigert werden. Es wird auch empfohlen,
     den Status &quot;authentifiziert&quot; aus allen Sessions des Benutzers zu
     entfernen, da es sich wahrscheinlich um einen Angriff handelt.
    </p>
   </div>

   <p class="para">
    Die korrekte Verwendung von
    <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>
    und <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> kann einen persönlichen DoS
    mit nicht löschbaren Cookies verursachen, die von Angreifern gesetzt
    wurden. In diesem Fall können die Entwickler die Benutzer auffordern, die
    Cookies zu entfernen und sie darauf hinweisen, dass sie von einem
    Sicherheitsproblem betroffen sein könnten. Angreifer können bösartige
    Cookies über eine anfällige Webanwendung setzen, über ein
    ungeschütztes/schädliches Browser-Plugin, über ein physisch
    kompromittiertes Gerät usw.
   </p>

   <div class="warning"><strong class="warning">Warnung</strong>
    <p class="simpara">
     Unterschätzen Sie das DoS-Risiko nicht.
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>=On
     ist für die allgemeine Sicherheit der Session-ID zwingend erforderlich!
     Allen Webseiten wird empfohlen
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
     zu aktivieren.
    </p>
    <p class="simpara">
     Ein DoS kann nur auftreten, wenn das Konto angegriffen wird. Eine durch
     JavaScript verursachte Sicherheitslücke in einer Anwendung ist die
     häufigste Ursache.
    </p>
   </div>

  </div>

  <div class="sect2" id="features.session.security.management.session-data-deletion">
   <h3 class="title">Löschen der Session-Daten</h3>

   <p class="para">
    Veraltete Session-Daten müssen unzugänglich gemacht und gelöscht werden.
    Das aktuelle Session-Modul kann dies nicht gut handhaben.
   </p>

   <p class="para">
    Veraltete Session-Daten sollten so schnell wie möglich entfernt werden.
    Aktive Sessions dürfen jedoch nicht sofort entfernt werden. Um diese
    Anforderungen zu erfüllen, müssen die Entwickler eine auf Zeitstempel
    basierende Session-Datenverwaltung selbst implementieren.
   </p>

   <p class="para">
    Setzen und verwalten Sie den Ablaufzeitstempel in $_SESSION. Verbieten Sie
    den Zugriff auf veraltete Session-Daten. Wenn der Zugriff auf veraltete
    Session-Daten festgestellt wird, ist es ratsam, den kompletten
    Authentifizierungsstatus aus den Sessions des Benutzers zu entfernen und
    ihn zu zwingen, sich erneut zu authentifizieren. Der Zugriff auf veraltete
    Session-Daten kann einen Angriff darstellen. Um dies zu verhindern, müssen
    die Entwickler alle aktiven Sessions jedes Benutzers verfolgen.
   </p>

   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     Der Zugriff auf eine veraltete Session kann auch aufgrund eines
     instabilen Netzwerks und/oder konkurrierende Zugriffe auf die Website
     erfolgen. Der Server hat z. B. versucht, eine neue Session-ID über ein
     Cookie zu setzen, aber das betreffende Set-Cookie-Paket hat den Client
     möglicherweise aufgrund eines Verbindungsverlusts nicht erreicht. Eine
     Verbindung kann eine neue Session-ID per
     <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> ausgeben, aber eine andere
     gleichzeitige Verbindung hat die neue Session-ID möglicherweise noch
     nicht erhalten. Daher müssen die Entwickler den Zugriff auf die veraltete
     Session zu einem späteren Zeitpunkt verhindern. Das heißt, eine
     zeitstempelbasierte Session-Verwaltung zwingend ist erforderlich.
    </span>
   </p></blockquote>

   <p class="para">
    Zusammenfassend lässt sich sagen, dass Session-Daten weder mit
    <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> noch mit
    <span class="function"><a href="function.session-destroy.php" class="function">session_destroy()</a></span> zerstört werden dürfen, sondern es
    müssen Zeitstempel verwendet werden, um den Zugriff auf die Session-Daten
    zu kontrollieren. Lassen Sie <span class="function"><a href="function.session-gc.php" class="function">session_gc()</a></span> veraltete
    Daten aus dem Session-Datenspeicher entfernen.
   </p>

  </div>

  <div class="sect2" id="features.session.security.management.session-locking">
   <h3 class="title">Session und Sperren</h3>

   <p class="para">
    Session-Daten sind standardmäßig gesperrt, um Race Conditions zu
    vermeiden. Das Sperren ist zwingend erforderlich, um Session-Daten über
    Anfragen hinweg konsistent zu halten.
   </p>

   <p class="para">
    Die Session-Sperrung kann jedoch von Angreifern missbraucht werden, um
    DoS-Angriffe durchzuführen. Halten Sie Sperren möglichst gering, um das
    Risiko eines DoS-Angriffs durch die Session-Sperrung zu minimieren.
    Verwenden Sie schreibgeschützte Sessions, wenn die Session-Daten nicht
    aktualisiert werden müssen. Verwenden Sie bei der Funktion
    <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span> die Option &quot;read_and_close&quot;:
    <code class="literal">session_start([&#039;read_and_close&#039;=&gt;1]);</code>. Schließen Sie
    die Session, nachdem Sie $_SESSION aktualisiert haben, so schnell wie
    möglich mit <span class="function"><a href="function.session-commit.php" class="function">session_commit()</a></span>.
   </p>

   <p class="para">
    Das aktuelle Session-Modul erkennt <em>keinerlei</em>
    Änderungen an $_SESSION, wenn die Session inaktiv ist. Es liegt in der
    Verantwortung des Entwicklers, $_SESSION nicht zu verändern, während die
    Session inaktiv ist.
   </p>

  </div>

  <div class="sect2" id="features.session.security.management.active-sessions">
   <h3 class="title">Aktive Sessions</h3>

   <p class="para">
    Die Entwickler sollten alle aktiven Sessions für jeden Benutzer im Auge
    behalten und sie darüber informieren, wie viele Sessions aktiv sind, von
    welcher IP-Adresse, wie lange usw. PHP speichert diese Informationen
    nicht. Die Entwickler sollen dies selbst tun.
   </p>

   <p class="para">
    Es gibt mehrere Möglichkeiten, dies zu implementieren. Eine Möglichkeit
    besteht darin, eine Datenbank zu definieren, die die erforderlichen Daten
    verwaltet, und alle relevanten Informationen darin zu speichern. Da die
    Session-Daten mit einer GC verbunden sind, müssen die Entwickler auf die
    GC-Daten achten, um die Datenbank der aktiven Sessions konsistent zu
    halten.
   </p>

   <p class="para">
    Eine einfache Implementierung besteht darin, die Benutzer-ID als Präfix
    vor die Session-ID zu setzen und die notwendigen Informationen in der
    Variablen $_SESSION zu speichern. Die meisten Datenbanken sind relativ gut
    darin, ein Präfix als Zeichenkette auszuwählen. Entwickler KÖNNEN hierfür
    sowohl die Funktion <span class="function"><a href="function.session-regenerate-id.php" class="function">session_regenerate_id()</a></span> als auch
    die Funktion <span class="function"><a href="function.session-create-id.php" class="function">session_create_id()</a></span> verwenden.
   </p>

   <div class="warning"><strong class="warning">Warnung</strong>
    <p class="simpara">
     Verwenden Sie niemals vertrauliche Daten als Präfix. Wenn die Benutzer-ID
     geheim ist, erwägen Sie die Verwendung von
     <span class="function"><a href="function.hash-hmac.php" class="function">hash_hmac()</a></span>.
    </p>
   </div>

   <div class="warning"><strong class="warning">Warnung</strong>
    <p class="simpara">
     Das Aktivieren von
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
     ist für diese Konfiguration zwingend erforderlich. Stellen Sie sicher,
     dass es aktiviert ist. Andernfalls kann die aktive Session-Datenbank
     kompromittiert werden.
    </p>
   </div>

   <p class="para">
    Die zeitstempelbasierte Session-Verwaltung ist zwingend erforderlich, um
    den Zugriff auf veraltete Sessions zu erkennen. Wenn der Zugriff auf eine
    veraltete Session erkannt wird, sollten die Authentifizierungsflags aus
    allen aktiven Sessions des Benutzers entfernt werden. Dies verhindert,
    dass Angreifer weiterhin gestohlene Sessions ausnutzen können.
   </p>

  </div>

  <div class="sect2" id="features.session.security.management.session-and-autologin">
   <h3 class="title">Session und automatische Anmeldung</h3>

   <p class="para">
    Entwickler dürfen keine langlebigen Session-IDs für automatische
    Anmeldungen verwenden, da dies das Risiko von gestohlenen Sessions erhöht.
    Die Funktionalität für eine automatische Anmeldung sollte vom Entwickler
    implementiert werden.
   </p>

   <p class="para">
    Verwenden Sie mithilfe der Funktion <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span> einen
    sicheren, einmaligen Hash-Schlüssel als Schlüssel für die automatische
    Anmeldung. Verwenden Sie einen sicheren Hash, der stärker ist als SHA-2,
    z. B. SHA-256 oder höher, mit Zufallsdaten aus
    <span class="function"><a href="function.random-bytes.php" class="function">random_bytes()</a></span> oder <var class="filename">/dev/urandom</var>.
   </p>

   <p class="para">
    Wenn der Benutzer nicht authentifiziert ist, prüfen Sie, ob der einmalige
    Schlüssel für die automatische Anmeldung gültig ist oder nicht. Falls er
    gültig ist, authentifizieren Sie den Benutzer und setzen Sie einen neuen
    sicheren Einmal-Hash-Schlüssel. Ein Schlüssel für eine automatische
    Anmeldung darf nur einmal verwendet werden, d. h. verwenden Sie einen
    solchen Schlüssel niemals mehrfach, sondern erzeugen Sie immer einen
    neuen.
   </p>

   <p class="para">
    Ein Schlüssel für eine automatische Anmeldung ist ein
    Authentifizierungsschlüssel mit langer Lebensdauer, er sollte so gut wie
    möglich geschützt werden. Verwenden Sie die Cookie-Attribute
    path/httponly/secure/SameSite, um ihn zu schützen, d. h. übertragen Sie
    den Schlüssel für die automatische Anmeldung nie, wenn es nicht
    erforderlich ist.
   </p>

   <p class="para">
    Der Entwickler muss die Funktionalität implementieren, die die
    automatische Anmeldung deaktivieren und das nicht benötigte Cookie für die
    automatische Anmeldung entfernen.
   </p>

  </div>

  <div class="sect2" id="features.session.security.management.csrf">
   <h3 class="title">CSRF-Angriffe (Cross-Site Request Forgeries)</h3>

   <p class="para">
    Sessions und Authentifizierung schützen nicht vor CSRF-Angriffen.
    Entwickler müssen den CSRF-Schutz selbst implementieren.
   </p>

   <p class="para">
    <span class="function"><a href="function.output-add-rewrite-var.php" class="function">output_add_rewrite_var()</a></span> kann für den CSRF-Schutz
    verwendet werden. Weitere Details sind auf der entsprechenden
    Handbuchseite zu finden.
   </p>

   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <span class="simpara">
     PHP verwendet vor Version 7.2.0 denselben Ausgabepuffer und dieselbe
     INI-Einstellung wie trans-sid. Daher ist die Verwendung von
     <span class="function"><a href="function.output-add-rewrite-var.php" class="function">output_add_rewrite_var()</a></span> in PHP vor Version 7.2.0
     nicht empfohlen.
    </span>
   </p></blockquote>

   <p class="para">
    Die meisten Webanwendungs-Frameworks unterstützen einen Schutz gegen CSRF.
    Weitere Details sind im Handbuch des Webanwendungs-Frameworks zu finden.
   </p>

   <p class="para">
    Ab PHP 7.3 kann das SameSite-Attribut für das Session-Cookie gesetzt
    werden. Dies ist eine zusätzliche Maßnahme, die CSRF-Schwachstellen
    entschärfen kann.
   </p>
  </div>
 </div><?php manual_footer($setup); ?>