<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.session.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'de',
  ),
  'this' => 
  array (
    0 => 'class.sessionhandler.php',
    1 => 'SessionHandler',
    2 => 'Die Klasse SessionHandler',
  ),
  'up' => 
  array (
    0 => 'book.session.php',
    1 => 'Sessions',
  ),
  'prev' => 
  array (
    0 => 'function.session-write-close.php',
    1 => 'session_write_close',
  ),
  'next' => 
  array (
    0 => 'sessionhandler.close.php',
    1 => 'SessionHandler::close',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    'path' => 'reference/session/sessionhandler.xml',
  ),
  'history' => 
  array (
  ),
  'extra_header_links' => 
  array (
    'rel' => 'alternate',
    'href' => '/manual/en/feeds/class.sessionhandler.atom',
    'type' => 'application/atom+xml',
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="class.sessionhandler" class="reference">

 <h1 class="title">Die Klasse SessionHandler</h1>
 

 <div class="partintro"><p class="verinfo">(PHP 5 &gt;= 5.4.0, PHP 7, PHP 8)</p>


  <div class="section" id="sessionhandler.intro">
   <h2 class="title">Einführung</h2>
   <p class="para">
    <span class="classname"><strong class="classname">SessionHandler</strong></span> ist eine spezielle Klasse, die
    verwendet werden kann, um den aktuellen internen
    PHP-Session-Speicherverwalter (PHP Session Save Handler) durch Vererbung
    zugänglich zu machen. Es gibt sieben Methoden, die die Wrapper für die
    sieben internen Callbacks des Session-Speicherverwalters sind
    (<code class="parameter">open</code>, <code class="parameter">close</code>,
    <code class="parameter">read</code>, <code class="parameter">write</code>,
    <code class="parameter">destroy</code>, <code class="parameter">gc</code> und
    <code class="parameter">create_sid</code>). Standardmäßig ist diese Klasse der
    Wrapper für den internen Speicherverwalter, der durch die
    Konfigurationsdirektive
    <a href="session.configuration.php#ini.session.save-handler" class="link">session.save_handler</a>
    definiert ist (normalerweise <code class="parameter">files</code>). Andere interne
    Session-Speicherverwalter werden von PHP-Erweiterungen wie SQLite (als
    <code class="parameter">sqlite</code>), Memcache (als
    <code class="parameter">memcache</code>), und Memcached (als
    <code class="parameter">memcached</code>) bereitgestellt.
   </p>
   <p class="para">
    Wenn eine einfache Instanz von <span class="classname"><strong class="classname">SessionHandler</strong></span>
    mittels <span class="function"><a href="function.session-set-save-handler.php" class="function">session_set_save_handler()</a></span> als Speicherverwalter
    festgelegt wird, wird sie zum Wrapper für den aktuellen Speicherverwalter.
    Eine Klasse, die von <span class="classname"><strong class="classname">SessionHandler</strong></span> abgeleitet ist,
    erlaubt es, Methoden zu überschreiben, abzufangen oder zu filtern, indem
    die Methoden der Elternklasse aufgerufen werden, die letztendlich Wrapper
    für die internen PHP-Sessionverwalter sind.
   </p>
   <p class="para">
    So können zum Beispiel die Methoden <code class="parameter">read</code> und
    <code class="parameter">write</code> abgefangen werden, um die Session-Daten zu
    verschlüsseln bzw. zu entschlüsseln und dann das Ergebnis an die
    übergeordnete Klasse zu übergeben. Alternativ könnte auch eine Methode wie
    der Garbage Collection Callback <code class="parameter">gc</code> komplett
    überschrieben werden.
   </p>
   <p class="para">
    Da der <span class="classname"><strong class="classname">SessionHandler</strong></span> ein Wrapper für die Methoden
    des aktuellen internen Speicherverwalters ist, kann das obige Beispiel der
    Verschlüsselung auf jeden internen Speicherverwalter angewendet werden,
    ohne dass die Interna des Verwalters bekannt sein müssen.
   </p>
   <p class="para">
    Um diese Klasse zu verwenden, muss zuerst der gewünschte Speicherverwalter
    mit <a href="session.configuration.php#ini.session.save-handler" class="link">session.save_handler</a>
    festgelegt werden und dann eine Instanz von
    <span class="classname"><strong class="classname">SessionHandler</strong></span> oder eine Erweiterung davon an
    <span class="function"><a href="function.session-set-save-handler.php" class="function">session_set_save_handler()</a></span> übergeben werden.
   </p>
   <p class="para">
    Es ist zu beachten, dass die Callback-Methoden dieser Klasse dazu gedacht
    sind, intern von PHP aufgerufen zu werden und nicht aus dem
    Anwenderprogramm aufgerufen werden sollen. Auch die Rückgabewerte werden
    intern von PHP verarbeitet. Weitere Informationen über den Ablauf von
    Sessions sind im Abschnitt <span class="function"><a href="function.session-set-save-handler.php" class="function">session_set_save_handler()</a></span>
    zu finden.
   </p>
  </div>


  <div class="section" id="sessionhandler.synopsis">
   <h2 class="title">Klassenbeschreibung</h2>


   <div class="classsynopsis"><div class="classsynopsisinfo">
    
     <span class="modifier">class</span> <strong class="classname"><strong class="classname">SessionHandler</strong></strong>
    

    
     <span class="modifier">implements</span>
      <a href="class.sessionhandlerinterface.php" class="interfacename">SessionHandlerInterface</a>,

     <a href="class.sessionidinterface.php" class="interfacename">SessionIdInterface</a> {</div>

    <div class="classsynopsisinfo classsynopsisinfo_comment">/* Methoden */</div>
    <div class="methodsynopsis dc-description">
   <span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.close.php" class="methodname">close</a></span>(): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>
<div class="methodsynopsis dc-description"><span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.create-sid.php" class="methodname">create_sid</a></span>(): <span class="type"><a href="language.types.string.php" class="type string">string</a></span></div>
<div class="methodsynopsis dc-description"><span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.destroy.php" class="methodname">destroy</a></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$id</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>
<div class="methodsynopsis dc-description"><span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.gc.php" class="methodname">gc</a></span>(<span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter">$max_lifetime</code></span>): <span class="type"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>
<div class="methodsynopsis dc-description"><span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.open.php" class="methodname">open</a></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$path</code></span>, <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$name</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>
<div class="methodsynopsis dc-description"><span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.read.php" class="methodname">read</a></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$id</code></span>): <span class="type"><span class="type"><a href="language.types.string.php" class="type string">string</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>
<div class="methodsynopsis dc-description"><span class="modifier">public</span> <span class="methodname"><a href="sessionhandler.write.php" class="methodname">write</a></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$id</code></span>, <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$data</code></span>): <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span></div>

   }</div>


  </div>

  <div class="section" id="session.notes">
   <h2 class="title">Anmerkungen</h2>
   <div class="warning"><strong class="warning">Warnung</strong>
    <p class="para">
     Diese Klasse wurde entwickelt, um den aktuellen internen
     PHP-Session-Speicherverwalter darzustellen. Wenn eine eigene
     Speicherungsverwaltung benötigt wird, sollte die Schnittstelle
     <span class="classname"><a href="class.sessionhandlerinterface.php" class="classname">SessionHandlerInterface</a></span> implementiert werden,
     anstatt <span class="classname"><strong class="classname">SessionHandler</strong></span> zu erweitern.
    </p>
   </div>
  </div>

  <div class="section" id="sessionhandler.examples">
   <h2 class="title">Beispiele</h2>
   <div class="example" id="example-1">
    <p><strong>Beispiel #1 
     Die Verwendung von <span class="classname"><strong class="classname">SessionHandler</strong></span>, um den internen
     PHP-Speicherverwalter mit Verschlüsselung zu versehen
    </strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /> </span><span style="color: #FF8000">/**<br />  * decrypt AES 256<br />  *<br />  * @param data $edata<br />  * @param string $password<br />  * @return decrypted data<br />  */<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">decrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">$edata</span><span style="color: #007700">, </span><span style="color: #0000BB">$password</span><span style="color: #007700">) {<br />    </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">base64_decode</span><span style="color: #007700">(</span><span style="color: #0000BB">$edata</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$salt </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">16</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$ct </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">16</span><span style="color: #007700">);<br /><br />    </span><span style="color: #0000BB">$rounds </span><span style="color: #007700">= </span><span style="color: #0000BB">3</span><span style="color: #007700">; </span><span style="color: #FF8000">// abhängig von der Schlüssellänge<br />    </span><span style="color: #0000BB">$data00 </span><span style="color: #007700">= </span><span style="color: #0000BB">$password</span><span style="color: #007700">.</span><span style="color: #0000BB">$salt</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$hash </span><span style="color: #007700">= array();<br />    </span><span style="color: #0000BB">$hash</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">] = </span><span style="color: #0000BB">hash</span><span style="color: #007700">(</span><span style="color: #DD0000">'sha256'</span><span style="color: #007700">, </span><span style="color: #0000BB">$data00</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$result </span><span style="color: #007700">= </span><span style="color: #0000BB">$hash</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">];<br />    for (</span><span style="color: #0000BB">$i </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #0000BB">$i </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">$rounds</span><span style="color: #007700">; </span><span style="color: #0000BB">$i</span><span style="color: #007700">++) {<br />        </span><span style="color: #0000BB">$hash</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">] = </span><span style="color: #0000BB">hash</span><span style="color: #007700">(</span><span style="color: #DD0000">'sha256'</span><span style="color: #007700">, </span><span style="color: #0000BB">$hash</span><span style="color: #007700">[</span><span style="color: #0000BB">$i </span><span style="color: #007700">- </span><span style="color: #0000BB">1</span><span style="color: #007700">].</span><span style="color: #0000BB">$data00</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />        </span><span style="color: #0000BB">$result </span><span style="color: #007700">.= </span><span style="color: #0000BB">$hash</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">];<br />    }<br />    </span><span style="color: #0000BB">$key </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$result</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">32</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$iv  </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$result</span><span style="color: #007700">, </span><span style="color: #0000BB">32</span><span style="color: #007700">,</span><span style="color: #0000BB">16</span><span style="color: #007700">);<br /><br />    return </span><span style="color: #0000BB">openssl_decrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">$ct</span><span style="color: #007700">, </span><span style="color: #DD0000">'AES-256-CBC'</span><span style="color: #007700">, </span><span style="color: #0000BB">$key</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">, </span><span style="color: #0000BB">$iv</span><span style="color: #007700">);<br />  }<br /><br /></span><span style="color: #FF8000">/**<br /> * crypt AES 256<br /> *<br /> * @param data $data<br /> * @param string $password<br /> * @return base64 encrypted data<br /> */<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">encrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">$password</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">// Ein kryptographisch sicheres Zufallssalz mit random_bytes() erzeugen<br />    </span><span style="color: #0000BB">$salt </span><span style="color: #007700">= </span><span style="color: #0000BB">random_bytes</span><span style="color: #007700">(</span><span style="color: #0000BB">16</span><span style="color: #007700">);<br /><br />    </span><span style="color: #0000BB">$salted </span><span style="color: #007700">= </span><span style="color: #DD0000">''</span><span style="color: #007700">;<br />    </span><span style="color: #0000BB">$dx </span><span style="color: #007700">= </span><span style="color: #DD0000">''</span><span style="color: #007700">;<br />    </span><span style="color: #FF8000">// key(32) und iv(16) mit Salz versehen = 48<br />    </span><span style="color: #007700">while (</span><span style="color: #0000BB">strlen</span><span style="color: #007700">(</span><span style="color: #0000BB">$salted</span><span style="color: #007700">) &lt; </span><span style="color: #0000BB">48</span><span style="color: #007700">) {<br />      </span><span style="color: #0000BB">$dx </span><span style="color: #007700">= </span><span style="color: #0000BB">hash</span><span style="color: #007700">(</span><span style="color: #DD0000">'sha256'</span><span style="color: #007700">, </span><span style="color: #0000BB">$dx</span><span style="color: #007700">.</span><span style="color: #0000BB">$password</span><span style="color: #007700">.</span><span style="color: #0000BB">$salt</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br />      </span><span style="color: #0000BB">$salted </span><span style="color: #007700">.= </span><span style="color: #0000BB">$dx</span><span style="color: #007700">;<br />    }<br /><br />    </span><span style="color: #0000BB">$key </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$salted</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">32</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$iv  </span><span style="color: #007700">= </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$salted</span><span style="color: #007700">, </span><span style="color: #0000BB">32</span><span style="color: #007700">,</span><span style="color: #0000BB">16</span><span style="color: #007700">);<br /><br />    </span><span style="color: #0000BB">$encrypted_data </span><span style="color: #007700">= </span><span style="color: #0000BB">openssl_encrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #DD0000">'AES-256-CBC'</span><span style="color: #007700">, </span><span style="color: #0000BB">$key</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">, </span><span style="color: #0000BB">$iv</span><span style="color: #007700">);<br />    return </span><span style="color: #0000BB">base64_encode</span><span style="color: #007700">(</span><span style="color: #0000BB">$salt </span><span style="color: #007700">. </span><span style="color: #0000BB">$encrypted_data</span><span style="color: #007700">);<br />}<br /><br />class </span><span style="color: #0000BB">EncryptedSessionHandler </span><span style="color: #007700">extends </span><span style="color: #0000BB">SessionHandler<br /></span><span style="color: #007700">{<br />    private </span><span style="color: #0000BB">$key</span><span style="color: #007700">;<br /><br />    public function </span><span style="color: #0000BB">__construct</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">key </span><span style="color: #007700">= </span><span style="color: #0000BB">$key</span><span style="color: #007700">;<br />    }<br /><br />    public function </span><span style="color: #0000BB">read</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">read</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">);<br /><br />        if (!</span><span style="color: #0000BB">$data</span><span style="color: #007700">) {<br />            return </span><span style="color: #DD0000">""</span><span style="color: #007700">;<br />        } else {<br />            return </span><span style="color: #0000BB">decrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">key</span><span style="color: #007700">);<br />        }<br />    }<br /><br />    public function </span><span style="color: #0000BB">write</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">)<br />    {<br />        </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">encrypt</span><span style="color: #007700">(</span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">key</span><span style="color: #007700">);<br /><br />        return </span><span style="color: #0000BB">parent</span><span style="color: #007700">::</span><span style="color: #0000BB">write</span><span style="color: #007700">(</span><span style="color: #0000BB">$id</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">);<br />    }<br />}<br /><br /></span><span style="color: #FF8000">// Wir verwenden den nativen 'files'-Handler, aber es funktioniert auch<br />// mit anderen internen nativen Handlern wie 'sqlite', 'memcache' oder<br />// 'memcached', die von PHP-Erweiterungen bereitgestellt werden.<br /></span><span style="color: #0000BB">ini_set</span><span style="color: #007700">(</span><span style="color: #DD0000">'session.save_handler'</span><span style="color: #007700">, </span><span style="color: #DD0000">'files'</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">$key </span><span style="color: #007700">= </span><span style="color: #DD0000">'secret_string'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$handler </span><span style="color: #007700">= new </span><span style="color: #0000BB">EncryptedSessionHandler</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">session_set_save_handler</span><span style="color: #007700">(</span><span style="color: #0000BB">$handler</span><span style="color: #007700">, </span><span style="color: #0000BB">true</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">session_start</span><span style="color: #007700">();<br /><br /></span><span style="color: #FF8000">// Fortfahren mit dem Setzen und Abrufen von Werten anhand der<br />// Schlüssel von $_SESSION</span></span></code></div>
    </div>

   </div>
   <blockquote class="note"><p><strong class="note">Hinweis</strong>: 
    <p class="para">
     Da die Methoden dieser Klasse so konzipiert sind, dass sie als Teil des
     normalen Ablaufs einer Session intern von PHP aufgerufen werden, geben
     Aufrufe der Kindklasse an die Elternmethoden (d. h. die eigentlichen
     internen nativen Prozeduren) <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> zurück, es sei denn, die Session
     wurde tatsächlich gestartet (entweder automatisch oder durch den
     expliziten Aufruf von <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span>). Es ist
     wichtig, dies beim Schreiben von Unit-Tests zu beachten, bei denen die
     Methoden der Klasse manuell aufgerufen werden können.
    </p>
   </p></blockquote>
  </div>

 </div>

 

















































<h2>Inhaltsverzeichnis</h2><ul class="chunklist chunklist_reference"><li><a href="sessionhandler.close.php">SessionHandler::close</a> — Schlie&szlig;t eine Session</li><li><a href="sessionhandler.create-sid.php">SessionHandler::create_sid</a> — Liefert eine neue Session-ID</li><li><a href="sessionhandler.destroy.php">SessionHandler::destroy</a> — L&ouml;scht eine Session</li><li><a href="sessionhandler.gc.php">SessionHandler::gc</a> — L&ouml;scht alte Sessions</li><li><a href="sessionhandler.open.php">SessionHandler::open</a> — Initialisiert eine Session</li><li><a href="sessionhandler.read.php">SessionHandler::read</a> — Ruft die Session-Daten ab</li><li><a href="sessionhandler.write.php">SessionHandler::write</a> — Speichert die Session-Daten</li></ul>
</div>
<?php manual_footer($setup); ?>