[MANUAL] English:
[zend.git] / documentation / manual / ru / module_specs / Zend_Session-GlobalSessionManagement.xml
blob642227b5acb5186c0c91b0a1e6971d2389ba389c
1 <sect1 id="zend.session.globalsessionmanagement">
3     <title>Общее управление сессиями<!--Global Session Management--></title>
5     <para>
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>.
12 <!--
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.
18 -->
19     </para>
21     <sect2 id="zend.session.setoptions">
23         <title>Zend_Session::setOptions()</title>
25         <para>
26             Когда запрашивается первое пространство имен, то автоматически
27             запустится Zend_Session, если только оно не было запущено ранее
28             через метод
29             <link linkend="zend.session.startingasession"><code>Zend_Session::start()</code></link>.
30             Встроенный в PHP механизм сессий будет использовать принятые по
31             умолчанию настройки из Zend_Session, пока они не будут изменены
32             через метод <code>Zend_Session::setOptions()</code>.
33 <!--
34             When the first session namespace is requested, Zend_Session will autostart itself, unless already started
35             explicitly by using
36             <link linkend="zend.session.startingasession"><code>Zend_Session::start()</code>
37             </link>
38             . The underlying PHP session will use defaults from Zend_Session, unless modified first by
39             <code>Zend_Session::setOptions()</code>.
40 -->
41         </para>
43         <para>
44             Для того, чтобы передать опции, просто передайте базовое имя (без
45             приставки <code>session.</code>) как часть массива методу
46             <code>Zend_Session::setOptions()</code>. Если опции не были
47             установлены, то Zend_Session будет сначала использовать
48             рекомендуемые опции, затем установки по умолчанию из php.ini.
49             Предложения по оптимизации работы с опциями отправляйте в список
50             рассылки
51             <ulink url="mailto:fw-auth@lists.zend.com">fw-auth@lists.zend.com</ulink>.
52 <!--
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>
58             .
59 -->
60         </para>
62         <para>
63             "Автоматическое" конфигурипрование этой компоненты с использованием
64             Zend_Config_Ini:
65 <!--
66             To "automatically" configure this component using an ".ini" file with Zend_Config_Ini:
67 -->
68             <example>
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>
75             </example>
76             Используемый файл "myapp.ini":
77 <!--
78             The corresponding "myapp.ini" file:
79 -->
80             <example>
81                 <title>myapp.ini</title>
82 <programlisting language="php">
83 <![CDATA[
84 ;  Настройки по умолчанию для производственного сервера
85 [live]
86 ; bug_compat_42
87 ; bug_compat_warn
88 ; cache_expire
89 ; cache_limiter
90 ; cookie_domain
91 ; cookie_lifetime
92 ; cookie_path
93 ; cookie_secure
94 ; entropy_file
95 ; entropy_length
96 ; gc_divisor
97 ; gc_maxlifetime
98 ; gc_probability
99 ; hash_bits_per_character
100 ; hash_function
101 ; имя должно быть уникальным для всех приложений, использующих
102 ; одно и то же доменное имя
103 name = UNIQUE_NAME
104 ; referer_check
105 ; save_handler
106 ; save_path
107 ; serialize_handler
108 ; use_cookies
109 ; use_only_cookies
110 ; use_trans_sid
112 ; remember_me_seconds = <integer seconds>
113 ; strict = on|off
115 ; Наш тестовый сервер использует те же настройки, что и наш
116 ; производственный сервер за исклочением тех, что переопределяются ниже:
117 [sandbox : live]
118 ; Не забудьте создать эту директорию и сделать ее доступной для чтения
119 ; и записи через PHP
120 save_path = /home/myaccount/zend_sessions/myapp
121 use_only_cookies = on
122 ; Когда индентификатор сессии сохраняется в куках, запрашивать TTL
123 ; через 10 дней
124 remember_me_seconds = 864000
125 ]]></programlisting>
126             </example>
127         </para>
129     </sect2>
131     <sect2 id="zend.session.options">
133         <title>Опции<!--Options--></title>
135         <para>
136             Большинство опций, указанных ниже, не нуждается в дополнительных
137             комментариях сверх того, что написано в стандартной документации по
138             PHP.
139 <!--
140             Most options shown above need no explanation beyond that found in the standard PHP documentation.
142             <itemizedlist mark='opencircle'>
143                 <listitem>
144                     <para>
145                         boolean <code>strict</code> - отключает автоматический
146                         запуск <code>Zend_Session</code> при использовании
147                         <code>new Zend_Session_Namespace()</code>.
148 <!--
149                         boolean <code>strict</code> - disables automatic starting of <code>Zend_Session</code> when
150                         using <code>new Zend_Session_Namespace()</code>.
152                     </para>
153                 </listitem>
154                 <listitem>
155                     <para>
156                         integer <code>remember_me_seconds</code> - время
157                         хранения идентификатора сессии в куках после того, как
158                         агент пользователя завершит свою работу (т.е. когда окно
159                         броузера будет закрыто).
160 <!--
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)
164                     </para>
165                 </listitem>
166                 <listitem>
167                     <para>
168                         string <code>save_path</code> - корректное значение
169                         зависит от системы и должно указываться разработчиком с
170                         использованием <emphasis>абсолютного
171                         пути</emphasis> к директории, доступной для чтения и
172                         записи процессом PHP. Если директория на заданном пути
173                         не существует или недоступна, то
174                         <code>Zend_Session</code> бросает исключение во время
175                         старта (т.е. когда вызывается метод
176                         <code>start()</code>)
177 <!--
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).
183                     </para>
184                     <note>
185                         <title>Угроза безопасности<!--Security Risk--></title>
186                         <para>
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                             удаление файлов сессий вашего приложения).
199 <!--
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).
208                         </para>
209                         <para>
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                             изменено на секретное значение, уникальное для
230                             каждого приложения.
231 <!--
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
243                             application.
245                         </para>
246                     </note>
247                 </listitem>
248                 <listitem>
249                     <para>
250                         string <code>name</code> - корректное значение зависит
251                         от системы и должно устанавливаться разработчиком, с
252                         использованием короткого значения,
253                         <emphasis>уникального</emphasis> для
254                         приложения ZF.
255 <!--
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
258                         application.
260                     </para>
261                     <note>
262                         <title>Угроза безопасности<!--Security Risk--></title>
263                         <para>
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                             может привести к разрушению данных сессий.
273 <!--
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.
281                         </para>
282                     </note>
283                 </listitem>
284                 <listitem>
285                     <para>
286                         boolean <code>use_only_cookies</code> - во избежание
287                         появления дополнительных угроз безопасности не изменяйте
288                         значение, принятое по умолчанию для этой опции, на
289                         другое.
290 <!--
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.
294                         <note>
295                             <title>Угроза безопасности<!--Security Risk--></title>
296                             <para>
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                                 эмулируя агента жертвы.
308 <!--
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
315                                 user agent.
317                             </para>
318                         </note>
319                     </para>
320                 </listitem>
321             </itemizedlist>
322         </para>
324     </sect2>
326     <sect2 id="zend.session.regenerateid">
328         <title>regenerateId()</title>
330         <sect3 id="zend.session.regenerateid.intro">
332             <title>Введение: идентификаторы сессий<!--Introduction: Session Identifiers--></title>
334             <para>
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                 попеременно использовать "агент пользователя" и "веб-броузер".
354 <!--
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.
368             </para>
370             <para>
371                 Почему?: Если атакующий получил валидный идентификатор сессии,
372                 то он может имитировать реального пользователя (жертву) и затем
373                 получить доступ к конфиденциальной информации или манипулировать
374                 данными жертвы через ваше приложение. Изменение идентификатора
375                 сессии помогает защитить пользователя от угона сессии. Если
376                 идентификатор сессии был изменен и атакующий не знает его новое
377                 значение, то он не может использовать новый идентификатор сессии
378                 в своей попытке угона сессии посетителя. Даже если атакующий
379                 получил доступ к старому идентификатору сессии, то
380                 <code>regenerateId()</code> перемещает данные сессии со старого
381                 идентификатора на новый, и поэтому данные этой сессии не будут
382                 доступны через старый идентификатор.
383 <!--
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.
392             </para>
394             <para>
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>.
418 <!--
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>.
432             </para>
434         </sect3>
436         <sect3 id="zend.session.regenerateid.details">
438             <title>Угон и фиксация сессии<!--Session Hijacking and Fixation--></title>
440             <para>
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>.
466 <!--
467                 Avoiding
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.
486             </para>
488             <para>
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>).
503 <!--
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>).
512             </para>
514             <para>
515                 Если вы можете различать атакующего и жертву, использующих один
516                 и тот же идентификатор сессии, то это может решить проблему
517                 увода сессии. Тем не менее, такое распознавание обычно
518                 принуждает к поиску компромисса с юзабилити, т.к. методы
519                 различения нередко являются неточными. Для примера, если запрос
520                 получен с IP в стране, отличающейся от IP запроса, при котором
521                 была создана сессия, то это может означать, что новый запрос
522                 производится уже атакующим. При выполнении следующих условий
523                 приложение сайта не сможет различить жертву и атакующего:
524 <!--
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'>
533                     <listitem>
534                         <para>
535                             - атакующий первый иницировал сессию на вашем сайте для получения валидного идентификатора сессии
536 <!--
537                             - attacker first initiates a session on your website to obtain a valid session id
539                         </para>
540                     </listitem>
541                     <listitem>
542                         <para>
543                             - атакующий использует XSS-уязвимость на вашем сайте для создания куки в броузере жертвы с валидным идентификатором сессии (т.е. фиксация сессии)
544 <!--
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)
548                         </para>
549                     </listitem>
550                     <listitem>
551                         <para>
552                             - атакующий и его жертва заходят через одну и ту же группу прокси-серверов (например, оба находятся за одним и тем же файрволом в большой компании - такой, как AOL)
553 <!--
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)
557                         </para>
558                     </listitem>
559                 </itemizedlist>
561                 Пример кода ниже намного затрудняет получение атакующим текущего идентификатора сессии жертвы, за исключением тех случаев, когда атакующий уже выполнил первые два шага из приведенных выше.
562 <!--
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.
566             </para>
568             <example>
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>
580             </example>
582         </sect3>
584     </sect2>
586     <sect2 id="zend.session.rememberme">
588         <title>rememberMe(integer $seconds)</title>
590         <para>
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             выполнило "регистрацию"
605 <!--
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".
614         </para>
616     </sect2>
618     <sect2 id="zend.session.forgetme">
620         <title>forgetMe()</title>
622         <para>
623             Эта функция является дополнением к <code>rememberMe()</code>.
624             Она возвращает сессионную куку к тому состоянию, при котором ее
625             время жизни завершается в тот момент, когда агент пользователя
626             завершает сеанс работы (например, пользователь закрыл окно своего
627             броузера).
628 <!--
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).
632         </para>
634     </sect2>
636     <sect2 id="zend.session.sessionexists">
638         <title>sessionExists()</title>
640         <para>
641             Используйте этот метод для определения того, есть ли уже сессия для
642             текущего агента пользователя/запроса. Он может использоваться до
643             старта сессии и независимо от всех других методов Zend_Session и
644             Zend_Session_Namespace.
645 <!--
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.
649         </para>
651     </sect2>
653     <sect2 id="zend.session.destroy">
655         <title>destroy(bool $remove_cookie = true, bool $readonly = true)</title>
657         <para>
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.
669 <!--
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).
677         </para>
679         <note>
680             <title>Исключения<!--Throws--></title>
681             <para>
682                 По умолчанию <varname>$readonly</varname> установлен в
683                 <constant>TRUE</constant> и дальнейшие действия, подразумевающие запись
684                 в хранилище данных сессии, вызовут генерацию исключения.
685 <!--
686                 By default, <varname>$readonly</varname> is enabled and further actions involving writing to the session data
687                 store will throw an error.
689             </para>
690         </note>
692     </sect2>
694     <sect2 id="zend.session.stop">
696         <title>stop()</title>
698         <para>
699             Этот метод не делает ничего, кроме переключения флага в
700             Zend_Session для предотвращения дальнейшей записи в хранилище
701             данных сессии (т.е.<varname>$_SESSION</varname>). Одним из вариантов его
702             использования является временное отключение возможности записи в
703             хранилище данных сессии через экземпляры
704             <code>Zend_Session_Namespace</code> или методы
705             <code>Zend_Session</code> во время выполнения кода,
706             связанного с отображением вида.
707             Попытка выполнить действия, подразумевающие запись через эти
708             экземпляры или методы вызовет генерацию исключения.
709 <!--
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.
717         </para>
719     </sect2>
721     <sect2 id="zend.session.writeClose">
723         <title>writeClose($readonly = true)</title>
725         <para>
726             Закрывает сессию, завершает запись и отсоединяет $_SESSION от
727             средства хранения на сервере. Это завершит внутреннее преобразование
728             данных для данного запроса. Необязательный параметр булевого типа
729             $readonly позволяет отключить возможность записи (т.е. генерация
730             исключения при попытке записи через любые методы
731             Zend_Session_Namespace или Zend_Session).
732 <!--
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).
737         </para>
739         <note>
740             <title>Исключения<!--Throws--></title>
741             <para>
742                 По умолчанию <varname>$readonly</varname> включен и дальнейшие
743                 действия, подразумевающие запись в хранилище данных сессии,
744                 вызовут генерацию исключения.
745 <!--
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.
751             </para>
752         </note>
754     </sect2>
756     <sect2 id="zend.session.expiresessioncookie">
758         <title>expireSessionCookie()</title>
760         <para>
761             Этот метод отправляет куку с уже истекшим временем действия, что
762             вызывает удаление сессионной куки в агенте пользователя. Иногда этот
763             метод используется для выхода из системы со стороны клиента.
764 <!--
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.
768         </para>
770     </sect2>
772     <sect2 id="zend.session.savehandler">
774         <title>setSaveHandler(Zend_Session_SaveHandler_Interface $interface)</title>
776         <para>
777             Большинство разработчиков находят достаточным использовать принятый
778             по умолчанию механизм хранения сессионных данных.
779             Этот метод предоставляет объектно-ориентированную обертку для <code>
780             <ulink url="http://php.net/session_set_save_handler">session_set_save_handler()</ulink>
781             </code>.
782 <!--
783             Most developers will find the default save handler sufficient. This method provides an object-oriented
784             wrapper for <code>
785             <ulink url="http://php.net/session_set_save_handler">session_set_save_handler()</ulink>
786             </code>.
788         </para>
790     </sect2>
792     <sect2 id="zend.session.namespaceisset">
794         <title>namespaceIsset($namespace)</title>
796         <para>
797             Используйте этот метод для определения того, существует ли
798             пространство имен с данным именем или определенный индекс в данном
799             пространстве имен.
800 <!--
801             Use this method to determine if a session namespace exists, or if a particular index exists in a particular
802             namespace.
804         </para>
806         <note>
807             <title>Исключения<!--Throws--></title>
808             <para>
809                 Если Zend_Session не был помечен как доступный для чтения
810                 (например, до того, как Zend_Session был запущен), то будет
811                 сгенерировано исключение.
812 <!--
813                 An error will be thrown if Zend_Session is not marked as readable (e.g. before Zend_Session
814                 has been started).
816             </para>
817         </note>
819     </sect2>
821     <sect2 id="zend.session.namespaceunset">
823         <title>namespaceUnset($namespace)</title>
825         <para>
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.
839 <!--
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>
848             in the PHP manual.
850         </para>
852         <note>
853             <title>Исключения<!--Throws--></title>
854             <para>
855                 Если пространство имен недоступно для записи (например, после
856                 <code>destroy()</code>), то будет сгенерировано исключение.
857 <!--
858                 An error will be thrown if the namespace is not writable (e.g. after <code>destroy()</code>).
860             </para>
861         </note>
863     </sect2>
865     <sect2 id="zend.session.namespaceget">
867         <title>namespaceGet($namespace)</title>
869         <para>
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             Участие в связанных темах также приветствуется :)
878 <!--
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 :)
885         </para>
887         <note>
888             <title>Исключения<!--Throws--></title>
889             <para>
890                 Если Zend_Session не был помечен как доступный для чтения
891                 (например, до того, как Zend_Session был запущен), то будет
892                 сгенерировано исключение.
893 <!--
894                 An error will be thrown if Zend_Session is not marked as readable (e.g. before Zend_Session
895                 has been started).
897             </para>
898         </note>
900     </sect2>
902     <sect2 id="zend.session.getiterator">
904         <title>getIterator()</title>
906         <para>
907             Используйте метод <code>getIterator()</code> для получения массива,
908             содержащего имена всех пространств имен, и с которым можно
909             производить итерации.
910 <!--
911             Use <code>getIterator()</code> to obtain an iterable array containing the names of all namespaces.
913         </para>
915         <example>
916             <title>Уничтожение всех пространств имен<!--Unsetting All Namespaces--></title>
917 <programlisting language="php"><![CDATA[<?php
918 foreach(Zend_Session::getIterator() as $space) {
919     try {
920         $core->namespaceUnset($space);
921     } catch (Zend_Session_Exception $e) {
922         return; // possible if Zend_Session::stop() has been executed
923     }
926 ?>]]></programlisting>
927         </example>
929         <note>
930             <title>Исключения<!--Throws--></title>
931             <para>
932                 Если Zend_Session не был помечен как доступный для чтения
933                 (например, до того, как Zend_Session был запущен), то будет
934                 сгенерировано исключение.
935 <!--
936                 An error will be thrown if Zend_Session is not marked as readable (e.g. before Zend_Session
937                 has been started).
939             </para>
940         </note>
942     </sect2>
944 </sect1>