mirror of
https://github.com/php/doc-de.git
synced 2026-03-29 10:42:12 +02:00
git-svn-id: https://svn.php.net/repository/phpdoc/de/trunk@171710 c90b9560-bf6c-de11-be94-00142212c4b1
468 lines
17 KiB
XML
468 lines
17 KiB
XML
<?xml version="1.0" encoding="iso-8859-1"?>
|
|
<!-- $Revision: 1.28 $ -->
|
|
<!-- EN-Revision: 1.50 Maintainer: samesch Status: ready -->
|
|
<reference id="ref.session">
|
|
<title>Session Funktionen</title>
|
|
<titleabbrev>Sessions</titleabbrev>
|
|
|
|
<partintro>
|
|
|
|
<section id="session.intro">
|
|
&reftitle.intro;
|
|
<para>
|
|
Die Unterstützung von Sessions in PHP bietet die Möglichkeit, bestimmte
|
|
Daten während einer Folge von Aufrufen Ihrer Website festzuhalten. Damit
|
|
können Sie persönlichere Applikationen erstellen und Ihre Website
|
|
ansprechender gestalten.
|
|
</para>
|
|
<para>
|
|
Einem Besucher wird beim Aufruf Ihrer Website eine eindeutige ID, die
|
|
sogenannte Session-ID, zugeordnet. Diese wird entweder benutzerseitig in
|
|
einem Cookie abgelegt oder in der URL übermittelt.
|
|
</para>
|
|
<para>
|
|
Die Unterstützung von Sessions erlaubt Ihnen, eine beliebige Anzahl von
|
|
Variablen zu registrieren und diese über Anfragen hinweg zu erhalten.
|
|
Wenn ein Besucher Ihre Website aufruft, überprüft PHP automatisch (falls
|
|
<link linkend="ini.session.auto-start">session.auto_start</link> auf 1
|
|
gesetzt ist) oder auf Anfrage (explizit durch
|
|
<function>session_start</function> oder implizit durch
|
|
<function>session_register</function>), ob mit der Anfrage schon eine
|
|
bestimmte Session-ID gesendet wurde. Wenn dies der Fall ist, wird die
|
|
zuvor gespeicherte Umgebung wiederhergestellt.
|
|
</para>
|
|
<caution>
|
|
<para>
|
|
Falls Sie <link
|
|
linkend="ini.session.auto-start">session.auto_start</link> aktivieren,
|
|
können Sie keine Objekte in Ihre Session aufnehmen, weil die Definition
|
|
der Klasse vor dem Start der Session geladen werden muss, damit die
|
|
Objekte in Ihrer Session wiederhergestellt werden.
|
|
</para>
|
|
</caution>
|
|
<para>
|
|
Alle registrierten Variablen werden serialisiert, nachdem die Anfrage
|
|
beendet ist. Registrierte Variablen, die nicht definiert sind, werden als
|
|
nicht definiert gekennzeichnet. Auch bei darauffolgenden Zugriffen werden
|
|
sie nicht vom Session-Modul definiert, außer der Benutzer definiert sie
|
|
später.
|
|
</para>
|
|
<warning>
|
|
<para>
|
|
Einige Datentypen können nicht serialisiert werden, um in Sessions
|
|
gespeichert zu werden. Dazu gehören <type>resource</type>-Variablen oder
|
|
Objekte mit Ringreferenzen (d.h. Objekte, die eine Referenz auf sich
|
|
selbst an andere Objekte übergeben).
|
|
</para>
|
|
</warning>
|
|
<note>
|
|
<para>
|
|
Die Behandlung von Sessions wurde in PHP 4.0 eingeführt.
|
|
</para>
|
|
</note>
|
|
<note>
|
|
<para>
|
|
Bitte beachten Sie beim Arbeiten mit Sessions, dass der Datensatz einer
|
|
Session nicht angelegt wird, bevor eine Variable mit der Funktion
|
|
<function>session_register</function> registriert oder dem superglobalen
|
|
Array <varname>$_SESSION</varname> ein neuer Schlüssel hinzugefügt wird.
|
|
Das gilt auch dann, wenn eine Session mit der Funktion
|
|
<function>session_start</function> gestartet wurde.
|
|
</para>
|
|
</note>
|
|
</section>
|
|
|
|
<section id="session.security">
|
|
<title>Sessions und Sicherheit</title>
|
|
<para>
|
|
Externe Links: <ulink url="&url.session-fixation;">Session
|
|
fixation</ulink>
|
|
</para>
|
|
<para>
|
|
Das Session-Modul bietet keine Garantie dafür, dass
|
|
Informationen, die Sie in einer Session speichern, nur vom
|
|
Benutzer gesehen werden können, der die Session erzeugt hat. Sie
|
|
müssen zusätzliche Maßnahmen ergreifen, um die Integrität der
|
|
Session ihrer Wichtigkeit entsprechend angemessen aktiv zu
|
|
schützen.
|
|
</para>
|
|
<para>
|
|
Schätzen Sie die Wichtigkeit der Daten ab, die in Ihren Sessions
|
|
transportiert werden und treffen Sie zusätzliche Schutzmaßnahmen
|
|
-- in der Regel bezahlen Sie dafür mit einer geringeren
|
|
Benutzerfreundlichkeit. Wenn Sie z.B. Benutzer vor einfachen
|
|
Social Engineering Tactics (Anm. des Übersetzers: Techniken der
|
|
Ausnutzung menschlicher Schwächen) schützen wollen, müssen Sie
|
|
<literal>session.use_only_cookies</literal> aktivieren. Cookies
|
|
müssen dann benutzerseitig auf jeden Fall aktiviert sein, weil
|
|
Sessions sonst nicht funktionieren.
|
|
</para>
|
|
<para>
|
|
Es gibt mehrere Wege, über die eine Sessio-ID an Dritte gelangen
|
|
kann. Eine entführte Session-ID ermöglicht diesen, auf alle Daten
|
|
zuzugreifen, die mit dieser Session-ID verbunden sind. Erstens
|
|
sind das URLs, die Session-IDs enthalten. Wenn Sie auf eine
|
|
externe Site verweisen, könnte die URL inklusive Session-ID in
|
|
den Referrer-Logs der externen Site gespeichert werden. Zweitens
|
|
kann ein aktiverer Angreifer Ihren Netzwerkverkehr abhören. Falls
|
|
Ihr Netzwerkverkehr nicht verschlüsselt ist, werden Session-IDs
|
|
im Klartext über das Netzwerk übertragen. Hier ist die Lösung,
|
|
auf Ihrem Server SSL zu implementieren und die Verwendung für
|
|
Ihre Benutzer obligatorisch zu machen.
|
|
</para>
|
|
</section>
|
|
|
|
<section id="session.requirements">
|
|
&reftitle.required;
|
|
&no.requirement;
|
|
<note>
|
|
<para>
|
|
Optional können Sie für die Speicherung von Sessions die von
|
|
Ralf S. Engelschall entwickelte Shared Memory Allocation (mm)
|
|
verwenden. Sie müssen dazu <ulink url="&url.mm;">mm</ulink>
|
|
herunterladen und installieren. Für Windows-Plattformen steht
|
|
diese Option nicht zur Verfügung. Beachten Sie, dass das
|
|
Sessionspeicherungs-Modul für mm nicht dafür garantiert, dass
|
|
gleichzeitige Zugriffe auf die selbe Session richtig gesperrt
|
|
sind. Die Verwendung eines auf Shared Memory basierenden
|
|
Dateisystems (wie z.B. tmpfs unter Solaris/Linux oder /dev/md
|
|
unter BSD) könnte für die Speicherung von Sessions in Dateien
|
|
geeigneter sein, weil sie entsprechend gesperrt sind.
|
|
</para>
|
|
</note>
|
|
</section>
|
|
|
|
&reference.session.configure;
|
|
|
|
&reference.session.ini;
|
|
|
|
<section id="session.resources">
|
|
&reftitle.resources;
|
|
&no.resource;
|
|
</section>
|
|
|
|
&reference.session.constants;
|
|
|
|
<section id="session.examples">
|
|
&reftitle.examples;
|
|
<note>
|
|
<para>
|
|
Seit PHP 4.1.0 steht <varname>$_SESSION</varname> genau wie
|
|
<varname>$_POST</varname>, <varname>$_GET</varname>,
|
|
<varname>$_REQUEST</varname> und so weiter, als globale Variable
|
|
zur Verfügung. Im Gegensatz zu
|
|
<varname>$HTTP_SESSION_VARS</varname> ist
|
|
<varname>$_SESSION</varname> immer global. Deshalb brauchen Sie
|
|
für <varname>$_SESSION</varname> nicht das Schlüsselwort <link
|
|
linkend="language.variables.scope"><command>global</command></link>
|
|
zu verwenden. Bitte beachten Sie, dass in dieser Dokumentation
|
|
nun überall <varname>$_SESSION</varname> verwendet wird. Sie
|
|
können <varname>$_SESSION</varname> durch
|
|
<varname>$HTTP_SESSION_VARS</varname> ersetzen, wenn Sie
|
|
Letzteres bevorzugen. Beachten Sie auch, dass Sie Ihre Session
|
|
mit <function>session_start</function> starten müssen, bevor die
|
|
Verwendung von <varname>$_SESSION</varname> zur Verfügung steht.
|
|
</para>
|
|
<para>
|
|
Für die Schlüssel des assoziativen
|
|
<varname>$_SESSION</varname>-Arrays gelten die selben
|
|
Beschränkungen, wie für die Bezeichnungen von regulären
|
|
Variablen in PHP, d.h. sie dürfen nicht mit einer Zahl, sondern
|
|
müssen mit einem Buchstaben oder Unterstrich beginnen. Um
|
|
weitere Deteils zu erhalten, siehe Abschnitt <link
|
|
linkend='language.variables'>Variablen</link>.
|
|
</para>
|
|
</note>
|
|
|
|
<para>
|
|
Falls <link
|
|
linkend="ini.register-globals">register_globals</link>
|
|
deaktiviert ist, können nur Bestandteile des globalen
|
|
assoziativen Arrays <varname>$_SESSION</varname> als
|
|
Session-Variablen registriert werden. Wiederhergestellte
|
|
Session-Variablen stehen nur im Array
|
|
<varname>$_SESSION</varname> zur Verfügung.
|
|
</para>
|
|
<para>
|
|
Aus Gründen der Verbesserung der Sicherheit und der Lesbarkeit
|
|
des Codes wird die Verwendung von <varname>$_SESSION</varname>
|
|
(oder <varname>$HTTP_SESSION_VARS</varname> bei PHP 4.0.6 oder
|
|
niedriger) empfohlen. Mit <varname>$_SESSION</varname> werden die
|
|
Funktionen <function>session_register</function>,
|
|
<function>session_unregister</function> und
|
|
<function>session_is_registered</function> nicht benötigt. Auf
|
|
die Session-Variablen kann wie auf jede normale Variable
|
|
zugegriffen werden.
|
|
<example>
|
|
<title>
|
|
Registrierung einer Variablen mit <varname>$_SESSION</varname>.
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
session_start();
|
|
// Verwenden Sie bei PHP 4.0.6 oder niedriger $HTTP_SESSION_VARS
|
|
if (!isset($_SESSION['zaehler'])) {
|
|
$_SESSION['zaehler'] = 0;
|
|
} else {
|
|
$_SESSION['zaehler']++;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
<example>
|
|
<title>
|
|
Aufheben der Registrierung einer Variablen mit
|
|
<varname>$_SESSION</varname> und deaktiviertem <link
|
|
linkend="ini.register-globals">register_globals</link>.
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
session_start();
|
|
// Verwenden Sie bei PHP 4.0.6 oder niedriger $HTTP_SESSION_VARS
|
|
unset($_SESSION['zaehler']);
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<caution>
|
|
<para>
|
|
Heben Sie NICHT die Registrierung der gesamten
|
|
<varname>$_SESSION</varname> mit <literal>unset($_SESSION)</literal>
|
|
auf, weil dies die Registrierung von Variablen durch die Superglobale
|
|
<varname>$_SESSION</varname> deaktivieren würde.
|
|
</para>
|
|
</caution>
|
|
</para>
|
|
<warning>
|
|
<para>
|
|
Sie können in Session-Variablen keine Referenzen verwenden, weil es
|
|
keine praktikable Möglichkeit gibt, eine Referenz in eine andere
|
|
Variable zurückzuführen.
|
|
</para>
|
|
</warning>
|
|
<para>
|
|
<example>
|
|
<title>
|
|
Aufheben der Registrierung einer Variablen mit aktiviertem
|
|
<link
|
|
linkend="ini.register-globals">register_globals</link>,
|
|
nachdem sie unter Verwendung von <varname>$_SESSION</varname>
|
|
registriert wurde.
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
session_start();
|
|
// Ab PHP 4.3, können Sie auch einfach das vorige Beispiel benutzen.
|
|
session_unregister('zaehler');
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
Wenn
|
|
<link
|
|
linkend="ini.register-globals">register_globals</link>
|
|
aktiviert ist, kann jede globalen Variable als Session-Variable
|
|
registriert werden. Beim Neustart einer Session werden diese
|
|
Variablen als entsprechende globale Variablen wiederhergestellt.
|
|
Da PHP wissen muss, welche globalen Variablen als
|
|
Session-Variablen registriert sind, muss der Benutzer Variablen
|
|
mit der Funktion <function>session_register</function>
|
|
registrieren. Sie können das vermeiden, indem Sie einfach
|
|
Einträge in <varname>$_SESSION</varname> setzen.
|
|
<caution>
|
|
<para>
|
|
Verwenden Sie nicht <function>session_register</function>,
|
|
<function>session_is_registered</function> und
|
|
<function>session_unregister</function>, wenn Sie
|
|
<varname>$_SESSION</varname> vor PHP 4.3 verwenden und <link
|
|
linkend="ini.register-globals">register_globals</link> deaktiviert ist.
|
|
</para>
|
|
<para>
|
|
Wenn Sie <link
|
|
linkend="ini.register-globals">register_globals</link>
|
|
aktivieren, sollten Sie <function>session_unregister</function>
|
|
verwenden, weil beim Deserialisieren von Session-Daten die
|
|
Session-Variablen als globale Variablen registriert werden. Die
|
|
Deaktivierung von <link
|
|
linkend="ini.register-globals">register_globals</link>
|
|
ist sowohl aus Sicherheitsgründen als auch wegen der
|
|
Performance empfehlenswert.
|
|
</para>
|
|
</caution>
|
|
<example>
|
|
<title>
|
|
Registrierung einer Variablen bei aktiviertem <link
|
|
linkend="ini.register-globals">register_globals</link>
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
if (! isset($_SESSION['zaehler'])) {
|
|
$_SESSION['zaehler'] = 1;
|
|
} else {
|
|
$_SESSION['zaehler']++;
|
|
}
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
Wenn <link
|
|
linkend="ini.register-globals">register_globals</link>
|
|
aktiviert ist, dann referenzieren die globalen Variablen und die
|
|
Einträge von <varname>$_SESSION</varname> automatisch die selben
|
|
Werte, die in der vorherigen Instanz der Session registriert
|
|
wurden.
|
|
</para>
|
|
<para>
|
|
Es gibt einen Fehler in PHP 4.2.3 und früheren Versionen. Wenn
|
|
Sie eine neue Session-Variable mittels
|
|
<function>session_register</function> registrieren,
|
|
referenzieren der Eintrag im globalen Bereich und der
|
|
<varname>$_SESSION</varname>-Eintrag bis zum nächsten
|
|
<function>session_start</function> nicht den selben Wert. D.h.
|
|
eine Änderung an der neu registrierten globalen Variablen wird
|
|
nicht vom <varname>$_SESSION</varname>-Eintrag widergespiegelt.
|
|
Dies wurde in PHP 4.3 korrigiert.
|
|
</para>
|
|
</section>
|
|
|
|
<section 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. Falls Sie
|
|
nicht PHP 4.2 oder höher verwenden, müssen Sie das beim
|
|
Übersetzen von PHP manuell aktivieren. Unter Unix müssen Sie dazu
|
|
configure mit <link linkend="ini.session.use-trans-sid">
|
|
--enable-trans-sid</link> aufrufen. Wenn diese Option und die
|
|
Laufzeit-Option <literal>session.use_trans_sid</literal>
|
|
aktiviert sind, 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. Geben
|
|
Sie dort für volle XHTML-Konformität &amp; an.
|
|
</para>
|
|
</note>
|
|
</para>
|
|
<para>
|
|
Alternativ können Sie die Konstante <literal>SID</literal>
|
|
verwenden, die immer definiert ist. 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 können
|
|
Sie sie bedingungslos in URLs einbetten.
|
|
</para>
|
|
<para>
|
|
Das folgende Beispiel demonstriert, wie eine Variable registriert
|
|
wird und wie unter Verwendung einer SID korrekt auf eine andere
|
|
Seite verwiesen wird.
|
|
<example>
|
|
<title>
|
|
Zählen der Seitenaufrufe eines einzelnen Benutzers
|
|
</title>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
if (!session_is_registered('zaehler')) {
|
|
session_register('zaehler');
|
|
$zaehler = 1;
|
|
} else {
|
|
$zaehler++;
|
|
}
|
|
?>
|
|
|
|
<p>
|
|
Hallo Besucher, Sie haben diese Seite <?php echo $zaehler; ?> Mal aufgerufen.
|
|
</p>
|
|
|
|
<p>
|
|
Hier gehts <A HREF="nextpage.php?<?php echo strip_tags(SID)?>">weiter</A>
|
|
</p>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
Die Funktion <function>strip_tags</function> wird verwendet, um
|
|
bei der Ausgabe der SID XSS-ähnliche Angriffe zu verhindern.
|
|
</para>
|
|
<para>
|
|
Die oben gezeigte Ausgabe der SID 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 SID angehängt, weil es
|
|
ein Sicherheitsrisiko wäre, die SID an einen anderen Server zu
|
|
übermitteln.
|
|
</para>
|
|
</note>
|
|
<para>
|
|
Wenn Sie die Speicherung in einer Datenbank oder irgendeine
|
|
andere Art der Speicherung realisieren wollen, können Sie
|
|
<function>session_set_save_handler</function> verwenden, um eine
|
|
Reihe von benutzerdefinierten Speicherfunktionen zu erzeugen.
|
|
</para>
|
|
</section>
|
|
</partintro>
|
|
|
|
&reference.session.functions;
|
|
|
|
</reference>
|
|
|
|
<!-- 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:"../../../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
|
|
-->
|