Zend_Session-GlobalSessionManagement.xml 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.session.global_session_management">
  5. <title>Gestion générale de la session</title>
  6. <para>
  7. Le comportement des sessions peut être modifié en utilisant les méthodes statiques de
  8. la classe Zend_Session. Il s'agit du comportement global des sessions dans toute
  9. l'application, incluant la configuration des <ulink
  10. url="http://www.php.net/session#session.configuration">options usuelles offertes par
  11. ext/session</ulink>, ceci en utilisant <methodname>Zend_Session::setOptions()</methodname>.
  12. Ainsi, des problèmes de sécurité peuvent apparaître si vous utilisez mal le support de
  13. stockage des sessions <code>save_path</code> ou encore si vous négligez le cookie utilisé
  14. par ext/session.
  15. </para>
  16. <sect2 id="zend.session.global_session_management.configuration_options">
  17. <title>Options de configuration</title>
  18. <para>
  19. Lors de la création du premier namespace de session, Zend_Session va
  20. automatiquement démarrer la session <acronym>PHP</acronym>, sauf si celle-ci a été démarrée avec <link
  21. linkend="zend.session.advanced_usage.starting_a_session"><methodname>Zend_Session::start()</methodname></link>
  22. auparavant. La session <acronym>PHP</acronym> résultante utilisera les options de configuration par défaut
  23. de Zend_Session, sauf si ceux-ci ont été modifiés à l'aide de
  24. <methodname>Zend_Session::setOptions()</methodname>.
  25. </para>
  26. <para>
  27. Pour assigner une option de configuration, passez son nom (la partie qui suit
  28. "<code>session.</code>" dans les options de configuration de ext/session) comme clé au
  29. tableau passé à <methodname>Zend_Session::setOptions()</methodname>. La valeur
  30. correspondante dans le tableau sera alors utilisée comme valeur de l'option. Si vous
  31. omettez une option, alors celles par défaut recommandées par Zend_Session seront
  32. utilisées, sinon si elles n'existent pas, les valeurs par défaut de php.ini. Les retours
  33. et les idées quant aux "options recommandées" sont appréciées et peuvent être envoyées à
  34. <ulink url="mailto:fw-auth@lists.zend.com">fw-auth@lists.zend.com</ulink>.
  35. </para>
  36. <example id="zend.session.global_session_management.setoptions.example">
  37. <title>Utiliser Zend_Config pour configurer Zend_Session</title>
  38. <para>
  39. Pour configurer le composant en utilisant un objet <link
  40. linkend="zend.config.adapters.ini"><classname>Zend_Config_Ini</classname></link>,
  41. ajoutez ces paramètres au fichier <acronym>INI</acronym> en question:
  42. </para>
  43. <programlisting language="ini"><![CDATA[
  44. ; Paramètres de production
  45. [production]
  46. ; bug_compat_42
  47. ; bug_compat_warn
  48. ; cache_expire
  49. ; cache_limiter
  50. ; cookie_domain
  51. ; cookie_lifetime
  52. ; cookie_path
  53. ; cookie_secure
  54. ; entropy_file
  55. ; entropy_length
  56. ; gc_divisor
  57. ; gc_maxlifetime
  58. ; gc_probability
  59. ; hash_bits_per_character
  60. ; hash_function
  61. ; name doit être unique pour chaque application partageant le même nom de domaine
  62. name = UNIQUE_NAME
  63. ; referer_check
  64. ; save_handler
  65. ; save_path
  66. ; serialize_handler
  67. ; use_cookies
  68. ; use_only_cookies
  69. ; use_trans_sid
  70. ; remember_me_seconds = <integer seconds>
  71. ; strict = on|off
  72. ; Development hérite de production, mais redéfinit certaines valeurs
  73. [development : production]
  74. ; N'oubliez pas de créer ce dossier et d'attribuer à PHP les droits 'rwx'.
  75. save_path = /home/myaccount/zend_sessions/myapp
  76. use_only_cookies = on
  77. ; Le cookie de session durera 10 jours
  78. remember_me_seconds = 864000
  79. ]]></programlisting>
  80. <para>
  81. Ensuite, chargez ce fichier de configuration, et passez sa représentation
  82. tableau à <methodname>Zend_Session::setOptions()</methodname>:
  83. </para>
  84. <programlisting language="php"><![CDATA[
  85. $config = new Zend_Config_Ini('myapp.ini', 'development');
  86. require_once 'Zend/Session.php';
  87. Zend_Session::setOptions($config->toArray());
  88. ]]></programlisting>
  89. </example>
  90. <para>
  91. La plupart des options ne nécessitent pas d'explications étant donné qu'elles font
  92. parti des options de ext/session, documentées dans le manuel officiel de <acronym>PHP</acronym>, cependant
  93. les options particulières méritent une description: <itemizedlist mark="opencircle">
  94. <listitem>
  95. <para>
  96. bool <code>strict</code> : désactive le démarrage automatique de
  97. <classname>Zend_Session</classname> lorsque <code>new
  98. Zend_Session_Namespace()</code> est utilisé.
  99. </para>
  100. </listitem>
  101. <listitem>
  102. <para>
  103. int <code>remember_me_seconds</code> : temps de vie du cookie de
  104. session, une fois le navigateur client fermé.
  105. </para>
  106. </listitem>
  107. <listitem>
  108. <para>
  109. string <code>save_path</code> : Cette valeur est dépendante du système
  110. sur lequel <acronym>PHP</acronym> est lancé. Un <emphasis>chemin absolu</emphasis> vers un
  111. dossier lisible et écrivable à <acronym>PHP</acronym> devrait être utilisé (dans le cas
  112. d'utilisation d'un dossier pour le support des sessions). Si le chemin n'est
  113. pas pleinement accessible à <acronym>PHP</acronym>, <classname>Zend_Session</classname> lancera
  114. une exception à son démarrage (lorsque <methodname>start()</methodname> est
  115. appelée.
  116. </para>
  117. <note>
  118. <title>Attention aux failles de sécurité</title>
  119. <para>
  120. Si le chemin des sessions est accessible en lecture à d'autres
  121. applications, alors le vol de session peut être possible. Si le dossier
  122. est accessible en écriture à d'autres applications, alors <ulink
  123. url="http://en.wikipedia.org/wiki/Session_poisoning">l'empoisonnement de
  124. sessions</ulink> peut être possible. SI le chemin est partagé avec
  125. d'autres utilisateurs ou d'autres applications <acronym>PHP</acronym>, plusieurs problèmes
  126. de sécurité peuvent apparaître, incluant le vol de session, et les
  127. collisions de ramasse-miette (garbage collection) (Un process d'une
  128. autre application <acronym>PHP</acronym> déclenche une collecte sur vos fichiers de
  129. session).
  130. </para>
  131. <para>
  132. Par exemple, un pirate peut visiter le site d'une victime pour
  133. obtenir un cookie de session. Il modifie ensuite le chemin du cookie
  134. afin que celui-ci soit envoyé à sa propre application (en partage sur le
  135. même serveur que le votre), et il exécute
  136. <methodname>var_dump($_SESSION)</methodname>. Il obtient alors des informations sur
  137. les variables de session que vous stockez, et il peut les modifier pour
  138. retourner sur votre site. L'empoisonnement a eu lieu. Même si deux
  139. applications sur le même serveur ne partagent pas le même dossier
  140. <code>save_path</code>, si celui-ci est devinable, l'attaquant peut
  141. alors l'utiliser sur sa propre application et dans certaines
  142. configurations de <acronym>PHP</acronym>, accéder à la session de l'application victime. La
  143. valeur du <code>save_path</code> ne doit pas être rendue publique ou
  144. devinable, le dossier doit se trouver dans un endroit isolé et
  145. sécurisé.
  146. </para>
  147. </note>
  148. </listitem>
  149. <listitem>
  150. <para>
  151. string <code>name</code> - La valeur doit être choisie de manière
  152. <emphasis>unique</emphasis> pour chaque application.
  153. </para>
  154. <note>
  155. <title>Risque de sécurité</title>
  156. <para>
  157. Si la valeur <code>php.ini</code> de <code>session.name</code>
  158. n'est pas unique (celle par défaut "PHPSESSID"), et qu'il existe
  159. plusieurs applications accessible via le même domaine, alors elle
  160. partagerons leurs données pour les visiteurs. Aussi, des problème de
  161. corruption peuvent apparaître.
  162. </para>
  163. </note>
  164. </listitem>
  165. <listitem>
  166. <para>
  167. bool <code>use_only_cookies</code> - Afin d'éviter d'autres failles de
  168. sécurité (concernant le trans-sid), ne changez pas cette option. <note>
  169. <title>Risque de sécurité</title>
  170. <para>
  171. Si cette option n'est pas activée, un attaquant peut
  172. facilement fixer un id de session d'une victime en lui envoyant des
  173. liens tels que
  174. <code>http://www.example.com/index.php?PHPSESSID=fixed_session_id</code>.
  175. La fixation fonctionne si la victime n'a pas déjà un identifiant de
  176. session sur le site example.com. Lorsque la victime utilise un
  177. identifiant de session qu'un attaquant connaît, il peut alors se
  178. faire passer pour elle.
  179. </para>
  180. </note>
  181. </para>
  182. </listitem>
  183. </itemizedlist>
  184. </para>
  185. </sect2>
  186. <sect2 id="zend.session.global_session_management.headers_sent">
  187. <title>L'erreur: "Headers Already Sent"</title>
  188. <para>
  189. Si vous voyez l'erreur, "Cannot modify header information - headers already sent",
  190. ou, "You must call ... before any output has been sent to the browser; output started in
  191. ...", analysez tout de suite d'où vient la fuite grâce au message d'erreur. Toute action
  192. entraînant un envoi d'en-têtes <acronym>HTTP</acronym>, comme envoyer un cookie, doit être effectuée avant
  193. d'envoyer du contenu standard (non bufferisé), sauf si le buffer de sortie de <acronym>PHP</acronym> est
  194. activé.
  195. </para>
  196. <itemizedlist mark="opencircle">
  197. <listitem>
  198. <para>
  199. Utiliser <ulink url="http://php.net/outcontrol">le buffer de
  200. sortie</ulink> résout souvent le problème, et peut améliorer les performances.
  201. Par exemple, une valeur <code>php.ini</code>, "<code>output_buffering =
  202. 65535</code>" active un buffer de 64K. Même si le buffer de sortie peut
  203. améliorer les performances lorsqu'il est bien configuré, se reposer sur lui
  204. concernant les erreurs "headers already sent" n'est pas suffisant. En effet, sa
  205. taille peut être dépassé entraînant son vidage, et le problème revient.
  206. </para>
  207. </listitem>
  208. <listitem>
  209. <para>
  210. Aussi, il convient d'organiser l'application de manière à ce que les
  211. envois d'en-tête se passent avant l'envoi de contenu.
  212. </para>
  213. </listitem>
  214. <listitem>
  215. <para>
  216. Si Zend_Session produit ce message, cherchez la cause grâce au message
  217. d'erreur indiquant d'où provient "la fuite". Aussi, des opérations comme
  218. <methodname>destroy()</methodname> envoient des en-têtes concernant la destruction du cookie
  219. de session. Si vous ne voulez pas ces informations envoyées, utilisez alors
  220. <methodname>destroy(false)</methodname>.
  221. </para>
  222. </listitem>
  223. <listitem>
  224. <para>
  225. Supprimez tous les balises de fermeture "<code>?&gt;</code>", si elles
  226. terminent du code <acronym>PHP</acronym>. Elles sont facultatives et les nouvelles lignes blanches
  227. éventuelles en fin de fichier ne seront pas envoyées, car parsées par
  228. <acronym>PHP</acronym>.
  229. </para>
  230. </listitem>
  231. </itemizedlist>
  232. </sect2>
  233. <sect2 id="zend.session.global_session_management.session_identifiers">
  234. <title>Identifiants de session</title>
  235. <para>
  236. Les bonnes pratiques d'utilisation des sessions avec Zend Framework passent par un
  237. cookie, plutôt que se reporter à l'URL concernant l'identifiant de session. Par défaut,
  238. le composant Zend_Session est bloqué sur l'utilisation unique du cookie comme moyen de
  239. propagation de l'identifiant de session. La session <acronym>PHP</acronym> va alors utiliser cet
  240. identifiant de manière à identifier de manière unique chaque client (navigateur) qui s'y
  241. connecte, et maintenir un état entre leurs transactions, donnant l'impression de
  242. conservation de données. Zend_Session_* utilise alors le tableau
  243. (<varname>$_SESSION</varname>) et vous y donne accès d'une manière objet élégante. Attention,
  244. si un attaquant arrive à accéder au cookie de session d'une victime, il pourra alors
  245. tromper le serveur, et se faire passer pour la victime. Ce comportement n'est pas unique
  246. à <acronym>PHP</acronym>, ni à Zend Framework, mais au Web en général, et au protocole <acronym>HTTP</acronym>. La méthode
  247. <methodname>regenerateId()</methodname> permet de changer l'identifiant de session stocké dans le
  248. cookie du client, par un autre, en théorie imprévisible. Notez que par la suite, nous
  249. confondons les termes 'client' et 'navigateur', même si ceci n'est pas tout à fait
  250. juste.
  251. </para>
  252. <para>
  253. Changer l'identifiant de session permet d'aider contre le vol de données. Si un
  254. attaquant possède l'identifiant d'une victime, le changer ne changera rien pour la
  255. victime, mais provoquera une invalidation de la session de l'attaquant, qui ne connaît
  256. alors pas la nouvelle valeur de l'identifiant de session. Non seulement
  257. <methodname>regenerateId()</methodname> change l'identifiant de session, mais en plus il migre les
  258. données de l'ancien identifiant vers le nouveau, invalidant totalement l'ancien.
  259. </para>
  260. <para>
  261. Quand régénérer cet identifiant ? En théorie, mettre
  262. <methodname>Zend_Session::regenerateId()</methodname> en bootstrap est la manière la plus
  263. adaptée pour sécuriser une session. Cependant, ceci a un coût non négligeable, car il
  264. faut alors à chaque fois régénérer un identifiant, et renvoyer un nouveau cookie au
  265. client. Il est alors nécessaire de déterminer les situations 'à risque', et régénérer
  266. alors l'identifiant de session dans de telles situations. Ces situations peuvent être
  267. par exemple l'authentification d'un client, ou encore son élévation de privilèges. Si
  268. vous appelez <methodname>rememberMe()</methodname>, n'appelez alors pas <methodname>regenerateId()</methodname>,
  269. car elle sera appelée de manière automatique.
  270. </para>
  271. <sect3 id="zend.session.global_session_management.session_identifiers.hijacking_and_fixation">
  272. <title>Vol de session et fixation</title>
  273. <para>
  274. Éviter <ulink url="http://en.wikipedia.org/wiki/Cross_site_scripting">les
  275. failles cross-site script (XSS) </ulink> aide à éviter le vol de session. Selon
  276. <ulink url="http://secunia.com/">Secunia</ulink>, les problèmes XSS sont fréquents,
  277. quelque soit le langage utilisé pour créer l'application Web. Plutôt que de se
  278. considérer invulnérable, considérez votre application de manière à minimiser
  279. l'impact d'une éventuelle faille XSS. Avec XSS, l'attaquant n'a pas besoin d'accéder
  280. au trafic de la victime, sur le réseau. Si la victime possède déjà un cookie de
  281. session, javascript peut permettre à l'attaquant de voler celui-ci, et donc la
  282. session. Dans le cas de victimes sans cookie, l'attaquant peut utiliser XSS pour
  283. créer un cookie avec un session id connu, et l'envoyer à la victime, fixant ainsi la
  284. session. L'attaquant peut dès lors visualiser toute la session de la victime au fur
  285. et à mesure que celle-ci surfe, sans se rendre compte de rien. Cependant,
  286. l'attaquant ne peut modifier l'état de la session du coté <acronym>PHP</acronym> ( la fermer par
  287. exemple ), sauf si l'application possède d'autres vulnérabilités (CSRF), ou si le
  288. <code>save_path</code> est modifiable.
  289. </para>
  290. <para>
  291. En elle-même, la fonction <methodname>Zend_Session::regenerateId()</methodname>
  292. utilisée à la première utilisation de la session, ne protège pas contre la fixation.
  293. Ceci peut paraître contradictoire, mais un attaquant peut très bien initialiser une
  294. session de lui-même, qui sera alors rafraîchie (régénérée), et dont il connaîtra
  295. alors l'identifiant. Il n'aura plus qu'à fixer cet identifiant dans un javascript
  296. pour qu'une victime l'utilise, et la faille est à nouveau présente. Aussi, fixer la
  297. session par l'URL est extrêmement simple, mais n'est possible que lorsque
  298. <code>use_only_cookies = off</code>.
  299. </para>
  300. <para>
  301. Le vol de session ne peut se remarqué que si vous arrivez à faire la
  302. différence entre l'attaquant et la victime. Ce n'est pas chose simple, et les
  303. techniques utilisées ne sont jamais fiables à 100%. L'IP peut être utilisée, même si
  304. celle-ci n'est pas totalement fiable. Les en-têtes du navigateur Web, eux, le sont
  305. déjà plus (lorsque 2 requêtes successives avec le même identifiant de session
  306. arrivent au serveur, si l'une prétend être issue de FireFox et l'autre d'Opéra,
  307. alors très probablement qu'il s'agit de 2 personnes différentes, mais ayant le même
  308. identifiant de session. Typiquement : l'attaquant et sa victime.) Il est très
  309. difficile de différencier l'attaquant et la victime, c'est d'ailleurs impossible
  310. dans la suite de cas suivants : <itemizedlist mark="opencircle">
  311. <listitem>
  312. <para>
  313. l'attaquant initialise une session pour obtenir un identifiant
  314. valide.
  315. </para>
  316. </listitem>
  317. <listitem>
  318. <para>
  319. l'attaquant utilise une faille XSS pour envoyer un cookie de
  320. session à une victime, possédant son propre identifiant de session
  321. (fixation).
  322. </para>
  323. </listitem>
  324. <listitem>
  325. <para>
  326. l'attaquant et la victime utilisent le même navigateur, sont
  327. derrière le même proxy.
  328. </para>
  329. </listitem>
  330. </itemizedlist> Le code suivant permet d'empêcher l'attaquant de connaître
  331. l'identifiant de session de la victime (sauf s'il arrive à le fixer):
  332. </para>
  333. <example id="zend.session.global_session_management.session_identifiers.hijacking_and_fixation.example">
  334. <title>Vol et fixation, protections</title>
  335. <programlisting language="php"><![CDATA[
  336. $defaultNamespace = new Zend_Session_Namespace();
  337. if (!isset($defaultNamespace->initialized)) {
  338. Zend_Session::regenerateId();
  339. $defaultNamespace->initialized = true;
  340. }
  341. ]]></programlisting>
  342. </example>
  343. </sect3>
  344. </sect2>
  345. <sect2 id="zend.session.global_session_management.rememberme">
  346. <title><methodname>rememberMe(integer $seconds)</methodname></title>
  347. <para>
  348. Par défaut, la session se termine lorsque le client ferme son navigateur. Il peut
  349. cependant être nécessaire de faire en sorte que même après la fermeture, le cookie de
  350. session persiste un certain temps dans le navigateur. Utilisez
  351. <methodname>Zend_Session::rememberMe()</methodname> avant tout démarrage de la session,
  352. afin de spécifier à celle-ci qu'elle devra utiliser un cookie persistant du coté du
  353. client. Ce cookie persistera alors $seconds secondes. Si vous ne précisez pas de temps,
  354. <code>remember_me_seconds</code>, sera utilisé. Cette valeur se paramètre d'ailleurs au
  355. moyen de <methodname>Zend_Session::setOptions()</methodname>.
  356. </para>
  357. </sect2>
  358. <sect2 id="zend.session.global_session_management.forgetme">
  359. <title><methodname>forgetMe()</methodname></title>
  360. <para>
  361. Cette fonction est analogue à <methodname>rememberMe()</methodname> sauf qu'elle demande au
  362. cookie de session du navigateur client d'être détruit à la fermeture de celui-ci (et non
  363. éventuellement après X temps).
  364. </para>
  365. </sect2>
  366. <sect2 id="zend.session.global_session_management.sessionexists">
  367. <title><methodname>sessionExists()</methodname></title>
  368. <para>
  369. Utilisez cette méthode afin de savoir si une session existe pour le client (la
  370. requête) actuel. Ceci doit être utilisé avant le démarrage de la session.
  371. </para>
  372. </sect2>
  373. <sect2 id="zend.session.global_session_management.destroy">
  374. <title><methodname>destroy(bool $remove_cookie = true, bool $readonly = true)</methodname></title>
  375. <para>
  376. <methodname>Zend_Session::destroy()</methodname> détruit la session et toutes les
  377. données la concernant. Cependant, aucune variable dans <acronym>PHP</acronym> n'est affectée, donc vos
  378. namespaces de session (instances de <classname>Zend_Session_Namespace</classname>)
  379. restent lisibles. Pour compléter la "déconnexion", laissez le premier paramètre à
  380. <constant>TRUE</constant> (par défaut), demandant l'expiration du cookie de session du client.
  381. <varname>$readonly</varname> permet d'empêcher la future création de namespaces (new
  382. <classname>Zend_Session_Namespace</classname>) ou des opérations d'écriture via
  383. <classname>Zend_Session</classname>.
  384. </para>
  385. <para>
  386. Si vous voyez le message d'erreur "Cannot modify header information - headers
  387. already sent", alors tentez de ne pas utiliser <constant>TRUE</constant> comme valeur du premier
  388. argument (ceci demande l'expiration du cookie de session, ou voyez <link
  389. linkend="zend.session.global_session_management.headers_sent">cette section</link>. Ainsi,
  390. <methodname>Zend_Session::destroy(true)</methodname> doit être appelé avant tout envoi
  391. d'en-tête <acronym>HTTP</acronym> par <acronym>PHP</acronym>, ou alors la bufferisation de sortie doit être activée (sans que
  392. celui-ci ne déborde).
  393. </para>
  394. <note>
  395. <title>Exception</title>
  396. <para>
  397. Par défaut, <varname>$readonly</varname> est activé et toute opération future
  398. d'écriture dans la session lèvera une exception.
  399. </para>
  400. </note>
  401. </sect2>
  402. <sect2 id="zend.session.global_session_management.stop">
  403. <title><methodname>stop()</methodname></title>
  404. <para>
  405. Cette méthode ne fait rien d'autre que de verrouiller la session en écriture. Tout
  406. appel futur d'écriture via des instances de
  407. <classname>Zend_Session_Namespace</classname> ou <classname>Zend_Session</classname>
  408. lèvera une exception.
  409. </para>
  410. </sect2>
  411. <sect2 id="zend.session.global_session_management.writeclose">
  412. <title><methodname>writeClose($readonly = true)</methodname></title>
  413. <para>
  414. Ferme la session coté serveur, soit enregistre les variables de session dans le
  415. support, et détache <varname>$_SESSION</varname> de son support de stockage. Le paramètre
  416. optionnel <varname>$readonly</varname> empêche alors toute future écriture via
  417. <classname>Zend_Session</classname> ou <classname>Zend_Session_Namespace</classname>.
  418. Ces écritures lèveront une exception.
  419. </para>
  420. <note>
  421. <title>Exception</title>
  422. <para>
  423. Par défaut, <varname>$readonly</varname> est activé, et donc tout appel d'écriture
  424. futur dans la session générera une exception. Certaines applications peuvent
  425. nécessiter de conserver un accès en écriture dans <varname>$_SESSION</varname>, même si ce
  426. tableau a été déconnecté de son support de stockage avec
  427. <methodname>session_write_close()</methodname>. Ainsi, Zend Framework propose cette option en
  428. passant à <constant>FALSE</constant> la valeur de <varname>$readonly</varname>, mais ce n'est pas
  429. une pratique conseillée.
  430. </para>
  431. </note>
  432. </sect2>
  433. <sect2 id="zend.session.global_session_management.expiresessioncookie">
  434. <title><methodname>expireSessionCookie()</methodname></title>
  435. <para>
  436. Cette méthode envoie un cookie d'identifiant de session périmé au client. Quelque
  437. fois cette technique est utilisée pour déconnecter le client de sa session.
  438. </para>
  439. </sect2>
  440. <sect2 id="zend.session.global_session_management.savehandler">
  441. <title><code>setSaveHandler(Zend_Session_SaveHandler_Interface
  442. $interface)</code></title>
  443. <para>
  444. Cette méthode propose une correspondance orientée objet de <ulink
  445. url="http://php.net/session_set_save_handler"><methodname>session_set_save_handler()</methodname></ulink>.
  446. </para>
  447. </sect2>
  448. <sect2 id="zend.session.global_session_management.namespaceisset">
  449. <title><methodname>namespaceIsset($namespace)</methodname></title>
  450. <para>Cette méthode permet de déterminer si un namespace existe dans la session.</para>
  451. <note>
  452. <title>Exception</title>
  453. <para>
  454. Une exception sera levée si la session n'est pas lisible (n'a pas été
  455. démarrée).
  456. </para>
  457. </note>
  458. </sect2>
  459. <sect2 id="zend.session.global_session_management.namespaceunset">
  460. <title><methodname>namespaceUnset($namespace)</methodname></title>
  461. <para>
  462. Utilisez <methodname>Zend_Session::namespaceUnset($namespace)</methodname> pour
  463. détruire un namespace entier de la session. Comme pour les tableaux <acronym>PHP</acronym>, si le tableau
  464. est détruit, les objets à l'intérieur ne le sont pas s'il reste des références vers eux
  465. dans d'autres tableaux ou objets toujours accessibles. Ainsi
  466. <methodname>namespaceUnset()</methodname> ne détruit pas "en profondeur" la variable de session
  467. associée au namespace. Voyez <ulink url="http://php.net/references">les références en
  468. <acronym>PHP</acronym></ulink> pour plus d'infos.
  469. </para>
  470. <note>
  471. <title>Exception</title>
  472. <para>
  473. Une exception sera envoyée si le namespace n'est pas écrivable (après un appel
  474. à <methodname>destroy()</methodname>).
  475. </para>
  476. </note>
  477. </sect2>
  478. <sect2 id="zend.session.global_session_management.namespaceget">
  479. <title><methodname>namespaceGet($namespace)</methodname></title>
  480. <para>
  481. Déprécié: Utilisez <methodname>getIterator()</methodname> dans
  482. <classname>Zend_Session_Namespace</classname>. Cette méthode retourne un tableau du
  483. contenu du namespace $namespace. Si vous avez une raison de conserver cette méthode,
  484. faites nous part de vos remarques à <ulink
  485. url="mailto:fw-auth@lists.zend.com">fw-auth@lists.zend.com</ulink>.
  486. </para>
  487. <note>
  488. <title>Exception</title>
  489. <para>
  490. Une exception sera levée si la session n'est pas lisible (n'a pas été
  491. démarrée).
  492. </para>
  493. </note>
  494. </sect2>
  495. <sect2 id="zend.session.global_session_management.getiterator">
  496. <title><methodname>getIterator()</methodname></title>
  497. <para>
  498. <methodname>getIterator()</methodname> retourne un <code>ArrayObject</code> contenant tous les
  499. noms des namespaces de session.
  500. </para>
  501. <note>
  502. <title>Exception</title>
  503. <para>
  504. Une exception sera levée si la session n'est pas lisible (n'a pas été
  505. démarrée).
  506. </para>
  507. </note>
  508. </sect2>
  509. </sect1>