<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'class.sessionhandler.php',
    1 => 'SessionHandler',
    2 => 'La classe 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' => 'fr',
    '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">La classe 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">Introduction</h2>
   <p class="para">
    La classe <span class="classname"><strong class="classname">SessionHandler</strong></span> est une classe spéciale
    qui peut être utilisée pour exposer le gestionnaire de sauvegarde
    de session courant en interne de PHP, par héritage. Il y a sept méthodes
    qui représentent les sept fonctions de rappel du gestionnaire de sauvegarde
    de session interne (<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> et
    <code class="parameter">create_sid</code>). Par défaut, cette classe va représenter ce qui
    est défini dans le gestionnaire de sauvegarde interne, tel que défini par la directive
    de configuration <a href="session.configuration.php#ini.session.save-handler" class="link">session.save_handler</a>,
    qui vaut habituellement <code class="parameter">files</code> par défaut. D&#039;autres
    gestionnaires de sauvegarde de session interne sont fournis par des
    extensions PHP, comme SQLite (avec le paramètre <code class="parameter">sqlite</code>),
    Memcache (avec le paramètre <code class="parameter">memcache</code>), et Memcached (avec
    le paramètre <code class="parameter">memcached</code>).
   </p>
   <p class="para">
    Lorsqu&#039;une instance complète de <span class="classname"><strong class="classname">SessionHandler</strong></span> est définie comme
    gestionnaire de sauvegarde en utilisant <span class="function"><a href="function.session-set-save-handler.php" class="function">session_set_save_handler()</a></span>, elle
    remplacera le gestionnaire de sauvegarde courant. Une classe étendue depuis la classe
    <span class="classname"><strong class="classname">SessionHandler</strong></span> permet d&#039;écraser les méthodes, des intercepter,
    ou des filtrer en appelant la méthode de la classe parent qui remplace en dernier lieu
    le gestionnaire de session interne de PHP.
   </p>
   <p class="para">
    Ceci permet, par exemple, d&#039;intercepter les méthodes <code class="parameter">read</code> et
    <code class="parameter">write</code> pour chiffrer/déchiffrer les données de session, et de passer
    le résultat à la classe parente. Alternativement, il est possible d&#039;aussi choisir d&#039;écraser
    totalement une méthode comme la fonction de rappel de collection des gabarits
    <code class="parameter">gc</code>.
   </p>
   <p class="para">
    En raison du fait que la classe <span class="classname"><strong class="classname">SessionHandler</strong></span> se comporte comme les
    méthodes du gestionnaire courant de sauvegarde de sessions interne, l&#039;exemple ci-dessus de chiffrement
    peut être appliqué à n&#039;importe quel gestionnaire de sauvegarde sans avoir besoin de connaître
    les gestionnaires internes.
   </p>
   <p class="para">
    Pour utiliser cette classe, il faut commencer par définir un gestionnaire de sauvegarde
    que l&#039;on souhaite exposer en utilisant <a href="session.configuration.php#ini.session.save-handler" class="link">session.save_handler</a>
    puis, passer une instance de la classe <span class="classname"><strong class="classname">SessionHandler</strong></span> ou une étendue à la
    fonction <span class="function"><a href="function.session-set-save-handler.php" class="function">session_set_save_handler()</a></span>.
   </p>
   <p class="para">
    Veuillez noter que les méthodes de rappel de cette classe sont destinées à être appelées
    en interne par PHP, et ne sont pas prévues pour être appelées depuis le code de l&#039;espace
    utilisateur. Les valeurs retournées seront utilisées de la même façon en interne par PHP.
    Pour plus d&#039;informations sur le mécanisme des sessions, se référer à la documentation
    sur la fonction <span class="function"><a href="function.session-set-save-handler.php" class="function">session_set_save_handler()</a></span>.
   </p>
  </div>


  <div class="section" id="sessionhandler.synopsis">
   <h2 class="title">Synopsis de la classe</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">/* Méthodes */</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">Notes</h2>
   <div class="warning"><strong class="warning">Avertissement</strong>
    <p class="para">
     Cette classe a pour but d&#039;exposer le gestionnaire de sauvegarde de session interne de PHP ; si l&#039;on
     souhaite écrire le gestionnaire de sauvegarde personnalisé, il faut
     implémenter l&#039;interface <span class="classname"><a href="class.sessionhandlerinterface.php" class="classname">SessionHandlerInterface</a></span> au lieu d&#039;étendre
     la classe <span class="classname"><strong class="classname">SessionHandler</strong></span>.
    </p>
   </div>
  </div>

  <div class="section" id="sessionhandler.examples">
   <h2 class="title">Exemples</h2>
   <div class="example" id="example-1">
    <p><strong>Exemple #1 
     Utilisation de la classe <span class="classname"><strong class="classname">SessionHandler</strong></span>
     pour ajouter un chiffrement aux gestionnaires de sauvegarde interne de PHP.
    </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 />  * Déchiffrement 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">// depends on key length<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 /> * Chiffrement 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">// Générer un sel aléatoire cryptographiquement sécurisé en utilisant random_bytes()<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">// Salt the key(32) and iv(16) = 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">// Nous interceptons le gestionnaire 'files' natif, mais ceci<br />// fonctionnera de la même façon avec les autres gestionnaires internes<br />// comme 'sqlite', 'memcache' ou 'memcached'<br />// qui sont fournis via des extensions PHP.<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">// processus pour définir et récupérer des valeurs avec la clé, depuis $_SESSION</span></span></code></div>
    </div>

   </div>
   <blockquote class="note"><p><strong class="note">Note</strong>: 
    <p class="para">
     Vu que les méthodes de cette classe sont prévues pour être appelées en interne par PHP
     car faisant partie du mécanisme normal des sessions, les classes enfants appellent les méthodes
     parents (c.-à-d. le gestionnaire natif interne actuellement) et doivent retourner <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> tant que
     la session n&#039;a pas encore démarrée (soit automatiquement, ou explicitement via la fonction
     <span class="function"><a href="function.session-start.php" class="function">session_start()</a></span>). Ceci est très important à considérer lors de
     l&#039;écriture des tests unitaires où les méthodes de la classe peuvent être invoquées
     manuellement.
    </p>
   </p></blockquote>
  </div>

 </div>

 










































<h2>Sommaire</h2><ul class="chunklist chunklist_reference"><li><a href="sessionhandler.close.php">SessionHandler::close</a> — Ferme la session</li><li><a href="sessionhandler.create-sid.php">SessionHandler::create_sid</a> — Retourne un nouvel ID de session</li><li><a href="sessionhandler.destroy.php">SessionHandler::destroy</a> — D&eacute;truit une session</li><li><a href="sessionhandler.gc.php">SessionHandler::gc</a> — Nettoie les anciennes sessions</li><li><a href="sessionhandler.open.php">SessionHandler::open</a> — Initialise une session</li><li><a href="sessionhandler.read.php">SessionHandler::read</a> — Lit les donn&eacute;es de session</li><li><a href="sessionhandler.write.php">SessionHandler::write</a> — &Eacute;crit des donn&eacute;es dans la session</li></ul>
</div>
<?php manual_footer($setup); ?>