mirror of
https://github.com/macintoshplus/doc-fr.git
synced 2026-03-26 18:02:17 +01:00
git-svn-id: https://svn.php.net/repository/phpdoc/fr/trunk@186397 c90b9560-bf6c-de11-be94-00142212c4b1
471 lines
18 KiB
XML
471 lines
18 KiB
XML
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
<!-- $Revision: 1.30 $ -->
|
|
<!-- EN-Revision: 1.50 Maintainer: yannick Status: ready -->
|
|
<!-- Reviewed: yes -->
|
|
<reference id="ref.session">
|
|
<title>Sessions</title>
|
|
<titleabbrev>Sessions</titleabbrev>
|
|
|
|
<partintro>
|
|
|
|
<section id="session.intro">
|
|
&reftitle.intro;
|
|
<para>
|
|
Le support des sessions de &php; est un moyen de préserver
|
|
des données entre plusieurs accès. Cela vous permet de
|
|
créer des applications personnalisées, et d'augmenter
|
|
l'attrait de votre site.
|
|
</para>
|
|
<para>
|
|
Chaque visiteur accédant à votre page web se voit assigner un
|
|
identifiant unique, appelé "identifiant de session". Il peut
|
|
être stocké soit dans un cookie, soit propagé dans l'URL.
|
|
</para>
|
|
<para>
|
|
Le support des sessions vous permet d'enregistrer un
|
|
nombre illimité de variables qui doivent être préservées
|
|
entre les requêtes. Lorsqu'un visiteur accède à votre site,
|
|
&php; va vérifier automatiquement (si
|
|
<link linkend="ini.session.auto-start"><option>session.auto_start
|
|
</option></link> est activé) ou sur demande (explicitement avec
|
|
<function>session_start</function> ou implicitement avec
|
|
<function>session_register</function>) s'il existe une
|
|
session du même nom. Si c'est le cas, l'environnement
|
|
précédemment sauvé sera recréé.
|
|
</para>
|
|
<caution>
|
|
<para>
|
|
Si vous activez <link
|
|
linkend="ini.session.auto-start"><option>session.auto_start
|
|
</option></link>, alors vous ne pourrez pas enregistrer
|
|
d'objets dans votre session tant que la définition de la classe
|
|
ne sera pas chargée avant le début de la session, pour recréer les objets
|
|
de votre session.
|
|
</para>
|
|
</caution>
|
|
<para>
|
|
Toutes les variables sont sérialisées après l'exécution du
|
|
script &php;. Les variables qui sont indéfinies sont marquées
|
|
comme telles. Lors des accès ultérieurs, elles ne seront pas
|
|
définies, jusqu'à ce que l'utilisateur le fasse.
|
|
</para>
|
|
<warning>
|
|
<para>
|
|
Quelques types de données ne peuvent pas être linéarisés pour être stockés
|
|
dans les sessions. Cela inclut les variables de type <type>resource</type>
|
|
ou les objets avec des références circulaires (i.e. objet qui passe une
|
|
référence à lui-même à un autre objet).
|
|
</para>
|
|
</warning>
|
|
<note>
|
|
<para>
|
|
La gestion des sessions a été ajoutée en &php; 4.0.
|
|
</para>
|
|
</note>
|
|
<note>
|
|
<para>
|
|
Notez que lorsque vous travaillez avec les sessions, un enregistrement
|
|
dans la session ne sera pas créé tant que la variable ne sera pas
|
|
enregistrée en utilisant la fonction <function>session_register</function>
|
|
ou en ajoutant une clé à la variable super-globale
|
|
<varname>$_SESSION</varname>. Cela n'est vrai que si vous avez débuté une
|
|
session en appelant la fonction <function>session_start</function>.
|
|
</para>
|
|
</note>
|
|
</section>
|
|
|
|
<section id="session.security">
|
|
<title>Sessions et sécurité</title>
|
|
<para>
|
|
Lien externe : <ulink url="&url.session-fixation;">Session fixation</ulink>
|
|
</para>
|
|
<para>
|
|
Utiliser les sessions ne signifie pas que les données de session ne
|
|
pourront être vues que par un seul utilisateur. Il est important de
|
|
garder cela en tête lorsque vous stockez et affichez des données
|
|
importantes. Lorsque vous stockez des données dans une session,
|
|
il faut se demander quels seront les problèmes posés si quelqu'un
|
|
d'autre accède à cette information, ou comment votre application
|
|
est affectée si la session est en fait celle d'un autre.
|
|
</para>
|
|
<para>
|
|
Par exemple, si quelqu'un usurpe une session, il peut alors poster
|
|
un message dans un forum sous une fausse identité. Quelle est la
|
|
gravité de ce problème ? Ou bien, il peut accéder aux commandes
|
|
d'un client, et même, modifier son panier d'achat. A priori, c'est
|
|
moins problématique pour un fleuriste que pour un pharmacien.
|
|
Si vous voulez résoudre ce souci de façon simple, il peut être utile
|
|
d'activer <literal>session.use_only_cookies</literal>. Dans ce cas,
|
|
les cookies devront être activés par le client, sinon, les sessions ne
|
|
fonctionneront pas.
|
|
</para>
|
|
<para>
|
|
Par conséquent, lorsque vous manipulez des données importantes,
|
|
il faut exploiter d'autres méthodes pour décider si une session
|
|
est valide ou pas. Les sessions ne fournissent pas une méthode
|
|
fiable d'identification.
|
|
</para>
|
|
<para>
|
|
Les sessions reposent sur un identifiant de session, ce qui signifie
|
|
que quelqu'un peut voler cet identifiant, rien qu'en volant l'ID. Ce vol
|
|
peut être rendu très difficile, comme en utilisant les
|
|
cookies, mais en aucun cas cela sera impossible. Les sessions dépendent
|
|
aussi de la discipline de l'utilisateur qui referme son navigateur
|
|
à la fin de la session pour tout clore proprement.
|
|
De plus, même les cookies de session peuvent être
|
|
surveillés sur un réseau, ou bien notés par un proxy car ils transitent en
|
|
clair sur le réseau. Pour remédier à cela, vous devriez implémenter un
|
|
chiffrage SSL sur votre plate-forme.
|
|
</para>
|
|
</section>
|
|
|
|
<section id="session.requirements">
|
|
&reftitle.required;
|
|
&no.requirement;
|
|
<note>
|
|
<para>
|
|
Optionnellement, vous pouvez utiliser l'allocation de mémoire partagée
|
|
(mm), développé par Ralf S.Engelschall, pour stocker votre session.
|
|
Vous devez télécharger <ulink url="&url.mm;">mm</ulink> et l'installer.
|
|
Cette option n'est pas disponible pour les environnements Windows.
|
|
Notez que le module de stockage de session mm ne garantit pas
|
|
les verrous de sessions en cas d'accès multiples à la même session.
|
|
Il peut être moins approprié d'utiliser un système de fichiers
|
|
basé en mémoire partagée
|
|
(comme tmpfs sur Solaris/Linux ou <filename>/dev/md</filename> sur BSD)
|
|
pour stocker les sessions dans des fichiers, car ils ne seront pas
|
|
proprement verrouillés.
|
|
</para>
|
|
</note>
|
|
</section>
|
|
|
|
&reference.session.configure;
|
|
|
|
&reference.session.ini;
|
|
|
|
<section id="session.resources">
|
|
&reftitle.resources;
|
|
&no.resource;
|
|
</section>
|
|
|
|
&reference.session.constants;
|
|
|
|
<section id="session.examples">
|
|
&reftitle.examples;
|
|
<note>
|
|
<para>
|
|
Depuis &php; 4.1.0, <varname>$_SESSION</varname> est disponible comme
|
|
variable globale, au même titre que <varname>$_POST</varname>,
|
|
<varname>$_GET</varname>, <varname>$_REQUEST</varname>, etc.
|
|
Contrairement à <varname>$HTTP_SESSION_VARS</varname>,
|
|
<varname>$_SESSION</varname> est toujours globale. Par conséquent, vous
|
|
n'avez pas besoin d'utiliser le mot réservé
|
|
<link linkend="language.variables.scope"><command>global</command></link>
|
|
avec <varname>$_SESSION</varname>. Notez que cette documentation
|
|
a été modifiée pour utiliser <varname>$_SESSION</varname>.
|
|
Vous pouvez toujours le remplacer par
|
|
<varname>$HTTP_SESSION_VARS</varname> si vous préférez l'ancienne version.
|
|
Notez également que vous devez démarrer votre session en utilisant la fonction
|
|
<function>session_start</function> avant d'utiliser
|
|
la variable super-globale <varname>$_SESSION</varname>.
|
|
</para>
|
|
<para>
|
|
Les clés du tableau <varname>$_SESSION</varname> sont sujettes
|
|
aux mêmes limitations que les variables &php; habituelles, c'est-à-dire
|
|
qu'elles ne peuvent pas commencer par un nombre, mais commencer par
|
|
une lettre ou un souligné '_'. Pour plus de détails, reportez-vous à
|
|
la section sur les <link linkend="language.variables">variables</link>.
|
|
</para>
|
|
</note>
|
|
|
|
<para>
|
|
Si <link linkend="ini.track-vars"><literal>track_vars</literal></link> est
|
|
activé et <link linkend="ini.register-globals"><literal>register_globals</literal></link>
|
|
est désactivé, seuls les éléments du tableau global
|
|
<varname>$_SESSION</varname> contiendront les variables
|
|
enregistrées dans la session. Les variables de sessions relues seront
|
|
uniquement disponibles dans <varname>$_SESSION</varname>.
|
|
</para>
|
|
<para>
|
|
L'utilisation de <varname>$_SESSION</varname> (ou
|
|
<varname>$HTTP_SESSION_VARS</varname> avec &php; 4.0.6 et plus ancien) est
|
|
recommandé pour une meilleure sécurité et un code plus facilement
|
|
entretenu. Avec <varname>$_SESSION</varname>, il n'y a pas besoin
|
|
d'utiliser les fonctions <function>session_register</function>,
|
|
<function>session_unregister</function> et
|
|
<function>session_is_registered</function>. Les variables de sessions
|
|
sont accessibles comme toute autre variable.
|
|
<example>
|
|
<title>
|
|
Enregistrer une variable avec <varname>$_SESSION</varname>.
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
session_start();
|
|
// Utilisez $HTTP_SESSION_VARS avec PHP 4.0.6 ou plus ancien
|
|
if (!isset($_SESSION['compteur'])) {
|
|
$_SESSION['compteur'] = 0;
|
|
} else {
|
|
$_SESSION['compteur']++;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<example>
|
|
<title>
|
|
Retirer une variable de session avec <varname>$_SESSION</varname> et <link
|
|
linkend="ini.register-globals"><option>register_globals</option></link> inactif.
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
session_start();
|
|
// Utilisez $HTTP_SESSION_VARS avec PHP 4.0.6 ou plus ancien
|
|
unset($_SESSION['compteur']);
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<caution>
|
|
<para>
|
|
N'utilisez PAS la fonction <function>unset</function>
|
|
avec <varname>$_SESSION</varname> sous la forme
|
|
<literal>unset($_SESSION)</literal> sinon, cela rendra impossible
|
|
l'enregistrement de données dans la session en utilisant la super-globale
|
|
<varname>$_SESSION</varname>.
|
|
</para>
|
|
</caution>
|
|
</para>
|
|
<warning>
|
|
<para>
|
|
Vous ne pouvez pas utiliser les références sur des variables de session
|
|
car il n'y a aucune manière faisable de restaurer une référence vers une
|
|
autre variable.
|
|
</para>
|
|
</warning>
|
|
<para>
|
|
<example>
|
|
<title>
|
|
Retirer une variable de session avec <varname>$_SESSION</varname> et
|
|
<link
|
|
linkend="ini.register-globals"><option>register_globals</option></link>
|
|
activé, après l'avoir enregistré avec <varname>$_SESSION</varname>.
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
session_start();
|
|
// Avec PHP 4.3 et plus récent, vous pouvez simplement utiliser l'exemple précédent
|
|
session_unregister('compteur');
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
Si <link linkend="ini.register-globals"><literal>register_globals</literal></link>
|
|
est activé, alors toutes les variables globales peuvent être
|
|
enregistrées comme variables de session, et toutes les variables de
|
|
sessions seront reconstituées comme variables globales. Comme &php; doit
|
|
savoir quels variables globales sont enregistrées comme variables
|
|
de sessions, l'utilisateur doit enregistrer les variables avec
|
|
<function>session_register</function> tandis que
|
|
<varname>$HTTP_SESSION_VARS</varname> et <varname>$_SESSION</varname>
|
|
ne nécessitent pas <function>session_register</function>.
|
|
<caution>
|
|
<para>
|
|
Avant &php; 4.3, si vous utilisez <varname>$_SESSION</varname> et que
|
|
vous avez désactivé <link
|
|
linkend="ini.register-globals"><option>register_globals</option></link>,
|
|
n'utilisez pas <function>session_register</function>,
|
|
<function>session_is_registered</function> ou
|
|
<function>session_unregister</function>.
|
|
</para>
|
|
<para>
|
|
Si vous activez <link
|
|
linkend="ini.register-globals"><literal>register_globals</literal></link>,
|
|
<function>session_unregister</function> doit être utilisé, car les
|
|
variables de sessions sont enregistrés comme variables globales lorsque
|
|
les données de sessions sont relues. Désactiver
|
|
<link linkend="ini.register-globals"><literal>register_globals</literal></link>
|
|
est recommandé pour des raisons de sécurité et de performances.
|
|
</para>
|
|
</caution>
|
|
<example>
|
|
<title>
|
|
Enregistrer une variable avec
|
|
<link linkend="ini.register-globals"><option>register_globals</option></link>
|
|
activé
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
if (! isset($_SESSION['compteur'])) {
|
|
$_SESSION['compteur'] = 1;
|
|
} else {
|
|
$_SESSION['compteur']++;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
Si <link
|
|
linkend="ini.register-globals"><literal>register_globals</literal></link>
|
|
est activé, alors les variables globales et les entrées dans le tableau
|
|
<varname>$_SESSION</varname> seront des références sur la même valeur pour
|
|
les valeurs qui auront été enregistrées avant le démarrage de la session
|
|
(donc, dans les page précédentes).
|
|
</para>
|
|
<para>
|
|
De plus, si vous enregistrez une nouvelle variable avec la fonction
|
|
<function>session_register</function>, l'entrée dans l'environnement
|
|
global et <varname>$_SESSION</varname> ne fera pas de référence vers la
|
|
même valeur jusqu'à la prochaine utilisation de
|
|
<function>session_start</function> (ceci s'applique à &php; 4.2 et
|
|
avant seulement). C'est à dire qu'une modification dans les variables
|
|
globales ne sera pas répercutée dans les entrées de
|
|
<varname>$_SESSION</varname>. Il est peu probable que cela ait un impact en
|
|
pratique et, de plus, cela a été corrigé en &php; 4.3.
|
|
</para>
|
|
</section>
|
|
|
|
<section id="session.idpassing">
|
|
<title>Passer l'identifiant de session (session ID)</title>
|
|
<para>
|
|
Il y a deux méthodes de propagation de l'identifiant de session :
|
|
<itemizedlist>
|
|
<listitem>
|
|
<simpara>
|
|
Cookies
|
|
</simpara>
|
|
</listitem>
|
|
<listitem>
|
|
<simpara>
|
|
Par URL
|
|
</simpara>
|
|
</listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
<para>
|
|
Le module de session supporte les deux méthodes. Les cookies sont
|
|
optimaux, mais comme ils ne sont pas sûrs (tous les internautes
|
|
ne les acceptent pas), ils ne sont pas fiables. La seconde
|
|
méthode place l'identifiant de session directement dans les URL.
|
|
</para>
|
|
<para>
|
|
&php; est capable de faire cela de manière transparente, lorsqu'il est
|
|
compilé avec l'option <link linkend="ini.session.use-trans-sid">
|
|
<literal>--enable-trans-sid</literal></link>. Si vous activez
|
|
cette option, les URL relatives seront modifiées pour contenir
|
|
l'identifiant de session automatiquement. Alternativement,
|
|
vous pouvez utiliser la constante <constant>SID</constant>, qui est
|
|
définie, si le client n'a pas envoyé le cookie approprié.
|
|
<constant>SID</constant> est soit de la forme
|
|
<literal>session_name=session_id</literal> ou une chaîne vide.
|
|
<note>
|
|
<para>
|
|
L'option <link linkend="ini.arg-separator.output"><option>arg_separator.output</option></link>
|
|
de &php.ini; vous permet de personnaliser le séparateur d'arguments.
|
|
Pour être complètement en accord avec les spécifications XHTML, spécifiez
|
|
&amp; ici.
|
|
</para>
|
|
</note>
|
|
</para>
|
|
<para>
|
|
Alternativement, vous pouvez utiliser la constante <constant>SID</constant>
|
|
qui est toujours définie. Si le client n'envoie pas un cookie de session
|
|
approprié, il aura la forme <literal>session_name=session_id</literal>.
|
|
Sinon, il vaudra une chaîne vide. Ainsi, vous pouvez dans tous les cas
|
|
l'inclure dans l'URL.
|
|
</para>
|
|
<para>
|
|
L'exemple suivant vous montre comment enregistrer une variable et comment
|
|
réaliser un lien correct avec une autre page, avec
|
|
<constant>SID</constant>.
|
|
<example>
|
|
<title>Compter le nombre de passages d'un utilisateur sur une page</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
if (!session_is_registered('compteur')) {
|
|
session_register('compteur');
|
|
$compteur = 1;
|
|
} else {
|
|
$compteur++;
|
|
}
|
|
?>
|
|
|
|
<p>
|
|
Bonjour visiteur, vous avez vu cette page <?php echo $compteur; ?> fois.
|
|
</p>
|
|
|
|
<p>
|
|
Pour continuer, <a href="nextpage.php?<?php echo strip_tags(SID); ?>">cliquez ici</a>.
|
|
</p>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
La fonction <function>strip_tags</function> est utilisée lors de l'affichage
|
|
du <constant>SID</constant> dans le but de contrer les attaques XSS.
|
|
</para>
|
|
<para>
|
|
L'affichage du <constant>SID</constant>, comme montré dans l'exemple
|
|
ci-dessus, n'est pas nécessaire si <link
|
|
linkend="install.configure.enable-trans-sid">
|
|
<option>--enable-trans-sid</option></link> a été utilisé pour compiler
|
|
&php;.
|
|
</para>
|
|
<note>
|
|
<para>
|
|
Les URL non-relatives sont considérées comme externes au site, et ne
|
|
recevront pas le <constant>SID</constant>, car c'est une fuite
|
|
d'informations vers un autre site (envoi d'informations importantes).
|
|
</para>
|
|
</note>
|
|
</section>
|
|
|
|
<section id="session.customhandler">
|
|
<title>Gestion personnalisée des sessions</title>
|
|
<para>
|
|
Pour implémenter un stockage en base de données, ou toute autre méthode,
|
|
vous aurez besoin de la fonction
|
|
<function>session_set_save_handler</function> pour
|
|
paramétrer vos propres fonctions de stockage.
|
|
</para>
|
|
</section>
|
|
</partintro>
|
|
|
|
&reference.session.functions;
|
|
|
|
</reference>
|
|
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"../../../manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|
|
|