<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'session.security.ini.php',
    1 => 'S&eacute;curisation des configurations INI de session',
    2 => 'S&eacute;curisation des configurations INI de session',
  ),
  'up' => 
  array (
    0 => 'session.security.php',
    1 => 'Sessions et S&eacute;curit&eacute;',
  ),
  'prev' => 
  array (
    0 => 'features.session.security.management.php',
    1 => 'Gestion basique des sessions',
  ),
  'next' => 
  array (
    0 => 'ref.session.php',
    1 => 'Fonctions Session',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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="session.security.ini" class="sect1">
  <h2 class="title">Sécurisation des configurations INI de session</h2>
  
  <p class="para">
   En sécurisant les configurations INI de sessions, les développeurs
   peuvent éprouver la sécurité des sessions. Beaucoup de configurations
   INI n&#039;ont pas de configuration recommandée. Les développeurs sont
   responsables de la bonne configuration des sessions.
  </p>
  
  <ul class="itemizedlist">
   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cookie-lifetime" class="link">session.cookie_lifetime</a>=0
    </p>
    <p class="para">
     La valeur <code class="literal">0</code> a une signification importante.
     Elle informe les navigateurs de ne pas stocker le cookie dans un
     espace de stockage permanent. Aussi, lorsque le navigateur se ferme,
     le cookie d&#039;identification de session est supprimé immédiatement.
     Si les développeurs définissent une valeur différente de 0, cela permet
     aux autres utilisateurs d&#039;utiliser l&#039;identifiant de session. La
     plupart des applications devraient utiliser &quot;<code class="literal">0</code>&quot; comme
     valeur.
    </p>
    <p class="para">
     Si une fonctionnalité d&#039;auto-identification est désirée, les développeurs
     doivent implémenter leur propre système d&#039;auto-identification sécurisé.
     Ne pas utiliser d&#039;identifiants de session à longue durée pour cela.
     Pour plus d&#039;informations, se rapporter à la bonne section
     de cette documentation.
    </p>
   </li>
   
   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.use-cookies" class="link">session.use_cookies</a>=On
    </p>
    <p class="para">
     <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>=On
    </p>
    <p class="para">
     Bien que les cookies HTTP souffrent de soucis techniques, ils
     restent la façon préférée de gérer les identifiants de sessions.
     N&#039;utiliser que les cookies pour la gestion des identifiants de sessions
     lorsque cela est possible. La plupart des applications doivent utiliser
     un cookie pour l&#039;identifiant de session.
    </p>
    <p class="para">
     Si <a href="session.configuration.php#ini.session.use-only-cookies" class="link">session.use_only_cookies</a>=Off,
     le module de session utilisera les valeurs de l&#039;identifiant
     de sessions définies par les variables GET ou POST fournies,
     et le cookie de l&#039;identifiant de session ne sera pas initialisé.
    </p>
   </li>
   
   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>=On
    </p>
    <p class="para">
     Bien que l&#039;activation de <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a>
     soit obligatoire pour la sécurité des sessions, cette directive est
     désactivée par défaut.
    </p>
    <p class="para">
     Ce mode évite que le module de session utilise un identifiant de session
     non initialisé. Dit différemment, le module de session ne va accepter
     que les identifiants de sessions valides générés par le module de session.
     Il va rejeter tous les identifiants de session fournis par les utilisateurs.
    </p>
    <p class="para">
     En raison de la spécification des cookies, les attaquants sont capables
     de placer des cookies contenant les identifiants de sessions en configurant
     localement une base de données de cookie ou par injections Javascript.
     <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a> peut éviter qu&#039;un attaquant
     n&#039;initialise un identifiant de session.
    </p>
    <blockquote class="note"><p><strong class="note">Note</strong>: 
     <p class="para">
      Les attaquants peuvent initialiser un identifiant de session avec leur
      propre périphérique, et peuvent définir l&#039;identifiant de session
      de leur victime. Ils doivent alors conserver l&#039;identifiant de session
      actif pour pouvoir en abuser.
      Les attaquants doivent passer par bien d&#039;autres étapes pour réussir leur attaque
      dans ce scénario. Aussi, l&#039;utilisation de la directive
      <a href="session.configuration.php#ini.session.use-strict-mode" class="link">session.use_strict_mode</a> permet de limiter les risques.
     </p>
    </p></blockquote>
   </li>
   
   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cookie-httponly" class="link">session.cookie_httponly</a>=On
    </p>
    <p class="para">
     Permet de refuser l&#039;accès à un cookie de session depuis javascript.
     Cette configuration évite qu&#039;un cookie ne soit corrompu par une
     injection Javascript.
    </p>
    <p class="para">
     Il est possible d&#039;utiliser un identifiant de session comme jeton CSRF, mais
     ce n&#039;est pas recommandé. Par exemple, des sources HTML peuvent être
     sauvegardées et envoyées à d&#039;autres utilisateurs.
     Les développeurs ne doivent pas écrire les identifiants de session dans les
     pages web pour des raisons de sécurité. Toutes les applications web doivent
     utiliser l&#039;attribut httponly pour le cookie contenant l&#039;identifiant de session.
    </p>
    <blockquote class="note"><p><strong class="note">Note</strong>: 
     <p class="para">
      Le jeton CSRF doit être renouvelé périodiquement, tout comme l&#039;identifiant
      de session.
     </p>
    </p></blockquote>
   </li>
   
   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cookie-secure" class="link">session.cookie_secure</a>=On
    </p>
    <p class="para">
     Permet d&#039;accéder au cookie d&#039;identifiant de session uniquement lorsque
     le protocole est HTTPS. Si un site web n&#039;est accessible que par HTTPS,
     cette directive doit être activée.
    </p>
    <p class="para">
     HSTS doit être utilisé pour les sites web accessibles que par HTTPS.
    </p>
   </li>
   
   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cookie-samesite" class="link">session.cookie_samesite</a>=&quot;Lax&quot; ou
     <a href="session.configuration.php#ini.session.cookie-samesite" class="link">session.cookie_samesite</a>=&quot;Strict&quot;
    </p>
    <p class="para">
     À partir de PHP 7.3, l&#039;attribut <code class="literal">&quot;SameSite&quot;</code> peut être défini
     pour le cookie d&#039;identifiant de session. Cet attribut est une façon de
     mitiger les attaques CSRF (Cross Site Request Forgery).
    </p>
    <p class="para">
     La différence entre Lax et Strict est l&#039;accessibilité du cookie dans les requêtes
     originaires d&#039;autres domaines employant la méthode HTTP GET.
     Les cookies utilisant Lax seront accessibles via une requête GET originaire
     d&#039;un autre domaine, alors que les cookies utilisant Strict ne le seront pas.
    </p>
   </li>
   
   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a>=[choisissez le plus petit possible]
    </p>
    <p class="para">
     <a href="session.configuration.php#ini.session.gc-maxlifetime" class="link">session.gc_maxlifetime</a> est une configuration pour supprimer
     l&#039;identifiant de session obsolète. Le fait de se reposer
     entièrement sur cette configuration <em>n&#039;est pas</em> recommandé.
     Les développeurs doivent gérer la durée de vie des sessions avec un timestamp
     par eux-mêmes.
    </p>
    <p class="para">
     Le GC des sessions (garbage collection) est mieux réalisé en utilisant
     la fonction <span class="function"><a href="function.session-gc.php" class="function">session_gc()</a></span>.
     La fonction <span class="function"><a href="function.session-gc.php" class="function">session_gc()</a></span> doit être exécutée par un gestionnaire
     de tâches ; c.-à-d. un cron sur les systèmes Unix.
    </p>
    <p class="para">
     GC est exécuté par probabilité, par défaut. Cette configuration
     <em>ne garantit pas</em> que les anciennes sessions soient
     supprimées. Bien que les développeurs ne doivent pas s&#039;appuyer sur ce paramètre,
     il est recommandé tout de même de le définir à une valeur la plus petite possible.
     Il convient d&#039;ajuster les directives <a href="session.configuration.php#ini.session.gc-probability" class="link">session.gc_probability</a>
     et <a href="session.configuration.php#ini.session.gc-divisor" class="link">session.gc_divisor</a> de sorte à ce que
     les sessions obsolètes soient supprimées à fréquence appropriée.
     Si la fonctionnalité d&#039;auto-identification est nécessaire, les développeurs
     doivent implémenter leur propre fonctionnalité d&#039;auto-identification sécurisée ;
     voir ci-dessous pour plus d&#039;informations. N&#039;utiliser jamais l&#039;identifiant
     de session de longue durée pour réaliser ce genre de fonctionnalité.
    </p>
    <blockquote class="note"><p><strong class="note">Note</strong>: 
     <p class="para">
      Quelques modules de gestion de sauvegarde des sessions n&#039;utilisent pas cette
      fonctionnalité basée sur l&#039;expiration et sur la probabilité ; c.-à-d.
      memcached, memcache. Se référer à la documentation de ces gestionnaires
      de sauvegarde des sessions pour plus de détails.
     </p>
    </p></blockquote>
   </li>
   
   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a>=Off
    </p>
    <p class="simpara">
     La désactivation de la gestion transparente des identifiants de session
     permet de sécuriser un peu plus les identifiants de session en éliminant
     la possibilité d&#039;une injection d&#039;identifiant de session ou de fuite de cet
     identifiant.
    </p>
    <div class="warning"><strong class="warning">Avertissement</strong>
     <p class="simpara">
      Activer <code class="literal">session.use_trans_sid</code> est obsolète à partir de
      PHP 8.4.0.
     </p>
    </div>
    <blockquote class="note"><p><strong class="note">Note</strong>: 
     <p class="para">
      L&#039;identifiant de session peut fuiter depuis des URLs sauvegardées, 
      des URLs dans des emails, d&#039;une source HTML sauvegardée, etc.
     </p>
    </p></blockquote>
   </li>
   
   <li class="listitem">
    <p class="simpara">
     <a href="session.configuration.php#ini.session.trans-sid-tags" class="link">session.trans_sid_tags</a>=&quot;a=href,area=href,frame=src,form=&quot;
    </p>
    <p class="simpara">
     Les balises HTML non nécessaires ne devraient pas être réécrites. La valeur
     par défaut est suffisante pour la plupart des utilisations. Pour les
     versions de PHP plus anciennes, utiliser plutôt
     <a href="outcontrol.configuration.php#ini.url-rewriter.tags" class="link">url_rewriter.tags</a>.
    </p>
    <div class="warning"><strong class="warning">Avertissement</strong>
     <p class="simpara">
      Modifier <code class="literal">session.trans_sid_tags</code> par rapport à sa valeur
      par défaut est obsolète à partir de PHP 8.4.0.
     </p>
    </div>
   </li>
   
   <li class="listitem">
    <p class="simpara">
     <a href="session.configuration.php#ini.session.trans-sid-hosts" class="link">session.trans_sid_hosts</a>=&quot;&quot;
    </p>
    <p class="simpara">
     Ce paramètre liste les hôtes pour lesquels l&#039;identifiant de session peut
     être ajouté aux URL. Il ne faut jamais y ajouter d&#039;hôte qui n&#039;est pas de
     confiance. Lorsqu&#039;il est vide, le module de session autorise uniquement
     <code class="literal">$_SERVER[&#039;HTTP_HOST&#039;]</code>.
    </p>
    <div class="warning"><strong class="warning">Avertissement</strong>
     <p class="simpara">
      Définir <code class="literal">session.trans_sid_hosts</code> à une valeur non vide
      est obsolète à partir de PHP 8.4.0.
     </p>
    </div>
   </li>
   
   <li class="listitem">
    <p class="simpara">
     <a href="session.configuration.php#ini.session.referer-check" class="link">session.referer_check</a>=&quot;&quot;
    </p>
    <p class="simpara">
     Lorsque le paramètre <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a>
     est actif, une valeur non vide réduit les risques d&#039;injection
     d&#039;identifiant de session : l&#039;identifiant de session envoyé par le client
     est ignoré à moins que l&#039;en-tête <code class="literal">Referer</code> ne contienne
     cette valeur. Il est à noter qu&#039;en HTTPS les navigateurs n&#039;envoient pas
     l&#039;en-tête <code class="literal">Referer</code>, et que les navigateurs peuvent
     l&#039;omettre de par leur propre configuration. Aussi, ce paramètre ne peut pas
     être considéré comme une mesure fiable de sécurité.
    </p>
    <div class="warning"><strong class="warning">Avertissement</strong>
     <p class="simpara">
      Définir <code class="literal">session.referer_check</code> à une valeur non vide
      est obsolète à partir de PHP 8.4.0.
     </p>
    </div>
   </li>
   
   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.cache-limiter" class="link">session.cache_limiter</a>=nocache
    </p>
    <p class="para">
     S&#039;assure que le contenu HTTP n&#039;est pas mis en cache pour les sessions
     authentifiées. Permet la mise en cache que pour les contenus
     qui ne sont pas privés. Sinon, le contenu sera exposé.
     La valeur <code class="literal">&quot;private&quot;</code> doit être employée si le contenu HTTP n&#039;inclut pas
     des données sensibles d&#039;un point de vue sécurité. Il est à noter que <code class="literal">&quot;private&quot;</code>
     peut transmettre des données privées mises en cache pour les clients
     partagés. <code class="literal">&quot;public&quot;</code> doit être uniquement utilisé lorsque le contenu HTML
     ne contient aucune donnée privée.
    </p>
   </li>
   
   <li class="listitem">
    <p class="para">
     <a href="session.configuration.php#ini.session.save-path" class="link">session.save_path</a>=[dossier non lisible par tout le monde]
    </p>
    <p class="para">
     Si ce paramètre est défini à un dossier accessible en lecture par tout le monde,
     comme <var class="filename">/tmp</var> (par défaut), les autres utilisateurs du serveur
     seront capables de récupérer les sessions en listant les fichiers présents
     dans ce répertoire.
    </p>
   </li>
   
  </ul>
 </div><?php manual_footer($setup); ?>