-
Notifications
You must be signed in to change notification settings - Fork 41
/
examples.xml
303 lines (295 loc) · 11 KB
/
examples.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
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 184f3f7bd45643cb80f828d0bb001991ec3a5fad Maintainer: samesch Status: ready -->
<!-- Reviewed: yes -->
<!-- Rev-Revision: 184f3f7bd45643cb80f828d0bb001991ec3a5fad Reviewer: samesch -->
<appendix xml:id="session.examples" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
&reftitle.examples;
<section xml:id="session.examples.basic">
<title>Grundlegende Anwendung</title>
<para>
Sessions bieten eine einfache Möglichkeit, Daten für individuelle Benutzer
unter einer eindeutigen Session-ID zu speichern. Sie können verwendet
werden, damit Daten zwischen Seitenanforderungen bestehen bleiben.
Session-IDs werden in der Regel über Session-Cookies an den Browser
gesendet und die ID wird verwendet, um vorhandene Session-Daten abzurufen.
Wenn es keine ID oder kein Session-Cookie gibt, wird PHP veranlasst, eine
neue Session zu erstellen und eine neue Session-ID zu erzeugen.
</para>
<para>
Sessions folgen einem einfachen Ablauf. Wenn eine Session gestartet wird,
ruft PHP entweder eine vorhandene Session unter Verwendung einer
(normalerweise von einem Session-Cookie) übergebenen ID ab oder erzeugt
eine neue Session, falls keine Session-ID übergeben wurde. Nachdem
die Session gestartet wurde, füllt PHP die
<varname>$_SESSION</varname>-Superglobale mit allen Session-Daten. Am Ende
des Skripts nimmt PHP automatisch den Inhalt der
<varname>$_SESSION</varname>-Superglobalen, serialisiert ihn und verwendet
die Session-Speicherroutine um ihn zu speichern.
</para>
<para>
Standardmäßig verwendet PHP die interne
<parameter>files</parameter>-Speicherroutine, die mittels
<link linkend="ini.session.save-handler">session.save_handler</link>
festgelegt ist. Diese speichert die Session-Daten auf dem Server an der mit
der Konfigurationsanweisung
<link linkend="ini.session.save-path">session.save_path</link> angegebenen
Stelle.
</para>
<para>
Sessions können über die Funktion <function>session_start</function>
gestartet werden. Falls die Konfigurationsanweisung
<link linkend="ini.session.auto-start">session.auto_start</link> auf
<parameter>1</parameter> gesetzt ist, wird eine Session automatisch zu
Beginn einer Anfrage gestartet.
</para>
<para>
Sessions werden normalerweise automatisch geschlossen, wenn PHP am Ende
eines Skripts ist, können aber über
<function>session_write_close</function> auch manuell geschlossen werden.
</para>
<para>
<example>
<title>
Registrierung einer Variablen mit <varname>$_SESSION</varname>.
</title>
<programlisting role="php">
<![CDATA[
<?php
session_start();
if (!isset($_SESSION['zaehler'])) {
$_SESSION['zaehler'] = 0;
} else {
$_SESSION['zaehler']++;
}
?>
]]>
</programlisting>
</example>
<example>
<title>
Aufheben der Registrierung einer Variablen mit
<varname>$_SESSION</varname>.
</title>
<programlisting role="php">
<![CDATA[
<?php
session_start();
unset($_SESSION['zaehler']);
?>
]]>
</programlisting>
</example>
</para>
<para>
<caution>
<para>
Die Variable <varname>$_SESSION</varname> selbst darf NICHT mit
<literal>unset($_SESSION)</literal> gelöscht werden, da dies die
Registrierung von Session-Variablen über die Superglobale
<varname>$_SESSION</varname> deaktivieren würde.
</para>
</caution>
</para>
<warning>
<para>
In Session-Variablen können keine Referenzen verwendet werden, weil es
keine praktikable Möglichkeit gibt, eine Referenz in eine andere Variable
zurückzuführen.
</para>
</warning>
<note>
<para>
Bei dateibasierten Sessions (der Standard in PHP) wird die Session-Datei
gesperrt, wenn eine Session über <function>session_start</function> oder
implizit über
<link linkend="ini.session.auto-start">session.auto_start</link> geöffnet
wurde. Einmal gesperrt, kann solange kein anderes Skript auf dieselbe
Session-Datei zugreifen, bis die Session durch Beenden des ersten Skripts
oder durch den Aufruf von <function>session_write_close</function>
geschlossen wurde.
</para>
<para>
Dies ist wahrscheinlich ein Problem auf Websites, die verstärkt AJAX
verwenden und mehrere gleichzeitige Zugriffe haben. Der einfachste Weg,
damit umzugehen, ist, <function>session_write_close</function> möglichst
früh im Skript aufzurufen, sobald alle nötigen Änderungen an der Session
vorgenommen wurden. Alternativ könnte ein Session-Backend verwendet
werden, das gleichzeitige Zugriffe unterstützt.
</para>
</note>
</section>
<section xml:id="session.idpassing">
<title>Übermittlung der Session-ID</title>
<para>
Es gibt zwei Methoden, eine Session-ID zu übermitteln:
<itemizedlist>
<listitem>
<simpara>
Cookies
</simpara>
</listitem>
<listitem>
<simpara>
URL-Parameter
</simpara>
</listitem>
</itemizedlist>
</para>
<para>
Das Session-Modul unterstützt beide Methoden. Cookies sind optimal, aber da
sie nicht immer zur Verfügung stehen, bieten wir auch noch eine Alternative
an. Die zweite Methode hängt die Session-ID direkt an die URLs.
</para>
<para>
PHP ist in der Lage, Links transparent umzuwandeln. Ist die Laufzeit-Option
<literal>session.use_trans_sid</literal> aktiviert, werden relative
URIs automatisch so geändert, dass sie die Session-ID enthalten.
<note>
<para>
Die &php.ini;-Anweisung
<link linkend="ini.arg-separator.output">arg_separator.output</link>
ermöglicht es, die Trennung von Argumenten anzupassen. Um die volle
XHTML-Konformität zu gewährleisten, muss dort &amp; angegeben werden.
</para>
</note>
</para>
<para>
Alternativ kann die Konstante <constant>SID</constant> verwendet werden,
die definiert ist, nachdem die Session gestartet wurde. Falls der Client
kein geeignetes Session-Cookie gesendet hat, hat sie die Form
<literal>session_name=session_id</literal>. Andernfalls wird sie zu einer
leeren Zeichenkette erweitert. Aus diesem Grund kann sie bedingungslos in
URLs eingebettet werden.
</para>
<para>
Das folgende Beispiel demonstriert, wie eine Variable registriert wird und
wie unter Verwendung einer <constant>SID</constant> korrekt auf eine andere
Seite verwiesen wird.
<example>
<title>Zählen der Seitenaufrufe eines einzelnen Benutzers</title>
<programlisting role="php">
<![CDATA[
<?php
session_start();
if (empty($_SESSION['zaehler'])) {
$_SESSION['zaehler'] = 1;
} else {
$_SESSION['zaehler']++;
}
?>
<p>
Hallo Besucher, Sie haben diese Seite <?php echo $_SESSION['zaehler']; ?> mal
aufgerufen.
</p>
<p>
Hier gehts
<a href="nextpage.php?<?php echo htmlspecialchars(SID); ?>">weiter</a>.
</p>
]]>
</programlisting>
</example>
</para>
<para>
Die Funktion <function>htmlspecialchars</function> kann dazu verwendet
werden, um bei der Ausgabe der <constant>SID</constant> XSS-ähnliche
Angriffe zu verhindern.
</para>
<para>
Die oben gezeigte Ausgabe der <constant>SID</constant> ist nicht nötig,
wenn PHP mit
<link linkend="ini.session.use-trans-sid">--enable-trans-sid</link>
übersetzt wurde.
</para>
<note>
<para>
Bei nichtrelativen URLs wird davon ausgegangen, dass sie auf externe
Seiten zeigen und deshalb keine <constant>SID</constant> angehängt, weil
es ein Sicherheitsrisiko wäre, die <constant>SID</constant> an einen
anderen Server zu übermitteln.
</para>
</note>
</section>
<section xml:id="session.customhandler">
<title>Individuelle Session-Routinen</title>
<para>
Wenn die Speicherung in einer Datenbank oder irgendeine andere Art der
Speicherung implementiert werden soll, kann
<function>session_set_save_handler</function> verwendet werden, um eine
Reihe benutzerdefinierte Speicherfunktionen zu erstellen. Mit dem
<classname>SessionHandlerInterface</classname> können Session-Routinen
erstellt werden oder PHP-interne Routinen durch Beerbung von
<classname>SessionHandler</classname> erweitert werden.
</para>
<para>
Die in <function>session_set_save_handler</function> definierten
Callback-Funktionen sind Methoden, die von PHP während des Lebenszyklus
einer Session aufgerufen werden: <parameter>open</parameter>,
<parameter>read</parameter>, <parameter>write</parameter> und
<parameter>close</parameter> und für Verwaltungsaufgaben:
<parameter>destroy</parameter> um eine Session zu löschen und
<parameter>gc</parameter> für die regelmäßige Speicherbereinigung.
</para>
<para>
Deshalb benötigt PHP immer Session-Speicherroutinen. Der Standard ist
normalerweise die interne 'files'-Speicherroutine. Eine benutzerdefinierte
Speicherroutine kann mittels <function>session_set_save_handler</function>
erstellt werden. Alternative interne Speicherroutinen werden auch von
PHP-Erweiterungen, &zb; <parameter>sqlite</parameter>,
<parameter>memcache</parameter> und <parameter>memcached</parameter> zur
Verfügung gestellt und können mittels
<link linkend="ini.session.save-handler">session.save_handler</link>
festgelegt werden.
</para>
<para>
Wenn die Session beginnt, ruft PHP intern die
<parameter>open</parameter>-Routine, gefolgt vom
<parameter>read</parameter>-Callback auf, der eine verschlüsselte
Zeichenkette genau so zurückgeben sollte, wie sie ursprünglich für die
Speicherung übergeben wurde. Nachdem der
<parameter>read</parameter>-Callback die verschlüsselte Zeichenkette
zurückgegeben hat, wird sie von PHP entschlüsselt und die Superglobale
<varname>$_SESSION</varname> mit dem resultierenden Array gefüllt.
</para>
<para>
Wenn das PHP-Skript endet (oder wenn
<function>session_write_close</function> aufgerufen wird), wird die
Superglobale <varname>$_SESSION</varname> intern verschlüsselt und zusammen
mit der Session-ID an den <parameter>write</parameter>-Callback übergeben.
Nach dem <parameter>write</parameter>-Callback ruft PHP intern den
<parameter>close</parameter>-Callback auf.
</para>
<para>
Wenn eine Session gelöscht werden soll, ruft PHP die
<parameter>destroy</parameter>-Routine mit der Session-ID auf.
</para>
<para>
Von Zeit zu Zeit ruft PHP den <parameter>gc</parameter>-Callback auf, um
Sessions zu löschen, die entsprechend ihrer eingestellten maximalen
Lebensdauer abgelaufen sind. Diese Routine sollte alle gespeicherten
Datensätze löschen, auf die länger als die in
<parameter>$lifetime</parameter> festgelegte Zeitspanne nicht mehr
zugegriffen wurde.
</para>
</section>
</appendix>
<!-- 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
-->