-
Notifications
You must be signed in to change notification settings - Fork 39
/
session-regenerate-id.xml
228 lines (204 loc) · 7.65 KB
/
session-regenerate-id.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: a0ae28d3bc85f927c22649ebd9a590b921534b7d Maintainer: samesch Status: ready -->
<!-- Reviewed: yes Maintainer: samesch -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="function.session-regenerate-id">
<refnamediv>
<refname>session_regenerate_id</refname>
<refpurpose>Ersetzt die aktuelle Session-ID durch eine neu erzeugte</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>bool</type><methodname>session_regenerate_id</methodname>
<methodparam choice="opt"><type>bool</type><parameter>delete_old_session</parameter><initializer>&false;</initializer></methodparam>
</methodsynopsis>
<para>
Die Funktion <function>session_regenerate_id</function> ersetzt die
aktuelle Session-ID durch eine neue und übernimmt die aktuellen
Session-Informationen.
</para>
<para>
Wenn <link linkend="ini.session.use-trans-sid">session.use_trans_sid</link>
aktiviert ist, darf die Ausgabe erst nach dem Aufruf von
<function>session_regenerate_id</function> beginnen. Andernfalls wird die
alte Session-ID verwendet.
</para>
<warning>
<para>
Zurzeit kann session_regenerate_id nicht gut mit unstabilen Netzwerken,
&zb; Mobil- und WiFi-Netzwerke, umgehen. Daher kann es zu verlorenen
Sessions kommen, wenn session_regenerate_id aufgerufen wird.
</para>
<para>
Die alten Session-Daten sollten nicht sofort zerstört werden, sondern es
sollte ein Destroy-Zeitstempel verwendet werden und der Zugriff auf die
alte Session-ID sollte kontrolliert werden. Andernfalls kann ein
konkurrierender Zugriff auf die Seite möglicherweise zu einem
inkonsistenten Zustand führen, oder die Session kann gänzlich verloren
werden, oder es kann sich eine Race-Condition im Client (Browser) ergeben
und viele Session-IDs könnten nutzlos erzeugt werden. Die sofortige
Löschung der Session-Daten verhindert die Erkennung von
Session-Hijack-Angriffen und auch deren Vorbeugung.
</para>
</warning>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>delete_old_session</parameter></term>
<listitem>
<para>
Legt fest, ob die zugehörige alte Session-Datei gelöscht werden soll
oder nicht. Die alten Session-Daten sollten nicht gelöscht werden,
wenn Race-Conditions, die durch die Löschung verursacht werden,
verhindert, oder Session-Hijack-Angriffe erkannt oder vermieden werden
müssen.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
&return.success;
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>Ein <function>session_regenerate_id</function>-Beispiel</title>
<programlisting role="php">
<![CDATA[
<?php
// ACHTUNG: dieser Code ist nicht voll funktionsfähig, sondern dient nur als Beispiel!
session_start();
// Prüfe den Destroy-Zeitstempel
if (isset($_SESSION['destroyed'])
&& $_SESSION['destroyed'] < time() - 300) {
// Dies sollte normalerweise nicht passieren. Es könnte durch einen Angriff
// oder ein unstabiles Netzwerk verursacht worden sein.
// Entferne den Authentifizierungsstatus dieser Nutzer-Session.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new DestroyedSessionAccessException);
}
$old_sessionid = session_id();
// Lege den Destroy-Zeitstempel fest
$_SESSION['destroyed'] = time(); // session_regenerate_id() speichert die
// alten Session-Daten
// Der einfache Aufruf von session_regenerate_id() kann in einer verlorenen
// Session resultieren, etc. Siehe das nächste Beispiel.
session_regenerate_id();
// Die neue Session braucht keinen Destroy-Zeitstempel
unset($_SESSION['destroyed']);
$new_sessionid = session_id();
echo "Alte Session: $old_sessionid<br />";
echo "Neue Session: $new_sessionid<br />";
print_r($_SESSION);
?>
]]>
</programlisting>
</example>
</para>
<para>
Zurzeit kann das Session-Modul nicht gut mit unstabilen Netzwerken umgehen.
Die Session-ID sollte selbst verwaltet werden, um verlorene Sessions durch
session_regenarate_id zu verhindern.
</para>
<para>
<example>
<title>Verhindern von verlorenen Sessions durch <function>session_regenerate_id</function></title>
<programlisting role="php">
<![CDATA[
<?php
// ACHTUNG: dieser Code ist nicht voll funktionsfähig, sondern dient nur als Beispiel!
// my_session_start() und my_session_regenerate_id() verhindern verlorene Session
// durch unstabile Netzwerke. Zusätzlich kann dieser Code dem Ausnutzen einer
// gestohlenen Session durch Angreifer vorbeugen.
function my_session_start() {
session_start();
if (isset($_SESSION['destroyed'])) {
if ($_SESSION['destroyed'] < time()-300) {
// Dies sollte normalerweise nicht passieren. Es könnte durch einen Angriff
// oder ein unstabiles Netzwerk verursacht worden sein.
// Entferne den Authentifizierungsstatus dieser Nutzer-Session.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new DestroyedSessionAccessException);
}
if (isset($_SESSION['new_session_id'])) {
// Noch nicht vollständig abgelaufen. Könnte an einem verlorenen Cookie
// durch ein unstabiles Netzwerk liegen.
// Noch einmal versuchen, das ordnungsgemäße Session-ID-Cookie zu setzen.
// ACHTUNG: es sollte nicht versucht werden, die Session-ID erneut
// festzulegen, wenn das Authentifizierungsflag entfernt werden soll.
session_commit();
session_id($_SESSION['new_session_id']);
// Die neue Session-ID sollte existieren
session_start();
return;
}
}
}
function my_session_regenerate_id() {
// Eine neue Session-ID wird benötigt, um die richtige Session-ID festzulegen,
// wenn die Session-ID aufgrund eines unstabilen Netzwerks nicht gesetzt wurde.
$new_session_id = session_create_id();
$_SESSION['new_session_id'] = $new_session_id;
// Lege den Destroy-Zeitstempel fest
$_SESSION['destroyed'] = time();
// Schreibe und schließe die aktuelle Session
session_commit();
// Starte die Session mit einer neuen Session-ID
session_id($new_session_id);
ini_set('session.use_strict_mode', 0);
session_start();
ini_set('session.use_strict_mode', 1);
// Die neue Session braucht sie nicht
unset($_SESSION['destroyed']);
unset($_SESSION['new_session_id']);
}
?>
]]>
</programlisting>
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>session_id</function></member>
<member><function>session_create_id</function></member>
<member><function>session_start</function></member>
<member><function>session_destroy</function></member>
<member><function>session_reset</function></member>
<member><function>session_name</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->