1 <sect1 id="zend.session.globalsessionmanagement">
3 <title>Общее управление сессиями<!--Global Session Management--></title>
6 Поведение сессий, принятое по умолчанию, можно изменить, используя
7 статические методы класса Zend_Session. Все управление производится
8 посредством Zend_Session, включая конфигурирование
9 <ulink url="http://www.php.net/session#session.configuration">через
10 опции, предоставляемые расширением ext/session</ulink>, с использованием
11 метода <code>Zend_Session::setOptions()</code>.
13 The default behavior of sessions can be modified using the static methods in Zend_Session. All management and
14 manipulation of global session management occurs using Zend_Session, including configuration of the
15 <ulink url="http://www.php.net/session#session.configuration">usual options provided by ext/session</ulink>
16 , using <code>Zend_Session::setOptions()</code>. For example, failure to insure the use of a safe save_path or a
17 unique cookie name by ext/session using <code>Zend_Session::setOptions()</code> may result in security issues.
21 <sect2 id="zend.session.setoptions">
23 <title>Zend_Session::setOptions()</title>
26 Когда запрашивается первое пространство имен, то автоматически
27 запустится Zend_Session, если только оно не было запущено ранее
29 <link linkend="zend.session.startingasession"><code>Zend_Session::start()</code></link>.
30 Встроенный в PHP механизм сессий будет использовать принятые по
31 умолчанию настройки из Zend_Session, пока они не будут изменены
32 через метод <code>Zend_Session::setOptions()</code>.
34 When the first session namespace is requested, Zend_Session will autostart itself, unless already started
36 <link linkend="zend.session.startingasession"><code>Zend_Session::start()</code>
38 . The underlying PHP session will use defaults from Zend_Session, unless modified first by
39 <code>Zend_Session::setOptions()</code>.
44 Для того, чтобы передать опции, просто передайте базовое имя (без
45 приставки <code>session.</code>) как часть массива методу
46 <code>Zend_Session::setOptions()</code>. Если опции не были
47 установлены, то Zend_Session будет сначала использовать
48 рекомендуемые опции, затем установки по умолчанию из php.ini.
49 Предложения по оптимизации работы с опциями отправляйте в список
51 <ulink url="mailto:fw-auth@lists.zend.com">fw-auth@lists.zend.com</ulink>.
53 To pass the options just pass the basename (the non <code>session.</code> part) as part of an array to
54 <code>Zend_Session::setOptions()</code>. Without setting any options, Zend_Session will utilize the
55 recommended options first, then the default php.ini settings. Community feedback about best practices for
56 these options should be sent to
57 <ulink url="mailto:fw-auth@lists.zend.com">fw-auth@lists.zend.com</ulink>
63 "Автоматическое" конфигурипрование этой компоненты с использованием
66 To "automatically" configure this component using an ".ini" file with Zend_Config_Ini:
69 <title>Использование Zend_Config для конфирурирования Zend_Session<!--Using Zend_Config to Configure Zend_Session--></title>
70 <programlisting language="php"><![CDATA[<?php
71 $config = new Zend_Config_Ini('myapp.ini', 'sandbox');
72 require_once 'Zend/Session.php';
73 Zend_Session::setOptions($config->toArray());
74 ?>]]></programlisting>
76 Используемый файл "myapp.ini":
78 The corresponding "myapp.ini" file:
81 <title>myapp.ini</title>
82 <programlisting language="php">
84 ; Настройки по умолчанию для производственного сервера
99 ; hash_bits_per_character
101 ; имя должно быть уникальным для всех приложений, использующих
102 ; одно и то же доменное имя
112 ; remember_me_seconds = <integer seconds>
115 ; Наш тестовый сервер использует те же настройки, что и наш
116 ; производственный сервер за исклочением тех, что переопределяются ниже:
118 ; Не забудьте создать эту директорию и сделать ее доступной для чтения
120 save_path = /home/myaccount/zend_sessions/myapp
121 use_only_cookies = on
122 ; Когда индентификатор сессии сохраняется в куках, запрашивать TTL
124 remember_me_seconds = 864000
131 <sect2 id="zend.session.options">
133 <title>Опции<!--Options--></title>
136 Большинство опций, указанных ниже, не нуждается в дополнительных
137 комментариях сверх того, что написано в стандартной документации по
140 Most options shown above need no explanation beyond that found in the standard PHP documentation.
142 <itemizedlist mark='opencircle'>
145 boolean <code>strict</code> - отключает автоматический
146 запуск <code>Zend_Session</code> при использовании
147 <code>new Zend_Session_Namespace()</code>.
149 boolean <code>strict</code> - disables automatic starting of <code>Zend_Session</code> when
150 using <code>new Zend_Session_Namespace()</code>.
156 integer <code>remember_me_seconds</code> - время
157 хранения идентификатора сессии в куках после того, как
158 агент пользователя завершит свою работу (т.е. когда окно
159 броузера будет закрыто).
161 integer <code>remember_me_seconds</code> - how long should session id cookie persist, after user
162 agent has ended (i.e. browser window closed)
168 string <code>save_path</code> - корректное значение
169 зависит от системы и должно указываться разработчиком с
170 использованием <emphasis>абсолютного
171 пути</emphasis> к директории, доступной для чтения и
172 записи процессом PHP. Если директория на заданном пути
173 не существует или недоступна, то
174 <code>Zend_Session</code> бросает исключение во время
175 старта (т.е. когда вызывается метод
176 <code>start()</code>)
178 string <code>save_path</code> - The correct value is system dependent, and should be provided by
179 the developer using an <emphasis>absolute path</emphasis> to a directory readable
180 and writable by the PHP process. If a writable path is not supplied, then <code>Zend_Session
181 </code> will throw an exception when started (i.e. when <code>start()</code> is called).
185 <title>Угроза безопасности<!--Security Risk--></title>
187 Если путь доступен для чтения другими приложениями,
188 то возможен угон сессий (session hijacking). Если
189 путь доступен для записи другими приложениями, то
190 возможно заражение сессий
191 (<ulink url="http://en.wikipedia.org/wiki/Session_poisoning">session poisoning</ulink>).
192 Если этот путь используется совместно с другими
193 пользователями или с другими PHP-приложениями, то
194 это создает различные угрозы безопасности,
195 включая кражу содержимого сессий, угон сессий и
196 коллизии при "сборке мусора" (например, работа
197 приложения другого пользователя может вызвать
198 удаление файлов сессий вашего приложения).
200 If the path is readable by other applications, then session hijacking might be possible. If
201 the path is writable by other applications, then
202 <ulink url="http://en.wikipedia.org/wiki/Session_poisoning">session poisoning</ulink>
203 might be possible. If this path is shared with other users or other PHP applications,
204 various security issues might occur, including theft of session content, hijacking of
205 sessions, and collision of garbage collection (e.g. another user's application might cause
206 PHP to delete your application's session files).
210 Например, атакующий может зайти на сайт жертвы для
211 получения сессионных куков. Затем он изменяет путь
212 куков на собственный домен для того же сервера и
213 заходит на собственный сайт для выполнения
214 <code>var_dump($_SESSION)</code>. Вооруженный
215 информацией о том, как жертва использует данные в
216 своих сессиях, атакующий может модифицировать данные
217 сессии (заражение сессии), возвращает значение пути
218 куков на исходный (ведущий на сайт жертвы) и делает
219 запросы с сайта жертвы, используя зараженную сессию.
220 Даже если оба приложения на том же сервере не имеют
221 прав чтения/записи в директории save_path другого
222 приложения, то в том случае, если можно заходить в
223 директорию save_path и атакующий имеет контроль над
224 одним из сайтов, он может изменить save_path своего
225 сайта на save_path жертвы и таким образом выполнить
226 заражение сессии под некоторыми общими
227 конфигурациями PHP. Поэтому значение save_path не
228 должно быть достоянием общественности и должно быть
229 изменено на секретное значение, уникальное для
232 For example, an attacker can visit the victim's website to obtain a session cookie. Then
233 edit the cookie path to his own domain on the same server, before visiting his own website
234 to execute <code>var_dump($_SESSION)</code>. Armed with detailed knowledge of the victim's
235 use of data in their sessions, the attacker can then modify the session state (poisoning the
236 session), alter the cookie path back to the victim's website, and then make requests from
237 the victim's website using the poisoned session. Even if two applications on the same server
238 do not have read/write access to the other application's save_path, if the save_path is
239 guessable, and the attacker has control over one of these two websites, the attacker could
240 alter their website's save_path to use the other's save_path, and thus accomplish session
241 poisoning, under some common configurations of PHP. Thus, the value for save_path should not
242 be made public knowledge, and should be altered to a secure location unique to each
250 string <code>name</code> - корректное значение зависит
251 от системы и должно устанавливаться разработчиком, с
252 использованием короткого значения,
253 <emphasis>уникального</emphasis> для
256 string <code>name</code> - The correct value is system dependent, and should be provided by
257 the developer using a short value <emphasis>unique</emphasis> to the ZF
262 <title>Угроза безопасности<!--Security Risk--></title>
264 Если настройки в <code>php.ini</code> для
265 <code>session.name</code> одинаковые для
266 приложений (например, "PHPSESSID" для настроек по
267 умолчанию) и через одно доменное имя доступны два и
268 более приложений (например,
269 <code>http://www.somewebhost.com/~youraccount/index.php</code>),
270 то они будут использовать одни и те же данные
271 сессий для посетителей, посещающих оба сайта. Это
272 может привести к разрушению данных сессий.
274 If the <code>php.ini</code> setting for <code>session.name</code>
275 is the same (e.g. the default "PHPSESSID"), and there are two or more PHP applications
276 accessible through the same domain name (e.g.
277 <code>http://www.somewebhost.com/~youraccount/index.php</code>), then they will share
278 the same session data for website visitors that visit both websites. Additionally,
279 possible corruption of session data may result.
286 boolean <code>use_only_cookies</code> - во избежание
287 появления дополнительных угроз безопасности не изменяйте
288 значение, принятое по умолчанию для этой опции, на
291 boolean <code>use_only_cookies</code> - In order to avoid introducing additional security risks,
292 do not alter the default value of this option.
295 <title>Угроза безопасности<!--Security Risk--></title>
297 Если эта опция не включена, то аттакующий может
298 легко "фиксировать" идентификаторы сессии,
299 используя ссылки на атакуемый сайт вида
300 <code>http://www.victim-website.com/index.php?PHPSESSID=fixed_session_id</code>.
301 Фиксация будет работать, если жертва не всегда
302 имеет куки с идентификатором сессии для
303 victim-website.com. Как только жертва будет
304 использовать известный атакующему идентификатор
305 сессии, атакующий может попытаться угнать
306 сессию, имитируя реального пользователя и
307 эмулируя агента жертвы.
309 If this setting is not enabled, an attacker can easily fix victim's session ids, using
310 links on the attacker's website, such as
311 <code>http://www.victim-website.com/index.php?PHPSESSID=fixed_session_id</code>. The
312 fixation works, if the victim does not already have a session id cookie for
313 victim-website.com. Once a victim is using a known session id, the attacker can then
314 attempt to hijack the session by pretending to be the victim, and emulating the victim's
326 <sect2 id="zend.session.regenerateid">
328 <title>regenerateId()</title>
330 <sect3 id="zend.session.regenerateid.intro">
332 <title>Введение: идентификаторы сессий<!--Introduction: Session Identifiers--></title>
335 Введение: Наилучшей практикой в использовании сессий с ZF будет
336 использование куков вместо сохранения идентификатора сессии в
337 URL для отслеживания отдельных пользователей. По
338 умолчанию эта компонента использует только куки для хранения
339 идентификатора сессии. Значением, сохраняемым в куках, является
340 уникальный идентификатор сессии. Расширение ext/session
341 использует этот идентификатор для поддержки однозначно
342 определяемой связи "один-к-одному" между посетителем сайта и
343 хранилищем постоянных данных сессии, уникальным для каждого
344 посетителя. Zend_Session* является оберткой к этому механизму
345 хранения (<varname>$_SESSION</varname>) с объектно-ориентированным
346 интерфейсом. К сожалению, если атакующий получил доступ к
347 идентификатору сессии в куках, то он может угнать сессию
348 посетителя. Эта проблема не является присущей только PHP или
349 Zend Framework. Метод <code>regenerateId()</code> позволяет
350 приложению изменять идентификатор сессии (сохраненный в куках
351 посетителя) на новое случайное значение. Замечание: Несморя на
352 то, что эти термины не равнозначны, для удобочитаемости мы будем
353 попеременно использовать "агент пользователя" и "веб-броузер".
355 Introduction: Best practice in relation to using sessions with ZF calls for using a browser cookie (i.e.
356 a normal cookie stored in your web browser), instead of embedding a unique session identifier in URLs as
357 a means to track individual users. By default this component uses only cookies to maintain session
358 identifiers. The cookie's value is the unique identifier of your browser's session. PHP's ext/session
359 uses this identifier to maintain a unique one-to-one relationship between website visitors, and
360 persistent session data storage unique to each visitor. Zend_Session* wraps this storage mechanism
361 (<varname>$_SESSION</varname>) with an object-oriented interface. Unfortunately, if an attacker gains access
362 to the value of the cookie (the session id), an attacker might be able to hijack a visitor's session.
363 This problem is not unique to PHP, or Zend Framework. The <code>regenerateId()</code> method allows
364 an application to change the session id (stored in the visitor's cookie) to a new, random, unpredictable
365 value. Note: Although not the same, to make this section easier to read, we use the terms "user agent"
366 and "web browser" interchangeably.
371 Почему?: Если атакующий получил валидный идентификатор сессии,
372 то он может имитировать реального пользователя (жертву) и затем
373 получить доступ к конфиденциальной информации или манипулировать
374 данными жертвы через ваше приложение. Изменение идентификатора
375 сессии помогает защитить пользователя от угона сессии. Если
376 идентификатор сессии был изменен и атакующий не знает его новое
377 значение, то он не может использовать новый идентификатор сессии
378 в своей попытке угона сессии посетителя. Даже если атакующий
379 получил доступ к старому идентификатору сессии, то
380 <code>regenerateId()</code> перемещает данные сессии со старого
381 идентификатора на новый, и поэтому данные этой сессии не будут
382 доступны через старый идентификатор.
384 Why?: If an attacker obtains a valid session identifier, an attacker might be able to impersonate a
385 valid user (the victim), and then obtain access to confidential information or otherwise manipulate the
386 victim's data managed by your application. Changing session ids helps protect against session hijacking.
387 If the session id is changed, and an attacker does not know the new value, the attacker can not use the
388 new session id in their attempts to hijack the visitor's session. Even if an attacker gains access to an
389 old session id, <code>regenerateId()</code> also moves the session data from the old session id "handle"
390 to the new one, so no data remains accessible via the old session id.
395 Когда использовать regenerateId(): Добавление
396 <code>Zend_Session::regenerateId()</code> в файл загрузки
397 Zend Framework является одним из самых безопасных и надежных
398 способов регенерации идентификаторов сессии в куках агента
399 пользователя. Само по себе отсутствие условной логики,
400 определяющей, когда регенерировать идентификатор сессии, не
401 является признаком плохо разработанного кода. Но, несмотря на
402 то, что регенерация при каждом запросе пересекает некоторые
403 возможные пути атак, не все хотят мириться с небольшой потерей в
404 производительности и пропускной способности, связанными с
405 регенерацией. Поэтому приложения обычно пытаются определить
406 ситуации, связанные с наибольшим риском, и только тогда
407 регенерируют идентификаторы сессий. В случаях, когда привилегии
408 сессии посетителя сайта "обостряются" (например, посетитель
409 заново проходит аутентификацию до изменения его личного
410 "профиля") или когда производятся "чувствительные" для
411 безопасности изменения параметров сессии, используется
412 <code>regenerateId()</code> для регенерации идентификатора
413 сессии. Если вы вызываете функцию <code>rememberMe()</code>, то
414 не используйте <code>regenerateId()</code>, т.к. первая функция
415 вызывает вторую. Если пользователь успешно залогинился на вашем
416 сайте, используйте <code>rememberMe()</code> вместо
417 <code>regenerateId()</code>.
419 When to use regenerateId(): Adding <code>Zend_Session::regenerateId()</code> to your Zend Framework
420 bootstrap yields one of the safest and most secure ways to regenerate session id's in user agent
421 cookies. If there is no conditional logic to determine when to regenerate the session id, then there are
422 no flaws in that logic. Although regenerating on every request prevents several possible avenues of
423 attack, not everyone wants the associated small performance and bandwidth cost. Thus, applications
424 commonly try to dynamically determine situations of greater risk, and only regenerate the session ids in
425 those situations. Whenever a website visitor's session's privileges are "escalated" (e.g. a visitor
426 re-authenticates their identity before editing their personal "profile"), or whenever a security
427 "sensitive" session parameter change occurs, consider using <code>regenerateId()</code> to create a new
428 session id. If you call the <code>rememberMe()</code> function, then don't use
429 <code>regenerateId()</code>, since the former calls the latter. If a user has successfully logged into
430 your website, use <code>rememberMe()</code> instead of <code>regenerateId()</code>.
436 <sect3 id="zend.session.regenerateid.details">
438 <title>Угон и фиксация сессии<!--Session Hijacking and Fixation--></title>
441 Отсутствие XSS-уязвимостей на сайте помогает предотвратить угон
442 сессий c него. Согласно
443 статистике <ulink url="http://secunia.com/">Secunia</ulink>,
444 <ulink url="http://en.wikipedia.org/wiki/Cross_site_scripting">
445 XSS (межсайтовый скриптинг)</ulink> - довольно распространенное
446 явление. Лучше минимизировать возможный ущерб от XSS, следуя
447 наилучшей практике программирования, чем предполагать, что этого
448 никогда не случится с вами. Атакующему, использующему
449 XSS, не нужно иметь прямой доступ к сетевому трафику жертвы.
450 Если жертва уже имеет сессионные куки, то XSS с внедрением кода
451 Javascript позволит атакующему прочитать куки и украсть сессию.
452 Если жертва не имеет сессионные куки, то, используя XSS с
453 внедрением кода Javascript, атакующий может создать куку с
454 заранее известным идентификатором сессии в броузере жертвы,
455 затем установить идентичную куку в своей системе, чтобы угнать
456 сессию жертвы. Если жертва посетит сайт атакующего, то
457 атакующий может также сэмулировать и другие доступные для
458 идентификации характеристики агента пользователя жертвы. Если
459 ваш сайт имеет XSS-уязвимости, то атакующий может внедрить
460 AJAX-код, который скрытно "заходит" на сайт атакующего, и
461 атакующий может узнать характеристики броузера жертвы и о
462 скомпрометированной сессии на сайте жертвы. Но несмотря на все
463 это, атакующий не может изменить данные сессии на стороне
464 сервера при условии, что разработчик корректно установил
465 значение опции <code>save_path</code>.
468 <ulink url="http://en.wikipedia.org/wiki/Cross_site_scripting">cross-site script (XSS) vulnerabilities</ulink>
469 helps preventing session hijacking. According to
470 <ulink url="http://secunia.com/">Secunia's statistics</ulink>
471 XSS problems occur frequently, regardless of the languages used to create web applications. Rather than
472 expecting to never have a XSS problem with an application, plan for it by following best practices to
473 plan for it by following best practices to help minimize damage, if it occurs. With XSS, an attacker
474 does not need direct access to a victim's network traffic. If the victim already has a session cookie,
475 Javascript XSS might allow an attacker to read the cookie and steal the session. For victims with no
476 session cookies, using XSS to inject Javascript, an attacker could create a session id cookie on the
477 victim's browser with a known value, then set an identical cookie on the attacker's system, in order to
478 hijack the victim's session. If the victim visited an attacker's website, then the attacker can also
479 emulate most other identifiable characteristics of the victim's user agent. If your website has an XSS
480 vulnerability, the attacker might be able to insert an AJAX Javascript that secretly "visits" the
481 attacker's website, so that the attacker knows the victim's browser characteristics and becomes aware of
482 a compromised session at the victim website. However, the attacker can not arbitrarily alter the
483 server-side state of PHP sessions, provided the developer has correctly set the value for the
484 <code>save_path</code> option.
489 Сам по себе вызов <code>Zend_Session::regenerateId()</code>
490 в то время, как сессия еще только начинает использоваться, не
491 предотвращает атаку через фиксацию сессии, за исключением
492 того случая, когда вы можете отличить сессию, созданную
493 атакующим, имитирующим личность жертвы. На первый взгляд это
494 противоречит предыдущему утверждению, но до тех пор, пока мы не
495 будем считать атакующим того, кто первый иницировал создание
496 настоящей сессии на вашем сайте. Сессия сначала используется
497 атакующим, который знает результат инициализации
498 (<code>regenerateId()</code>). Атакующий затем использует новый
499 идентификатор сессии вместе с найденной XSS-уязвимостью или
500 добавляет идентификатор сессии в ссылку на сайт атакующего
501 (работает в том случае, если
502 <code>use_only_cookies = off</code>).
504 By itself, calling <code>Zend_Session::regenerateId()</code> when the user's session is first used,
505 does not prevent session fixation attacks, unless you can distinguish between a session originated by an
506 attacker emulating the victim. At first, this might sound contradictory to previous statement above,
507 until we consider an attacker who first initiates a real session on your website. The session is "first
508 used" by the attacker, who then knows the result of the initialization (<code>regenerateId()</code>).
509 The attacker then uses the new session id in combination with an XSS vulnerability, or injects the
510 session id via a link on the attacker's website (works if <code>use_only_cookies = off</code>).
515 Если вы можете различать атакующего и жертву, использующих один
516 и тот же идентификатор сессии, то это может решить проблему
517 увода сессии. Тем не менее, такое распознавание обычно
518 принуждает к поиску компромисса с юзабилити, т.к. методы
519 различения нередко являются неточными. Для примера, если запрос
520 получен с IP в стране, отличающейся от IP запроса, при котором
521 была создана сессия, то это может означать, что новый запрос
522 производится уже атакующим. При выполнении следующих условий
523 приложение сайта не сможет различить жертву и атакующего:
525 If you can distinguish between an attacker and victim using the same session id, then session hijacking
526 can be dealt with directly. However, such distinctions usually involve some form of usability tradeoffs,
527 because the methods of distinction are often imprecise. For example, if a request is received from an IP
528 in a different country than the IP of the request when the session was created, then the new request
529 probably belongs to an attacker. Under the following conditions, there might not be any way for a
530 website application to distinguish between a victim and an attacker:
532 <itemizedlist mark='opencircle'>
535 - атакующий первый иницировал сессию на вашем сайте для получения валидного идентификатора сессии
537 - attacker first initiates a session on your website to obtain a valid session id
543 - атакующий использует XSS-уязвимость на вашем сайте для создания куки в броузере жертвы с валидным идентификатором сессии (т.е. фиксация сессии)
545 - attacker uses XSS vulnerability on your website to create a cookie on the victim's browser
546 with the same, valid session id (i.e. session fixation)
552 - атакующий и его жертва заходят через одну и ту же группу прокси-серверов (например, оба находятся за одним и тем же файрволом в большой компании - такой, как AOL)
554 - both the victim and attacker originate from the same proxy farm (e.g. both are behind the
555 same firewall at a large company, like AOL)
561 Пример кода ниже намного затрудняет получение атакующим текущего идентификатора сессии жертвы, за исключением тех случаев, когда атакующий уже выполнил первые два шага из приведенных выше.
563 The sample code below makes it much harder for an attacker to know the current victim's session id,
564 unless the attacker has already performed the first two steps above.
569 <title>Анонимная сессия и фиксация сессии<!--Anonymous Sessions and Session Fixation--></title>
570 <programlisting language="php"><![CDATA[<?php
571 require_once 'Zend/Session.php';
572 $defaultNamespace = new Zend_Session_Namespace();
574 if (!isset($defaultNamespace->initialized))
576 Zend_Session::regenerateId();
577 $defaultNamespace->initialized = true;
579 ?>]]></programlisting>
586 <sect2 id="zend.session.rememberme">
588 <title>rememberMe(integer $seconds)</title>
591 Обычно сессия заканчивается, когда агент пользователя завершает
592 сеанс работы - например, пользователь закрыл окно броузера. Тем не
593 менее, после того как пользователь зашел в систему, может
594 понадобиться хранить его сессию 24 часа и больше. Программное
595 обеспечение форумов обычно предоставляет пользователю возможность
596 выбирать, сколько времени должна храниться сессиия. Используйте
597 <code>Zend_Session::rememberMe()</code> для отправки
598 обновленной сессионной куки агенту пользователя со временем жизни,
599 по умолчанию равному <code>remember_me_seconds</code>, который равен
600 2 неделям до тех пор, пока вы не измените это значение через метод
601 <code>Zend_Session::setOptions()</code>. Для того, чтобы
602 помешать угону или фиксации сессии, используйте эту функцию, когда
603 пользователь успешно прошел аутентификацию и ваше приложение
604 выполнило "регистрацию"
606 Ordinarily, sessions end when the user agent ends its "session", such as when an end user closes their
607 browser window. However, when a user logs in to your website, they might want their virtual session to last
608 for 24 hours, or even longer. Forum software commonly gives the user a choice for how long their session
609 should last. Use <code>Zend_Session::rememberMe()</code> to send an updated session cookie to the user
610 agent with a lifetime defaulting to <code>remember_me_seconds</code>, which is set to 2 weeks, unless you
611 modify that value using <code>Zend_Session::setOptions()</code>. To help thwart session fixation/hijacking, use this
612 function when a user successfully authenticates and you application performs a "login".
618 <sect2 id="zend.session.forgetme">
620 <title>forgetMe()</title>
623 Эта функция является дополнением к <code>rememberMe()</code>.
624 Она возвращает сессионную куку к тому состоянию, при котором ее
625 время жизни завершается в тот момент, когда агент пользователя
626 завершает сеанс работы (например, пользователь закрыл окно своего
629 This function complements <code>rememberMe()</code> by changing the session cookie back to a lifetime ending
630 when the user agent ends its session (e.g. user closes their browser window).
636 <sect2 id="zend.session.sessionexists">
638 <title>sessionExists()</title>
641 Используйте этот метод для определения того, есть ли уже сессия для
642 текущего агента пользователя/запроса. Он может использоваться до
643 старта сессии и независимо от всех других методов Zend_Session и
644 Zend_Session_Namespace.
646 Use this method to determine if a session already exists for the current user agent/request. It may be used
647 before starting a session, and independently of all other Zend_Session and Zend_Session_Namespace methods.
653 <sect2 id="zend.session.destroy">
655 <title>destroy(bool $remove_cookie = true, bool $readonly = true)</title>
658 <code>Zend_Session::destroy()</code> уничтожает все постоянные
659 данные, связанные с текущей сессией. Это не влияет на переменные в
660 PHP, поэтому ваши сессии с пространствами имен (экземпляры
661 <code>Zend_Session_Namespace</code>) остаются доступными для чтения.
662 Для выхода из системы установите необязательный параметр в
663 <constant>TRUE</constant> (по умолчанию он равен <constant>TRUE</constant>), при
664 этом будет удалена кука с идентификатором сессии в агенте
665 пользователя. Установленный в <constant>TRUE</constant> необязательный
666 параметр <varname>$readonly</varname> блокирует возможность записи в
667 данные сессии (т.е. в $_SESSION) для экземпляров
668 Zend_Session_Namespace и методов Zend_Session.
670 <code>Zend_Session::destroy()</code> destroys all of the persistent data associated with the current
671 session. However, no variables in PHP are affected, so your namespaced sessions (instances of
672 <code>Zend_Session_Namespace</code>) remain readable. To complete a "logout", set the optional parameter to
673 true (default is true) to also delete the user agent's session id cookie. The optinal <varname>$readonly</varname>
674 parameter removes the ability for Zend_Session_Namespace instances, and Zend_Session methods to write to the
675 session data store (i.e. $_SESSION).
680 <title>Исключения<!--Throws--></title>
682 По умолчанию <varname>$readonly</varname> установлен в
683 <constant>TRUE</constant> и дальнейшие действия, подразумевающие запись
684 в хранилище данных сессии, вызовут генерацию исключения.
686 By default, <varname>$readonly</varname> is enabled and further actions involving writing to the session data
687 store will throw an error.
694 <sect2 id="zend.session.stop">
696 <title>stop()</title>
699 Этот метод не делает ничего, кроме переключения флага в
700 Zend_Session для предотвращения дальнейшей записи в хранилище
701 данных сессии (т.е.<varname>$_SESSION</varname>). Одним из вариантов его
702 использования является временное отключение возможности записи в
703 хранилище данных сессии через экземпляры
704 <code>Zend_Session_Namespace</code> или методы
705 <code>Zend_Session</code> во время выполнения кода,
706 связанного с отображением вида.
707 Попытка выполнить действия, подразумевающие запись через эти
708 экземпляры или методы вызовет генерацию исключения.
710 This method does absolutely nothing more than toggle a flag in Zend_Session to prevent further writing to
711 the session data store (i.e. <varname>$_SESSION</varname>). We are specifically requesting feedback on this
712 feature. Potential uses/abuses might include temporarily disabling the use of
713 <code>Zend_Session_Namespace</code> instances or <code>Zend_Session</code> methods to write to the session
714 data store, while execution is transfered to view-related code. Attempts to perform actions involving writes
715 via these instances or methods will throw an error.
721 <sect2 id="zend.session.writeClose">
723 <title>writeClose($readonly = true)</title>
726 Закрывает сессию, завершает запись и отсоединяет $_SESSION от
727 средства хранения на сервере. Это завершит внутреннее преобразование
728 данных для данного запроса. Необязательный параметр булевого типа
729 $readonly позволяет отключить возможность записи (т.е. генерация
730 исключения при попытке записи через любые методы
731 Zend_Session_Namespace или Zend_Session).
733 Shutdown the session, close writing and detach $_SESSION from the back-end storage mechanism. This will
734 complete the internal data transformation on this request. The optional $readonly boolean parameter can
735 remove write access (i.e. throw error if any Zend_Session_Namespace or Zend_Session methods attempt writes).
740 <title>Исключения<!--Throws--></title>
742 По умолчанию <varname>$readonly</varname> включен и дальнейшие
743 действия, подразумевающие запись в хранилище данных сессии,
744 вызовут генерацию исключения.
746 By default, <varname>$readonly</varname> is enabled and further actions involving writing to the session data
747 store will throw an error. However, some legacy application might expect $_SESSION to remain writeable
748 after ending the session via session_write_close(). Although not considered "best practice", the
749 <varname>$readonly</varname> option is available for those who need it.
756 <sect2 id="zend.session.expiresessioncookie">
758 <title>expireSessionCookie()</title>
761 Этот метод отправляет куку с уже истекшим временем действия, что
762 вызывает удаление сессионной куки в агенте пользователя. Иногда этот
763 метод используется для выхода из системы со стороны клиента.
765 This method sends an expired session id cookie, causing the client to delete the session cookie. Sometimes
766 this technique is used to perform a client-side logout.
772 <sect2 id="zend.session.savehandler">
774 <title>setSaveHandler(Zend_Session_SaveHandler_Interface $interface)</title>
777 Большинство разработчиков находят достаточным использовать принятый
778 по умолчанию механизм хранения сессионных данных.
779 Этот метод предоставляет объектно-ориентированную обертку для <code>
780 <ulink url="http://php.net/session_set_save_handler">session_set_save_handler()</ulink>
783 Most developers will find the default save handler sufficient. This method provides an object-oriented
785 <ulink url="http://php.net/session_set_save_handler">session_set_save_handler()</ulink>
792 <sect2 id="zend.session.namespaceisset">
794 <title>namespaceIsset($namespace)</title>
797 Используйте этот метод для определения того, существует ли
798 пространство имен с данным именем или определенный индекс в данном
801 Use this method to determine if a session namespace exists, or if a particular index exists in a particular
807 <title>Исключения<!--Throws--></title>
809 Если Zend_Session не был помечен как доступный для чтения
810 (например, до того, как Zend_Session был запущен), то будет
811 сгенерировано исключение.
813 An error will be thrown if Zend_Session is not marked as readable (e.g. before Zend_Session
821 <sect2 id="zend.session.namespaceunset">
823 <title>namespaceUnset($namespace)</title>
826 Вместо создания экземпляра Zend_Session_Namespace для пространства
827 имен и итерации по его содержимому для удаления каждой отдельной
828 записи используйте метод <code>namespaceUnset($namespace)</code> для
829 быстрого удаления всего пространства имен и его содержимого. Как это
830 справедливо для всех массивов в PHP, если переменная, содержащая
831 массив, уничтожена, и этот массив содержал другие объекты, то эти
832 объекты не уничтожаются, если они были сохранены по ссылке в других
833 массивах/объектах. Это означает, что они остаются доступными через
834 другие переменные. Поэтому <code>namespaceUnset()</code> не
835 производит "глубокое" удаление содержимого записей в пространстве
836 имен. За более подробной информацией обращайтесь к разделу
837 <ulink url="http://php.net/references">References Explained</ulink>
838 в документации по PHP.
840 Instead of creating a Zend_Session instance for a namespace, and iterating over its contents to unset each
841 entry, use <code>Zend_Session::namespaceUnset($namespace)</code> to efficiently unset (remove) an entire
842 namespace and its contents. As with all arrays in PHP, if a variable containing an array is unset, and the
843 array contains other objects, those objects will remain available, if they were also stored by reference in
844 other array/objects that remain accessible via other variables. So <code>namespaceUnset()</code> does not
845 perform a "deep" unsetting/deleting of the contents of the entries in the namespace. For a more detailed
846 explanation, please see
847 <ulink url="http://php.net/references">References Explained</ulink>
853 <title>Исключения<!--Throws--></title>
855 Если пространство имен недоступно для записи (например, после
856 <code>destroy()</code>), то будет сгенерировано исключение.
858 An error will be thrown if the namespace is not writable (e.g. after <code>destroy()</code>).
865 <sect2 id="zend.session.namespaceget">
867 <title>namespaceGet($namespace)</title>
870 Не рекомендуется к использованию: Используйте
871 <code>getIterator()</code> в Zend_Session_Namespace. Этот метод
872 возвращает массив содержимого пространства имен
873 <varname>$namespace</varname>. Этот метод позднее может быть определен как
874 закрытый. Если вы считаете, что есть разумные причины оставить этот
875 метод открытым, то пишите в список рассылки
876 <ulink url="mailto:fw-auth@lists.zend.com">fw-auth@lists.zend.com</ulink>.
877 Участие в связанных темах также приветствуется :)
879 DEPRECATED: Use <code>getIterator()</code> in Zend_Session_Namespace. This method returns an array of the
880 contents of <varname>$namespace</varname>. If you have logical reasons to keep this method publicly accessible,
881 please provide feedback to the
882 <ulink url="mailto:fw-auth@lists.zend.com">fw-auth@lists.zend.com</ulink>
883 mail list. Actually, all participation on any relevant topic is welcome :)
888 <title>Исключения<!--Throws--></title>
890 Если Zend_Session не был помечен как доступный для чтения
891 (например, до того, как Zend_Session был запущен), то будет
892 сгенерировано исключение.
894 An error will be thrown if Zend_Session is not marked as readable (e.g. before Zend_Session
902 <sect2 id="zend.session.getiterator">
904 <title>getIterator()</title>
907 Используйте метод <code>getIterator()</code> для получения массива,
908 содержащего имена всех пространств имен, и с которым можно
909 производить итерации.
911 Use <code>getIterator()</code> to obtain an iterable array containing the names of all namespaces.
916 <title>Уничтожение всех пространств имен<!--Unsetting All Namespaces--></title>
917 <programlisting language="php"><![CDATA[<?php
918 foreach(Zend_Session::getIterator() as $space) {
920 $core->namespaceUnset($space);
921 } catch (Zend_Session_Exception $e) {
922 return; // possible if Zend_Session::stop() has been executed
926 ?>]]></programlisting>
930 <title>Исключения<!--Throws--></title>
932 Если Zend_Session не был помечен как доступный для чтения
933 (например, до того, как Zend_Session был запущен), то будет
934 сгенерировано исключение.
936 An error will be thrown if Zend_Session is not marked as readable (e.g. before Zend_Session