<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Develnet.org &#187; PHP Tutorials</title>
	<atom:link href="http://develnet.org/online/php-tutorials/feed" rel="self" type="application/rss+xml" />
	<link>http://develnet.org</link>
	<description>Code News Tricks und ein wenig Netzkultur</description>
	<lastBuildDate>Sat, 21 Aug 2010 18:41:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Was ist Fallback?</title>
		<link>http://develnet.org/was-ist-fallback.html</link>
		<comments>http://develnet.org/was-ist-fallback.html#comments</comments>
		<pubDate>Thu, 18 Jun 2009 20:47:05 +0000</pubDate>
		<dc:creator>Horno</dc:creator>
				<category><![CDATA[PHP Tutorials]]></category>

		<guid isPermaLink="false">http://develnet.org/?p=40</guid>
		<description><![CDATA[An dieser Stelle wurde eine Session-Fallback-Klasse propagiert, die den damals kaputten (Sommer 2000) PHP-Fallback umging. Diese Klasse ist mittlerweile obsolet und wird nicht mehr weiter gepflegt und auch nicht mehr zum Download angeboten. Benutze zukünftig den php.ini Parameter session.use_trans_sid um einen Session-Id-Fallback zu realisieren.
Ein kleiner Auszug aus dem antiquierten Artikel:
Da Session-Ids üblicherweise in temporären Cookies [...]]]></description>
			<content:encoded><![CDATA[<p>An dieser Stelle wurde eine Session-Fallback-Klasse propagiert, die den damals kaputten (Sommer 2000) PHP-Fallback umging. Diese Klasse ist mittlerweile obsolet und wird nicht mehr weiter gepflegt und auch nicht mehr zum Download angeboten. Benutze zukünftig den <tt>php.ini</tt> Parameter <tt>session.use_trans_sid</tt> um einen Session-Id-Fallback zu realisieren.<span id="more-40"></span></p>
<p><strong>Ein kleiner Auszug aus dem antiquierten Artikel:</strong></p>
<p>Da Session-Ids üblicherweise in temporären Cookies gespeichtert werden, die beim Request/Response zwischen Server und Client ausgetauscht werden, entsteht beim Umgang mit Sessions ein technisches Problem, und zwar wenn der Client/Browser keine Cookie annehmen kann oder will. In diesem Fall muss die Session-Id auf einem anderem Weg übertragen werden, und zwar als ein Teil des URL (also der Adresse einer Website).</p>
<p>Das PHP-Script muss feststellen, ob der Client Cookies annimmt und ggf. darauf reagieren. Diesen Mechanismus nennt man Fallback. Also einen Rückfall oder Atavismus: zuerst wird versucht einen Cookie zu setzen, schlägt dies fehl wird auf eine alternative Verfahrensweise ausgewichen.</p>
<p>Ein großer Nachteil des Fallbacks im URL ist, dass bei einer aktiven Verlinkung der Referer (also die Adresse der Seite &#8211; woher man kam) von den meisten Browsern an die Ziel-Seite übergeben wird und somit die Session-Id Fremden mitgeteilt wird.</p>
<p>Da dies ein potentielles Sicherheitsrisiko darstellt, empfiehlt es sich bei Links auf fremde Seiten auf die Übergabe der Session-Id zu verzichten. Dies klingt einleuchtend, birgt aber Fallen, sofern man PHP mit der Option <tt>--enable-trans-sid</tt> kompiliert hat und den kaputt-automatischen Fallback von PHP 4 benutzt (Stand Sommer 2000).</p>
<p>Befindet man sich auf einer Seite, die Session-Fallback benutzt, und steuert man eine fremde Seite über die direkte Eingabe des URL in das Adressfeld des Browsers oder über ein Lesezeichen (Bookmark), so ist nicht zu befürchten, dass der Browser den Referer samt der Session-Id an die fremde Seite sendet.</p>
<p><tt>--enable-trans-sid</tt> befähigt den PHP-Parser selbständig den Fallback auszuführen, sofern er zusätzlich in der <tt>php.ini</tt> aktiviert wird (<tt>session.use_trans_sid=1</tt>). Durch das automatische &#8211; bei jedem Request wiederkehrende &#8211; Umschreiben aller relevanten HTML-Tags (<tt>&lt;a&gt;</tt>, <tt>&lt;form&gt;</tt>, etc.) durch den Parser benötigt das Script mehr Zeit um abgearbeitet zu werden.</p>
<p>Abhängig von der PHP-Version funktioniert der in PHP implementierte Fallback u.U. nicht richtig, und liefert falschen Code. Vorallem eingebettete JavaScript-Funktionen können funktionellen Schaden erleiden, wenn sie Konstrukte wie z.B. <tt>location.href="index.php"</tt> nutzen. In diesem Fall gibt es für den Parser kaum eine Chance das als relevanten Code zu erkennen und ggf. die Session-Id als GET-Paramater an den diesen Redirect anzufügen. Die Session-Daten wären dann für das <tt>index.php</tt>-Script verloren, da ja keine mehr Zuordnung zu der Sessiondatei hergestellt werden kann</p>
]]></content:encoded>
			<wfw:commentRss>http://develnet.org/was-ist-fallback.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Was im Filesystem des Servers passiert&#8230;</title>
		<link>http://develnet.org/was-im-filesystem-des-servers-passiert.html</link>
		<comments>http://develnet.org/was-im-filesystem-des-servers-passiert.html#comments</comments>
		<pubDate>Thu, 18 Jun 2009 18:58:15 +0000</pubDate>
		<dc:creator>Horno</dc:creator>
				<category><![CDATA[PHP Tutorials]]></category>

		<guid isPermaLink="false">http://develnet.org/?p=31</guid>
		<description><![CDATA[Damit der Vorgang der Sessionspeicherung ein wenig verdeutlicht wird, untersuchen wir die Veränderungen im Filesystem des Servers. Die folgenden Beispiele laufen auf einem Unix-/Linuxsystem. Um sie nachvollziehen zu können, muß PHP mit safe_mode=Off konfiguriert werden. Zusätzlich wird davon ausgegangen, daß der Client (Browser) Cookies akzeptiert.
Als allererstes braucht man ein Script, welches den Inhalt des im [...]]]></description>
			<content:encoded><![CDATA[<p>Damit der Vorgang der Sessionspeicherung ein wenig verdeutlicht wird, untersuchen wir die Veränderungen im Filesystem des Servers. Die folgenden Beispiele laufen auf einem Unix-/Linuxsystem. Um sie nachvollziehen zu können, muß PHP mit <tt>safe_mode=Off</tt> konfiguriert werden. Zusätzlich wird davon ausgegangen, daß der Client (Browser) Cookies akzeptiert.<span id="more-31"></span></p>
<p>Als allererstes braucht man ein Script, welches den Inhalt des im <tt>session.save_path</tt> festgelegten Directories anzeigen kann:</p>
<pre><span style="color: #000000;">&lt;?php
  </span><span style="color: #888888;">// Datei: list.dir.php
  // Liste das "session.save_path" Directory
  // "safe_mode" muß "Off" sein

  </span><span style="color: #0000ee;">if (</span><span style="color: #000000;">strtolower</span><span style="color: #0000ee;">(</span><span style="color: #000000;">session_module_name</span><span style="color: #0000ee;">()) == </span><span style="color: #770000;">"files"</span><span style="color: #0000ee;">) {
    echo </span><span style="color: #770000;">'&lt;pre&gt;'</span><span style="color: #0000ee;">;
    </span><span style="color: #000000;">system</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'ls -l ' </span><span style="color: #0000ee;">. </span><span style="color: #000000;">get_cfg_var</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'session.save_path'</span><span style="color: #0000ee;">));
    echo </span><span style="color: #770000;">'&lt;/pre&gt;'</span><span style="color: #0000ee;">;
  }
</span><span style="color: #000000;">?&gt;</span></pre>
<p>Dieses Script wird unter dem Namen <tt>list.dir.php</tt> gespeichert. Hat man z.B. Shell-Zugriff auf den benötigten Teil des Servers, führt natürlich auch ein einfaches <tt>ls /tmp -l</tt> zu der von <tt>list.dir.php</tt> produzierten Ausgabe.</p>
<p>Das obige Script wird ausgeführt, um den Ursprungszustand des im <tt>session.save_path</tt> gespeicherten Verzeichnisses zu betrachten. Zunächst produziert das Script folgendes:</p>
<pre>insgesamt 0
srwxrwxrwx    1 root     root   0 Sep 22 21:38 mysql.sock</pre>
<p>Das Verzeichnis (in diesem Fall <tt>/tmp</tt>) ist fast leer. Die Datei <tt>mysql.sock</tt> kann für unseren Zweck vernachlässigt werden.</p>
<p>Als nächstes schreibt man ein Script, welches nach und nach ergänzt oder verändert wird, um die Veränderungen im Filesystem zu beobachten. Der Name diese Scriptes sei <tt>session.php</tt>. Dieses Script enthält nur die Funktion <tt>session_start()</tt>. Nach dem Start beobachten wir die Veränderungen:</p>
<pre><span style="color: #000000;">&lt;?php
  </span><span style="color: #888888;">// Datei: session.php
  </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
</span><span style="color: #000000;">?&gt;</span></pre>
<pre>insgesamt 0
srwxrwxrwx    1 root     root   0 Sep 22 21:38 mysql.sock
-rw-------    1 wwwrun   www    0 Apr 17 18:00 sess_edb0e8665db4...</pre>
<p>Wie man sehen kann, hat PHP eine Sessiondatei mit den Zugriffsrechten des Webservers erzeugt, dessen Prozeß es ja ist. Diese Datei ist zunächst 0 (Null) Byte groß. Diese Datei wird gleich die Sessiondaten aufnehmen.</p>
<p>Als nächstes wird das Script um die <tt>session_register()</tt> Funktion erweitert, die festlegt, daß die Variablen <tt>$s_userName</tt> und <tt>$s_userPermissions</tt> und ihre Inhalte gespeichert werden sollen. Bei den Parametern der <tt>session_register()</tt> Funktion handelt es sich nicht um die Variablen selbst, sondern um ihre Namen. Diese Parameter besitzen kein führendenes &#8220;$&#8221;.</p>
<pre><span style="color: #000000;">&lt;?php
  </span><span style="color: #888888;">// Datei: session.php
  </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
  </span><span style="color: #000000;">session_register</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'s_userName'</span><span style="color: #0000ee;">, </span><span style="color: #770000;">'s_userPermissions'</span><span style="color: #0000ee;">);

  </span><span style="color: #000000;">$s_userName        </span><span style="color: #0000ee;">= </span><span style="color: #770000;">'dtg'</span><span style="color: #0000ee;">;
  </span><span style="color: #000000;">$s_userPermissions </span><span style="color: #0000ee;">= </span><span style="color: #770000;">'keine :=('</span><span style="color: #0000ee;">;
</span><span style="color: #000000;">?&gt;</span></pre>
<pre>insgesamt 4
srwxrwxrwx    1 root     root   0 Sep 22 21:38 mysql.sock
-rw-------    1 wwwrun   www   55 Apr 17 18:01 sess_edb0e8665db4...</pre>
<p><strong><br />
Die Sessiondatei ist nun auf 55 Byte angewachsen. Sie enthält folgenden String:</strong></p>
<pre>s_userName|s:3:"dtg";s_userPermissions|s:9:"keine :=(";</pre>
<p>also die serialisierten Namen und Inhalte der Variablen, die mit <tt>session_register()</tt> bestimmt wurden. In den Sessiondaten können verschiedene Variablentypen gespeichert werden, also auch Arrays und Objekte.</p>
<p><strong>Wenn man jetzt auf eine Variable in der Sessiondatei verzichten will, kann man mittels <tt>session_unregister()</tt> PHP davon abhalten, die betreffende Variable zu speichern:</strong></p>
<pre><span style="color: #000000;">&lt;?php
  </span><span style="color: #888888;">// Datei: session.php
  </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
  </span><span style="color: #000000;">session_unregister</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'s_userPermissions'</span><span style="color: #0000ee;">);

  </span><span style="color: #000000;">$s_userPermissions </span><span style="color: #0000ee;">= </span><span style="color: #770000;">'ich will nicht gespeichert werden'</span><span style="color: #0000ee;">;
</span><span style="color: #000000;">?&gt;</span></pre>
<pre>insgesamt 4
srwxrwxrwx    1 root     root   0 Sep 22 21:38 mysql.sock
-rw-------    1 wwwrun   www   21 Apr 17 18:02 sess_edb0e8665db4...</pre>
<p>Die Variable <tt>$s_userPermissions</tt> wurde verworfen, die Sessiondatei ist nur noch 21 Byte groß und enthält nur noch die Variable <tt>$s_userName</tt>:</p>
<pre>s_userName|s:3:"dtg";</pre>
<p><strong>Möchte man nun alle Sessiondaten löschen stellt PHP die Funktion <tt>session_destroy()</tt> zur Verfügung. Vor einem <tt>session_destroy()</tt> muß zwingend ein <tt>session_start()</tt> oder <tt>session_register()</tt> ausgeführt werden:</strong></p>
<pre><span style="color: #000000;">&lt;?php
  </span><span style="color: #888888;">// Datei: session.php
  </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
  </span><span style="color: #000000;">session_destroy</span><span style="color: #0000ee;">();
</span><span style="color: #000000;">?&gt;</span></pre>
<pre>insgesamt 0
srwxrwxrwx    1 root     root   0 Sep 22 21:38 mysql.sock</pre>
<p>Die Sessiondatei wurde gelöscht und die Sessionvariablen stehen für weitere Scripte nicht mehr zur Verfügung. Wird nach diesem Zeitpunkt nochmals die Funktion <tt>session_start()</tt> bzw. <tt>session_register()</tt> im gleichen Browserfenster aufgerufen, wird erneut eine (<em>leere</em>) Sessiondatei erzeugt, und zwar exakt mit dem gleichen Namen d.h. mit der gleichen Session-ID. Der Grund dafür ist, daß der vom Browser gespeicherte Cookie &#8211; der ja die Session-ID enthält &#8211; erneut bei einem Request an den Server übermittelt wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://develnet.org/was-im-filesystem-des-servers-passiert.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Typische Fehlerquellen beim Umgang mit PHP-Sessions</title>
		<link>http://develnet.org/typische-fehlerquellen-beim-umgang-mit-php-sessions.html</link>
		<comments>http://develnet.org/typische-fehlerquellen-beim-umgang-mit-php-sessions.html#comments</comments>
		<pubDate>Thu, 18 Jun 2009 18:56:31 +0000</pubDate>
		<dc:creator>Horno</dc:creator>
				<category><![CDATA[PHP Tutorials]]></category>

		<guid isPermaLink="false">http://develnet.org/?p=26</guid>
		<description><![CDATA[
Warning: Cannot send session cookie &#8211; headers already sent&#8230;
Warning: open(/tmp\sess_&#8230;, O_RDWR) failed&#8230;

Warning: Cannot send session cookie &#8211; headers already sent&#8230;
Der häufigste Fehler ist der Versuch eine Session zu starten, nachdem HTML-Daten an den Browser geschickt worden sind. Diesen Versuch quitiert PHP 4 mit &#8220;Warning: Cannot send session cookie &#8211; headers already sent&#8230;&#8221;.
Ein Response &#8211; die [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li>Warning: Cannot send session cookie &#8211; headers already sent&#8230;</li>
<li>Warning: open(/tmp\sess_&#8230;, O_RDWR) failed&#8230;</li>
</ul>
<p><strong>Warning: Cannot send session cookie &#8211; headers already sent&#8230;</strong><br />
Der häufigste Fehler ist der Versuch eine Session zu starten, nachdem HTML-Daten an den Browser geschickt worden sind. Diesen Versuch quitiert PHP 4 mit &#8220;Warning: Cannot send session cookie &#8211; headers already sent&#8230;&#8221;.</p>
<p>Ein Response &#8211; die Antwort &#8211; des Webservers teils sich in zwei Bereiche:</p>
<ul>
<li>den Header, der u.a. den Content-Type (z.B. HTML oder Bilddaten) der Daten definiert</li>
<li>und die Daten selbst</li>
</ul>
<p>Wird nun von einem PHP-Script z.B. ein Leerzeichen ausgegeben, so nimmt PHP an, dass es sich um HTML handelt und schickt automatisch entsprechende Header und das Leerzeichen (Daten) an den Browser. Versucht nun PHP danach nochmals einen Header zu senden, kommt es zu der beschreibenen Fehlermeldung, da das Senden der Header bereits abgeschlossen ist.</p>
<p>Man mag sich jetzt fragen, wo der Zusammenhang zwischen dem Versuch <tt>session_start()</tt> resp. <tt>session_register()</tt> auszuführen und den Headern besteht. Nun, die Session-Funktionen benutzen Cookies zur Speicherung der Session-ID, und ein Cookie wird als Teil des Response-Headers an den Browser übermittelt. In der PHP-Voreinstellung führt jedes Starten der Session zum Versuch einen Cookie mittels einem Header an den Client zu schicken.</p>
<p><strong>Die typischen Stolperfallen:</strong></p>
<ul>
<li>Leerzeichen bzw. -zeilen vor dem ersten <tt>&lt;?</tt> bzw. <tt>&lt;?php</tt> Delimiter des Scripts</li>
<li>oder mit <tt>include()</tt> oder <tt>require()</tt> importierte Scriptfragmente, die natürlich gar keine Ausgabe produzieren dürfen &#8211; weder vor dem ersten Delimiter, noch dazwischen, noch nach dem letzten.</li>
</ul>
<p>Zusätzlich kommt durch die <tt>auto_prepend_file</tt>-Einstellung in der <tt>php.ini</tt>, bzw. in der Webserverkonfiguration, eine weitere potentielle Fehlerquelle hinzu.</p>
<hr />Falsch (HTML-Kommentar, Zeile 1 und 2):</p>
<pre>1: &lt;!-- HTML: meine dynamische Webseite mit Sessions --&gt;
2:  
3: <span style="color: #000000;">&lt;?php
4</span><span style="color: #0000ee;">:   @</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();  
</span><span style="color: #000000;">5</span><span style="color: #0000ee;">: </span><span style="color: #000000;">?&gt;</span></pre>
<p><strong>Falsch (Leerzeile in Zeile 4):</strong></p>
<pre>1: <span style="color: #000000;">&lt;?php
2</span><span style="color: #0000ee;">:   include </span><span style="color: #770000;">'seitenkopf.php'</span><span style="color: #0000ee;">;
</span><span style="color: #000000;">3</span><span style="color: #0000ee;">: </span><span style="color: #000000;">?&gt;</span>
4:  
5: <span style="color: #000000;">&lt;?php
6</span><span style="color: #0000ee;">:   @</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();  
</span><span style="color: #000000;">7</span><span style="color: #0000ee;">: </span><span style="color: #000000;">?&gt;</span></pre>
<p><strong>Richtig:<br />
</strong></p>
<pre>1: <span style="color: #000000;">&lt;?php
2</span><span style="color: #0000ee;">:   </span><span style="color: #888888;">/* 'seitenkopf.php' produziert keine Ausgabe! */
</span><span style="color: #000000;">3</span><span style="color: #0000ee;">:      
</span><span style="color: #000000;">4</span><span style="color: #0000ee;">:   include </span><span style="color: #770000;">'seitenkopf.php'</span><span style="color: #0000ee;">;
</span><span style="color: #000000;">5</span><span style="color: #0000ee;">:  
</span><span style="color: #000000;">6</span><span style="color: #0000ee;">:   @</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();  
</span><span style="color: #000000;">7</span><span style="color: #0000ee;">: </span><span style="color: #000000;">?&gt;</span></pre>
<hr />Merke:</p>
<ul>
<li>Eine Session muss vor der Ausgabe jeglicher Zeichen gestartet werden, also am besten als einer der allerersten Befehle eines Scriptes.</li>
</ul>
<p><strong>Warning: open(/tmp\sess_&#8230;, O_RDWR) failed&#8230;</strong></p>
<p>Windowsbasierte Betriebssysteme benutzen einen Backslash (&#8221;\&#8221;) als Verzeichnistrenner. In der <tt>php.ini</tt> ist dagegen der Standardpfad für die Sessiondateien als <tt>/tmp</tt> eingetragen &#8211; also mit einem normalem Slash (&#8221;/&#8221;), wie er auf unixoiden Betriebssystemen benutzt wird. Abhilfe schafft hier z.B. das Anlegen eines Verzeichnisses <tt>c:\temp</tt> und die entsprechende Änderung in der globalen Konfigurationsdatei <tt>php.ini</tt>:</p>
<pre>session.save_path  = c:\temp       ; für Windows</pre>
]]></content:encoded>
			<wfw:commentRss>http://develnet.org/typische-fehlerquellen-beim-umgang-mit-php-sessions.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Registrieren von Session-Variablen in Funktionen</title>
		<link>http://develnet.org/registrieren-von-session-variablen-innerhalb-von-funktionen.html</link>
		<comments>http://develnet.org/registrieren-von-session-variablen-innerhalb-von-funktionen.html#comments</comments>
		<pubDate>Thu, 18 Jun 2009 18:53:13 +0000</pubDate>
		<dc:creator>Horno</dc:creator>
				<category><![CDATA[PHP Tutorials]]></category>

		<guid isPermaLink="false">http://develnet.org/?p=23</guid>
		<description><![CDATA[Ein einfaches Registrieren von Session-Variablen innerhalb von Funktionen wird wahrscheinlich nicht zum gewünschten Erfolg führen, da sich in PHP &#8211; im Gegensatz zu den meisten Hochsprachen &#8211; die Sichtbarkeit von Variablen (Scope) lokal auf die Funktionen beschränkt. Das bedeutet, dass die innerhalb von Funktionen oder Klassen-Methoden gesetzten Variablenwerte wieder verworfen werden, nachdem die Funktion abgearbeitet [...]]]></description>
			<content:encoded><![CDATA[<p>Ein einfaches Registrieren von Session-Variablen innerhalb von Funktionen wird wahrscheinlich nicht zum gewünschten Erfolg führen, da sich in PHP &#8211; im Gegensatz zu den meisten Hochsprachen &#8211; die Sichtbarkeit von Variablen (Scope) lokal auf die Funktionen beschränkt. Das bedeutet, dass die innerhalb von Funktionen oder Klassen-Methoden gesetzten Variablenwerte wieder verworfen werden, nachdem die Funktion abgearbeitet worden ist. Man spricht hier auch vom sog. lokalen und globalen Namensraum oder auch vom lokalen und globalen Scope.</p>
<p>Da wir mittlerweile wissen, dass die Werte von registrierten Sessionvariablen erst am Ende des Scriptes gespeichert werden, können wir davon ausgehen, dass der Versuch eine Sessionvariable innerhalb einer Funktion zu registrieren nur zu einem Teilerfolg führen wird. Der Variablename wird in den Session-Daten gespeichert (registriert), aber der Wert der Variable wird der letzte Wert im globalen Scope sein: u.U. leer oder falsch. Wahrscheinlich wurde das innerhalb einer Funktion nicht beabsichtigt.</p>
<hr />Möchte man dennoch Variablenwerte aus Funktionen heraus registrieren, so muss man die Werte &#8211; unsaubererweise &#8211; in den globalen Scope überführen:</p>
<p>Datei: <tt>sess.howto5.php</tt></p>
<pre><span style="color: #000000;">&lt;?php
  </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
  </span><span style="color: #000000;">$s_foo </span><span style="color: #0000ee;">= </span><span style="color: #770000;">'one'</span><span style="color: #0000ee;">; 

  function </span><span style="color: #000000;">doRegister</span><span style="color: #0000ee;">() {
    </span><span style="color: #000000;">session_register</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'s_foo'</span><span style="color: #0000ee;">);     
    </span><span style="color: #000000;">$GLOBALS</span><span style="color: #0000ee;">[</span><span style="color: #770000;">'s_foo'</span><span style="color: #0000ee;">] = </span><span style="color: #770000;">'another'</span><span style="color: #0000ee;">;
  } 

  </span><span style="color: #000000;">doRegister</span><span style="color: #0000ee;">();
</span><span style="color: #000000;">?&gt;</span></pre>
<p>Dieses Script registriert die Variable <tt>$s_foo</tt> mit ihrem Wert (&#8221;another&#8221;) in der Session. Wie man es sich leicht vorstellen kann, können solche Konstrukte ins Auge gehen, wenn sich Variablen mit gleichen Namen im globalem Scope befinden: in diesem Fall wird der Wert &#8220;one&#8221; der Variable <tt>$s_foo</tt> überschreiben.</p>
<hr />Es ist sinnvoller auf die Registrierung von Variablen innerhalb von Funktionen und/oder Klassen-Mathoden zu verzichten, und dies im Haupt-Script (im globalen Scope) zu erledigen. Dazu muss die Funktion die Werte an den diesen Namensraum zurückgeben:</p>
<p>Datei: <tt>sess.howto6.php</tt></p>
<pre><span style="color: #000000;">&lt;?php
  </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">(); 

  function </span><span style="color: #000000;">doSomething</span><span style="color: #0000ee;">(</span><span style="color: #000000;">$x</span><span style="color: #0000ee;">) {
    </span><span style="color: #000000;">$y </span><span style="color: #0000ee;">= </span><span style="color: #000000;">$x </span><span style="color: #0000ee;">* </span><span style="color: #000000;">$x</span><span style="color: #0000ee;">;
    return </span><span style="color: #000000;">$y</span><span style="color: #0000ee;">;
  }

  </span><span style="color: #000000;">session_register</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'s_result'</span><span style="color: #0000ee;">);
  </span><span style="color: #000000;">$s_result </span><span style="color: #0000ee;">= </span><span style="color: #000000;">doSomething</span><span style="color: #0000ee;">(</span><span style="color: #000000;">42</span><span style="color: #0000ee;">);
</span><span style="color: #000000;">?&gt;</span></pre>
<hr />Kommt man in die Verlegenheit mehrere Werte zurückgeben zu müssen, so nutzt man ein Array als Rückgabeparameter und registriert dieses ganz:</p>
<p>Datei: <tt>sess.howto7.php</tt></p>
<pre><span style="color: #000000;">&lt;?php
  </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">(); 

  function </span><span style="color: #000000;">doSomething</span><span style="color: #0000ee;">(</span><span style="color: #000000;">$x</span><span style="color: #0000ee;">) {
    </span><span style="color: #000000;">$y </span><span style="color: #0000ee;">= </span><span style="color: #000000;">$x </span><span style="color: #0000ee;">* </span><span style="color: #000000;">$x</span><span style="color: #0000ee;">;
    </span><span style="color: #000000;">$z </span><span style="color: #0000ee;">= </span><span style="color: #000000;">dechex</span><span style="color: #0000ee;">(</span><span style="color: #000000;">$y</span><span style="color: #0000ee;">);   

    return array(</span><span style="color: #770000;">'y' </span><span style="color: #0000ee;">=&gt; </span><span style="color: #000000;">$y</span><span style="color: #0000ee;">, </span><span style="color: #770000;">'z' </span><span style="color: #0000ee;">=&gt; </span><span style="color: #000000;">$z</span><span style="color: #0000ee;">);
  } 

  </span><span style="color: #000000;">session_register</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'s_result'</span><span style="color: #0000ee;">);
  </span><span style="color: #000000;">$s_result </span><span style="color: #0000ee;">= </span><span style="color: #000000;">doSomething</span><span style="color: #0000ee;">(</span><span style="color: #000000;">42</span><span style="color: #0000ee;">);
</span><span style="color: #000000;">?&gt;</span></pre>
<hr />Möchte man nur einzelne Elemente dieses Arrays registrieren, so müssen diese wieder einzeln im globalen Scope deklariert werden:</p>
<p>Datei: <tt>sess.howto8.php</tt></p>
<pre><span style="color: #000000;">&lt;?php
  </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">(); 

  function </span><span style="color: #000000;">doSomething</span><span style="color: #0000ee;">(</span><span style="color: #000000;">$x</span><span style="color: #0000ee;">) {
    </span><span style="color: #000000;">$y </span><span style="color: #0000ee;">= </span><span style="color: #000000;">$x </span><span style="color: #0000ee;">* </span><span style="color: #000000;">$x</span><span style="color: #0000ee;">;
    </span><span style="color: #000000;">$z </span><span style="color: #0000ee;">= </span><span style="color: #000000;">dechex</span><span style="color: #0000ee;">(</span><span style="color: #000000;">$y</span><span style="color: #0000ee;">);

    return array(</span><span style="color: #770000;">'y' </span><span style="color: #0000ee;">=&gt; </span><span style="color: #000000;">$y</span><span style="color: #0000ee;">, </span><span style="color: #770000;">'z' </span><span style="color: #0000ee;">=&gt; </span><span style="color: #000000;">$z</span><span style="color: #0000ee;">);
  }

  </span><span style="color: #000000;">session_register</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'s_y'</span><span style="color: #0000ee;">, </span><span style="color: #770000;">'s_z'</span><span style="color: #0000ee;">);

  </span><span style="color: #000000;">$s_result </span><span style="color: #0000ee;">= </span><span style="color: #000000;">doSomething</span><span style="color: #0000ee;">(</span><span style="color: #000000;">42</span><span style="color: #0000ee;">);

  </span><span style="color: #000000;">$s_y </span><span style="color: #0000ee;">= </span><span style="color: #000000;">$s_result</span><span style="color: #0000ee;">[</span><span style="color: #770000;">'y'</span><span style="color: #0000ee;">];
  </span><span style="color: #000000;">$s_z </span><span style="color: #0000ee;">= </span><span style="color: #000000;">$s_result</span><span style="color: #0000ee;">[</span><span style="color: #770000;">'z'</span><span style="color: #0000ee;">];
</span><span style="color: #000000;">?&gt;</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://develnet.org/registrieren-von-session-variablen-innerhalb-von-funktionen.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Löschen verwaister Sessiondateien</title>
		<link>http://develnet.org/loschen-verwaister-sessiondateien.html</link>
		<comments>http://develnet.org/loschen-verwaister-sessiondateien.html#comments</comments>
		<pubDate>Thu, 18 Jun 2009 18:51:23 +0000</pubDate>
		<dc:creator>Horno</dc:creator>
				<category><![CDATA[PHP Tutorials]]></category>

		<guid isPermaLink="false">http://develnet.org/?p=19</guid>
		<description><![CDATA[Wenn ein PHP-Script nicht über einen &#8220;Logout&#8221;-Mechanismus verfügt, oder es nie zu der Ausführung eines solchen Mechanismus kommt, weil ein imaginärer Benutzer den imaginären &#8220;Logout&#8221;-Button nicht gedrückt hat und man nicht mit session_destroy() reagieren kann, werden ältere und verwaiste Sessiondateien bei dem chronologisch nächsten Request bzw. Initialisierung der Session (session_start() resp. session_register()) gelöscht.
Die Initialisierung der [...]]]></description>
			<content:encoded><![CDATA[<p>Wenn ein PHP-Script nicht über einen &#8220;Logout&#8221;-Mechanismus verfügt, oder es nie zu der Ausführung eines solchen Mechanismus kommt, weil ein imaginärer Benutzer den imaginären &#8220;Logout&#8221;-Button nicht gedrückt hat und man nicht mit session_destroy() reagieren kann, werden ältere und verwaiste Sessiondateien bei dem chronologisch nächsten Request bzw. Initialisierung der Session (<tt>session_start()</tt> resp. <tt>session_register()</tt>) gelöscht.</p>
<p>Die Initialisierung der Session setzt zuerst einen Prozeß in Gang, den man Garbage Collection (gc) nennt, und der dafür sorgt, dass alle verwaisten Sessiondateien aus dem Filesystem entfernt werden &#8211; erst danach wird ggf. eine neue Sessiondatei angelegt.</p>
<p>Um zu bestimmen, ob eine Sessiondatei verwaist ist, stellt PHP 4 den Konfigurationsparameter <tt>session.gc_maxlifetime</tt> in der <tt>php.ini</tt> bereit.</p>
<p>Der nummerische Wert von <tt>session.gc_maxlifetime</tt> gibt an, nach wievielen Sekunden eine Sessiondatei als Müll angesehen wird und entfernt werden darf (Default: 1440 Sekunden = 24 Minuten). Wenn die Differenz aus der Initialisierungszeit der Session (Jetzt-Zeit aus der Sicht des Scripes) und dem letzten Zugriff auf eine oder mehrere Sessiondateien den <tt>session.gc_maxlifetime</tt>-Wert übersteigt, werden diese Dateien gelöscht.</p>
<p>In der PHP 4-Defaulteinstellung wird die Garbage Collection statistisch jedoch nur bei jedem hundertsten <tt>session_start()</tt> angestoßen.</p>
<p>Verantwortlich hierfür ist der Konfigurationsparameter <tt>session.gc_probability</tt>. Dieser hat den Wert &#8220;1&#8243; und gibt die Wahrscheinlichkeit an, mit welcher die Müllsammlung gestartet wird, also in 1% der Fälle. Möchte man, dass ältere Sessiondateien zuverlässig gelöscht werden, so ist dieser Wert auf 100 (=100%) zu stellen.</p>
<p>Jede Garbage Collection benötigt natürlich auch ein wenig Zeit, sodaß man sich die Frage stellen sollte, ob es nicht ausreicht die Sessiondateien z.B. nur bei jeder zehnten Sessioninitialisierung (10%) löschen zu lassen.</p>
<p>Diese Parameter können in der <tt>php.ini</tt>, aber auch &#8211; wie viele andere Optionen &#8211; in den Webserverkonfigurationsdateien, der <tt>.htaccess</tt>-Datei oder direkt im Script beeinflußt werden.</p>
<p>Hier ein paar Beispiele für die verschiedenen Konfigurationsmöglichkeiten:</p>
<p><strong><tt>php.ini:</tt></strong></p>
<pre>session.gc_maxlifetime = 600  ; 10 Minuten Lebenszeit
session.gc_probability = 50   ; 50% - ca. bei jedem
                              ; zweiten Mal löschen</pre>
<p><strong><tt>httpd.conf</tt> oder <tt>.htaccess</tt> oder verwandte Dateien:</strong></p>
<pre># Session lebt 30 Minuten
php_value  session.gc_maxlifetime  1800

# Alte Session mit 100% Wahrscheinlicheit löschen
php_value  session.gc_probability  100</pre>
<p><strong>Direkt im Script:</strong></p>
<pre><span style="color: #000000;">&lt;?php 

    </span><span style="color: #888888;">// 20 Minuten Lebenszeit
    </span><span style="color: #000000;">ini_set</span><span style="color: #0000ee;">(</span><span style="color: #770000;">"session.gc_maxlifetime"</span><span style="color: #0000ee;">, </span><span style="color: #000000;">1200</span><span style="color: #0000ee;">);

    </span><span style="color: #888888;">// 100% Wahrscheinlichkeit
    </span><span style="color: #000000;">ini_set</span><span style="color: #0000ee;">(</span><span style="color: #770000;">"session.gc_probability"</span><span style="color: #0000ee;">, </span><span style="color: #000000;">100</span><span style="color: #0000ee;">);

</span><span style="color: #000000;">?&gt;</span></pre>
<p>Werden diese Parameter direkt im Script verändert, so muß dies vor dem ersten <tt>session_start()</tt> resp. <tt>session_register()</tt> ausgeführt werden, also bevor die Session initialisiert wird.</p>
]]></content:encoded>
			<wfw:commentRss>http://develnet.org/loschen-verwaister-sessiondateien.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Session-Funktionen im Einsatz</title>
		<link>http://develnet.org/session-funktionen-im-einsatz.html</link>
		<comments>http://develnet.org/session-funktionen-im-einsatz.html#comments</comments>
		<pubDate>Thu, 18 Jun 2009 18:49:13 +0000</pubDate>
		<dc:creator>Horno</dc:creator>
				<category><![CDATA[PHP Tutorials]]></category>

		<guid isPermaLink="false">http://develnet.org/?p=16</guid>
		<description><![CDATA[
Einfache Registrierung von Variablen
Registrierung mit Formular

Abhängig von der register_globals-Einstellung in der php.ini, werden die in den Sessiondaten registrierten Variablen bei einem session_start() wieder restauriert &#8211; d.h. diese Variablen und ihre Werte werden im globalen Variabenscope wiederhergestellt.
Zusätzlich stellt PHP 4 assoziative Arrays (Hashes) mit externen Daten zur Verfügung. Mit &#8220;externen Daten&#8221; sind Daten von außerhalb des [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li>Einfache Registrierung von Variablen</li>
<li>Registrierung mit Formular</li>
</ul>
<p>Abhängig von der <tt>register_globals</tt>-Einstellung in der <tt>php.ini</tt>, werden die in den Sessiondaten registrierten Variablen bei einem <tt>session_start()</tt> wieder restauriert &#8211; d.h. diese Variablen und ihre Werte werden im globalen Variabenscope wiederhergestellt.</p>
<p>Zusätzlich stellt PHP 4 assoziative Arrays (Hashes) mit externen Daten zur Verfügung. Mit &#8220;externen Daten&#8221; sind Daten von außerhalb des Scriptes gemeint: also z.B. Server-Variablen, GET-, POST- und COOKIE (GPC) Daten. Diese Daten lassen sich über die entsprechenden Hashes abrufen. Hier eine Auswahl der PHP-Hashes:</p>
<ul>
<li><tt>$HTTP_SERVER_VARS</tt></li>
<li><tt>$HTTP_GET_VARS</tt></li>
<li><tt>$HTTP_POST_VARS</tt></li>
<li><tt>$HTTP_COOKIE_VARS</tt></li>
<li>und <tt>$HTTP_SESSION_VARS</tt></li>
</ul>
<p>Ab der PHP Version 4.1.0 wurden diese Hashes durch die superglobalen Hashes ersetzt. Möchte man die Beispiele aus diesem Tutorial benutzen, so sind je nach PHP Version die entprechenden Hashes im Quelltext zu ersetzen:</p>
<ul>
<li><tt>$_SERVER</tt></li>
<li><tt>$_GET</tt></li>
<li><tt>$_POST</tt></li>
<li><tt>$_COOKIE</tt></li>
<li>und <tt>$_SESSION</tt></li>
</ul>
<p>Der letzte Hash (<tt>$HTTP_SESSION_VARS</tt> resp. <tt>$_SESSION</tt>) ist für unseres Tutorial von besonderer Bedeutung: in diesem Hash werden &#8211; nach dem Start einer Session &#8211; die registrierten Session-Variablen ebenfalls zur Verfügung gestellt. Also sind die Session-Daten zweifach vorhanden: als einzelne Variablen und zusammenhängend als ein Hash. Doch Vorsicht: in neueren PHP 4-Versionen werden die <tt>$HTTP_SESSION_VARS</tt> als Referenzen behandelt, d.h. eine Änderung des Inhalts einer Variable in diesem Hash zieht auch eine Änderung der Variable mit gleichem Namen im globalen Variablen-Scope nach sich. Dieses Verhalten ändert sich je nach Blut-THC-Konzentration der PHP Programmierer.</p>
<p>Der Zugriff auf alle externen Daten sollte nicht direkt über die automatisch restaurierten Variablennamen erfolgen, sondern über Hashes, da anderenfalls durch Mißkonfigurationen der <tt>php.ini</tt> Sicherheitslücken entstehen könn(t)en. Diesem Leitsatz folgen wir auch hier und arbeiten mit dem <tt>$HTTP_SESSION_VARS</tt>-Hash.</p>
<p>Als nächstes wollen wir uns mal ein paar kleine Beispiele anschauen. Damit diese Beispiele wunschgemäß laufen, muss dein Browser temporäre Session-Cookies akzeptieren. Also, sollte die Session-Cookie-Annahme bei deinem Browser ausgeschaltet sein, so ist jetzt der richtige Zeitpunkt sie wieder einzuschalten.</p>
<p>Im separaten Fallback-Tutorial wird beschrieben wie man Session-IDs auch ohne Cookies durchschleifen kann.</p>
<p>So nun zu den Beispielen</p>
<hr /><a name="A2"></a></p>
<h2>Einfache Registrierung von Variablen</h2>
<p>Datei: <tt>sess.howto1.php</tt></p>
<pre><span style="color: #000000;">&lt;?php
  </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
  </span><span style="color: #000000;">session_register</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'s_userName'</span><span style="color: #0000ee;">, </span><span style="color: #770000;">'s_userPerm'</span><span style="color: #0000ee;">);
  </span><span style="color: #000000;">$s_userName </span><span style="color: #0000ee;">= </span><span style="color: #770000;">'dtg'</span><span style="color: #0000ee;">;
  </span><span style="color: #000000;">$s_userPerm </span><span style="color: #0000ee;">= </span><span style="color: #770000;">'nada'</span><span style="color: #0000ee;">;
</span><span style="color: #000000;">?&gt;
</span>
&lt;html&gt;
&lt;body&gt;
  &lt;h1&gt;
    Datei: <span style="color: #000000;">&lt;?php </span><span style="color: #0000ee;">echo </span><span style="color: #000000;">getenv</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'SCRIPT_NAME'</span><span style="color: #0000ee;">) </span><span style="color: #000000;">?&gt;
</span>  &lt;/h1&gt;

  &lt;p&gt;
     Es wurden Variablen in der Session registriert.
  &lt;/p&gt;

  &lt;a href="sess.howto2.php"&gt;Weiter ...&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<hr />Datei: <tt>sess.howto2.php</tt></p>
<pre><span style="color: #000000;">&lt;?php
  </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
</span><span style="color: #000000;">?&gt;
</span>
&lt;html&gt;
&lt;body&gt;
  &lt;h1&gt;
    Datei: <span style="color: #000000;">&lt;?php </span><span style="color: #0000ee;">echo </span><span style="color: #000000;">getenv</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'SCRIPT_NAME'</span><span style="color: #0000ee;">) </span><span style="color: #000000;">?&gt;
</span>  &lt;/h1&gt;

  &lt;p&gt;
    Folgende Variablen wurden in der Session registriert:
  &lt;/p&gt;

  <span style="color: #000000;">&lt;?php
    </span><span style="color: #0000ee;">foreach (</span><span style="color: #000000;">$HTTP_SESSION_VARS </span><span style="color: #0000ee;">as </span><span style="color: #000000;">$k </span><span style="color: #0000ee;">=&gt; </span><span style="color: #000000;">$v</span><span style="color: #0000ee;">) {
      echo </span><span style="color: #770000;">'&lt;p&gt;' </span><span style="color: #0000ee;">. </span><span style="color: #000000;">$k </span><span style="color: #0000ee;">. </span><span style="color: #770000;">' = ' </span><span style="color: #0000ee;">. </span><span style="color: #000000;">$v </span><span style="color: #0000ee;">. </span><span style="color: #770000;">'&lt;/p&gt;'</span><span style="color: #0000ee;">;
    }
  </span><span style="color: #000000;">?&gt;
</span>
  &lt;a href="sess.howto1.php"&gt;Zurück ...&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<hr /><a name="A3"></a></p>
<h2>Registrierung mit Formular</h2>
<p>Datei: <tt>sess.howto3.php</tt></p>
<pre><span style="color: #000000;">&lt;?php
  </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
  if (isset(</span><span style="color: #000000;">$HTTP_POST_VARS</span><span style="color: #0000ee;">[</span><span style="color: #770000;">'submit'</span><span style="color: #0000ee;">])) {

    </span><span style="color: #000000;">session_register</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'s_userUnfug'</span><span style="color: #0000ee;">);
    </span><span style="color: #000000;">$s_userUnfug </span><span style="color: #0000ee;">= </span><span style="color: #000000;">$HTTP_POST_VARS</span><span style="color: #0000ee;">[</span><span style="color: #770000;">'s_userUnfug'</span><span style="color: #0000ee;">];

    </span><span style="color: #000000;">header</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'Location: http://'</span><span style="color: #0000ee;">.</span><span style="color: #000000;">getenv</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'HTTP_HOST'</span><span style="color: #0000ee;">).</span><span style="color: #770000;">'/sess.howto4.php'</span><span style="color: #0000ee;">);
    exit;
  }
</span><span style="color: #000000;">?&gt;
</span>
&lt;html&gt;
&lt;body&gt;
  &lt;h1&gt;
    Datei: <span style="color: #000000;">&lt;?php </span><span style="color: #0000ee;">echo </span><span style="color: #000000;">getenv</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'SCRIPT_NAME'</span><span style="color: #0000ee;">) </span><span style="color: #000000;">?&gt;
</span>  &lt;/h1&gt;

  &lt;form action="<span style="color: #000000;">&lt;?php </span><span style="color: #0000ee;">echo </span><span style="color: #000000;">getenv</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'SCRIPT_NAME'</span><span style="color: #0000ee;">) </span><span style="color: #000000;">?&gt;</span>" method="post"&gt;

    &lt;p&gt;
      Hier kannst du Unfug eingeben:
    &lt;/p&gt;

    &lt;input name="s_userUnfug"
           type="text"
           value="<span style="color: #000000;">&lt;?php
                     </span><span style="color: #0000ee;">echo </span><span style="color: #000000;">$HTTP_SESSION_VARS</span><span style="color: #0000ee;">[</span><span style="color: #770000;">'s_userUnfug'</span><span style="color: #0000ee;">]
                   </span><span style="color: #000000;">?&gt;</span>"&gt;
    &lt;input name="submit" type="submit"&gt;
  &lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<hr />Datei: <tt>sess.howto4.php</tt></p>
<pre><span style="color: #000000;">&lt;?php
  </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
</span><span style="color: #000000;">?&gt;
</span>
&lt;html&gt;
&lt;body&gt;
  &lt;h1&gt;
    Datei: <span style="color: #000000;">&lt;?php </span><span style="color: #0000ee;">echo </span><span style="color: #000000;">getenv</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'SCRIPT_NAME'</span><span style="color: #0000ee;">) </span><span style="color: #000000;">?&gt;
</span>  &lt;/h1&gt;

  &lt;p&gt;
    Das ist Unfug:
    <span style="color: #000000;">&lt;?php </span><span style="color: #0000ee;">echo </span><span style="color: #000000;">$HTTP_SESSION_VARS</span><span style="color: #0000ee;">[</span><span style="color: #770000;">'s_userUnfug'</span><span style="color: #0000ee;">] </span><span style="color: #000000;">?&gt;
</span>  &lt;/p&gt;

  &lt;a href="sess.howto3.php"&gt;Zurück ...&lt;/a&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<hr />Nachdem du dieses zweite Beispiel ausgeführt hast, führe nochmal das erste Beispiel (&#8221;Einfache Registrierung von Variablen&#8221;) aus. Jetzt wird auch die Variable <tt>userUnfug</tt> aus dem zweiten Beispiel angezeigt &#8211; sie ist in den Session-Daten gespeichert.</p>
<p>Diese Variablen verbleiben in den Session-Daten bis sie explizit mit <tt>session_unregister()</tt> &#8216;entfernt&#8217; werden, die Session-Daten gänzlich &#8211; z.B. mit <tt>session_destroy()</tt> &#8211; gelöscht werden oder die Session ihre Lebensdauer erreicht (<tt>php.ini</tt>: <tt>session.gc_maxlifetime</tt>).</p>
]]></content:encoded>
			<wfw:commentRss>http://develnet.org/session-funktionen-im-einsatz.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Die wichtigsten Session-Funktionen</title>
		<link>http://develnet.org/die-wichtigsten-session-funktionen.html</link>
		<comments>http://develnet.org/die-wichtigsten-session-funktionen.html#comments</comments>
		<pubDate>Thu, 18 Jun 2009 18:45:44 +0000</pubDate>
		<dc:creator>Horno</dc:creator>
				<category><![CDATA[PHP Tutorials]]></category>

		<guid isPermaLink="false">http://develnet.org/?p=11</guid>
		<description><![CDATA[PHP 4 verfügt &#8211; im Gegensatz zu PHP 3 &#8211; über einen ganzen Satz an Funktionen, die das Handling von Sessiondaten erleichtern. Möchte man mit PHP 3 Sessions nutzen, so ist man mit der PHPLIB gut beraten.
Ab der PHP Version 4.1.0 wurden die sog. superglobalen Hashes eingeführt. Somit gelten die $HTTP_*_VARS als veraltet, obwohl sie [...]]]></description>
			<content:encoded><![CDATA[<p>PHP 4 verfügt &#8211; im Gegensatz zu PHP 3 &#8211; über einen ganzen Satz an Funktionen, die das Handling von Sessiondaten erleichtern. Möchte man mit PHP 3 Sessions nutzen, so ist man mit der <a href="http://sourceforge.net/projects/phplib" target="_blank">PHPLIB</a> gut beraten.</p>
<p>Ab der PHP Version 4.1.0 wurden die sog. superglobalen Hashes eingeführt. Somit gelten die <tt>$HTTP_*_VARS</tt> als veraltet, obwohl sie per Schalter in der <tt>php.ini</tt> noch aktiviert werden können, um die Kompatibilität mit älteren Scripten zu gewährleisten. Anstatt <tt>$HTTP_SESSION_VARS</tt> ist in neueren PHP Versionen <tt>$_SESSION</tt> zu benutzen.</p>
<p><strong>Die wichtigsten PHP 4-Sessionfunktionen mit ihrer Auswirkung seien hier kurz vorgestellt:</strong></p>
<ul>
<li>session_start()</li>
<li>session_register()</li>
<li>session_unregister()</li>
<li>session_destroy()</li>
</ul>
<h2>session_start()</h2>
<p>Die Session initialisieren und eine Session(datei) auf dem Server erstellen. Wurde beim Request eine gültige Session-ID übergeben, werden die in den Sessiondaten gespeicherten Werte in dem <tt>$HTTP_SESSION_VARS</tt>-Hash wiederhergestellt und abhängig von der Einstellung der <tt>register_globals</tt> auch als Variablen im laufendem Script reinitialisiert.</p>
<p>Manche PHP 4-Versionen enthalten einen Bug, der bei der <tt>php.ini</tt> -Einstellung <tt>register_globals=off</tt>, den <tt>$HTTP_SESSION_VARS</tt>-Hash nicht richtig wiederherstellen. Bei einen Verdacht auf eine Fehlfunktion könnte diese Einstellung auf on geändert werden und u.U. der Webserver neu gestartet werden.</p>
<p>Zusätzlich werden, je nach Einstellung des <tt>session.gc_probability</tt>- und des <tt>session.gc_maxlifetime</tt>-Parameters, die in dem Augenblick der Sessioninitialisierung angehäuften und nicht mehr benötigten Sessiondateien auf dem Server gelöscht.</p>
<p>Wenn das <tt>error_reporting()</tt> schärfer eingestellt ist, gibt <tt>session_start()</tt> bei älteren PHP 4-Versionen eine Notice aus, wenn die Garbage Collection &#8211; das Löschen alter Sessiondateien &#8211; durchgeführt wird. Da diese Notice nicht erwünscht ist, empfiehlt es sich vor die <tt>session_start()</tt>-Funktion ein &#8220;@&#8221; zu schreiben, welches die entsprechende Ausgabe unterdrückt.</p>
<pre><span style="color: #000000;">&lt;?php
    </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
</span><span style="color: #000000;">?&gt;</span></pre>
<p>Bei der Entwicklung einer sessionbasierten Applikation sollte man einen besonderen Augenmerk auf den &#8220;@&#8221; Operator richten, da das &#8220;@&#8221; auch einen beliebten Programmierfehler unterdrückt, der dann schlecht aufzuspüren ist.</p>
<hr /><a name="A3"></a></p>
<h2>session_register()</h2>
<p>Eine oder mehrere Variablen zur Speicherung in die Session(datei) vormerken. <tt>session_register()</tt> impliziert ein <tt>session_start()</tt>. Das bedeutet, daß man <tt>session_start()</tt> in diesem Fall auch weglassen könnte. Bei den Parametern der <tt>session_register()</tt> Funktion handelt es sich nicht um die Variablen selbst, sondern um ihre Namen. Diese Parameter besitzen kein führendenes &#8220;$&#8221;.</p>
<p><tt>session_register()</tt> merkt eine Variable vor (registriert sie), die dann <em>am Ende des Scriptes</em> in die Session(datei) geschrieben wird, und die zwischen dem Registrieren und dem Scriptende verschiedene Werte haben kann. Es wird jeweils der letzte Wert dieser Variablen in den Sessiondaten gespeichert. D.h. Die Werte der registrierten Variablen sind frühestens, nach der Beendigung des aktuellen Scriptes und beim nächsten <tt>session_start()</tt> wieder verfügbar.</p>
<pre><span style="color: #000000;">&lt;?php
    $var1 </span><span style="color: #0000ee;">= </span><span style="color: #770000;">'variable #1'</span><span style="color: #0000ee;">;
    </span><span style="color: #000000;">$var2 </span><span style="color: #0000ee;">= </span><span style="color: #000000;">42</span><span style="color: #0000ee;">;
    </span><span style="color: #000000;">$var3 </span><span style="color: #0000ee;">= </span><span style="color: #000000;">true</span><span style="color: #0000ee;">;

    @</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
    </span><span style="color: #000000;">session_register</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'var1'</span><span style="color: #0000ee;">);
    </span><span style="color: #000000;">session_register</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'var2'</span><span style="color: #0000ee;">, </span><span style="color: #770000;">'var3'</span><span style="color: #0000ee;">);
</span><span style="color: #000000;">?&gt;</span></pre>
<hr /><a name="A4"></a></p>
<h2>session_unregister()</h2>
<p>Eine oder mehrere Variablen aus der Session(datei) verwerfen. Dem <tt>session_unregister()</tt> muß ein <tt>session_start()</tt> oder <tt>session_register()</tt> vorangehen.</p>
<pre><span style="color: #000000;">&lt;?php
    </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
    </span><span style="color: #000000;">session_unregister</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'var1'</span><span style="color: #0000ee;">);
</span><span style="color: #000000;">?&gt;</span></pre>
<hr /><a name="A5"></a></p>
<h2>session_destroy()</h2>
<p>Die Funktion <tt>session_destroy()</tt> veranlasst PHP alle Variablen einer Session zu verwerfen und die Session(datei) löschen. Dem <tt>session_destroy()</tt> muss ebenfalls ein <tt>session_start()</tt> oder <tt>session_register()</tt> vorangehen.</p>
<pre><span style="color: #000000;">&lt;?php
    </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
    </span><span style="color: #000000;">session_destroy</span><span style="color: #0000ee;">();
</span><span style="color: #000000;">?&gt;</span></pre>
<p>Manche Portierungen von PHP 4 für windowsbasierte Betriebssysteme haben Probleme mit der Löschung von Sessiondateien und melden: &#8220;Warning: Session object destruction failed &#8230;&#8221;. In diesem Fall kann man mittels des folgenden Scriptes die Sessiondatei &#8220;manuell&#8221; löschen:</p>
<pre><span style="color: #000000;">&lt;?php
    </span><span style="color: #0000ee;">@</span><span style="color: #000000;">session_start</span><span style="color: #0000ee;">();
    @</span><span style="color: #000000;">session_destroy</span><span style="color: #0000ee;">();  </span><span style="color: #888888;">/* könnte fehlschlagen */

    </span><span style="color: #0000ee;">if (</span><span style="color: #000000;">strtolower</span><span style="color: #0000ee;">(</span><span style="color: #000000;">session_module_name</span><span style="color: #0000ee;">()) == </span><span style="color: #770000;">'files'</span><span style="color: #0000ee;">) {
        @</span><span style="color: #000000;">unlink</span><span style="color: #0000ee;">(
            </span><span style="color: #000000;">get_cfg_var</span><span style="color: #0000ee;">(</span><span style="color: #770000;">'session.save_path'</span><span style="color: #0000ee;">)
            .</span><span style="color: #770000;">'/sess_'
            </span><span style="color: #0000ee;">.</span><span style="color: #000000;">session_id</span><span style="color: #0000ee;">()
        );
    }
</span><span style="color: #000000;">?&gt;</span></pre>
<p>Dieses Script löscht die Sessiondatei aus dem Filesystem, sodaß beim erneuten Zugriff keine Daten wiederhergestellt werden können.</p>
<hr /><strong>Merke:</strong></p>
<ul>
<li>Registrierte Variablen werden am Ende eines Scriptes in die Session(datei) geschrieben.</li>
<li>Sie können zwischen dem Registrieren und dem Scriptende verschiedene Werte haben.</li>
<li>Der Zugriff auf registrierte Variablen ist erst wieder nach einem <tt>session_start()</tt> möglich.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://develnet.org/die-wichtigsten-session-funktionen.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Was ist eine Session-ID? Wo werden Sessiondaten gespeichert?</title>
		<link>http://develnet.org/was-ist-eine-session-id-wo-werden-sessiondaten-gespeichert.html</link>
		<comments>http://develnet.org/was-ist-eine-session-id-wo-werden-sessiondaten-gespeichert.html#comments</comments>
		<pubDate>Thu, 18 Jun 2009 18:39:49 +0000</pubDate>
		<dc:creator>Horno</dc:creator>
				<category><![CDATA[PHP Tutorials]]></category>

		<guid isPermaLink="false">http://develnet.org/?p=10</guid>
		<description><![CDATA[Die Session-ID &#8211; es ist eine zufällige Zeichenfolge &#8211; wird serverseitig generiert und wird beim allerersten Response des Webservers an den Browser geschickt, der sie dann speichert. Üblicherweise wird eine Session-ID in Cookies abgelegt, da der Browser bei jedem Request automatisch den Inhalt des Cookies an den Webserver schickt der ihn gesetzt hat.
Dies bedeutet, dass [...]]]></description>
			<content:encoded><![CDATA[<p>Die Session-ID &#8211; es ist eine zufällige Zeichenfolge &#8211; wird serverseitig generiert und wird beim allerersten Response des Webservers an den Browser geschickt, der sie dann speichert. Üblicherweise wird eine Session-ID in Cookies abgelegt, da der Browser bei jedem Request automatisch den Inhalt des Cookies an den Webserver schickt der ihn gesetzt hat.</p>
<p>Dies bedeutet, dass sich der Programmierer der serverseitigen Software theoretisch keine Sorgen machen muss, wie die Session-ID vom Browser wieder zurück zum Webserver kommt, da diese Arbeit automatisch vom Browser erledigt wird.</p>
<p>Cookies sind nichts anderes als menschenlesbare Textdateien, in denen ein Webserver spezifische Daten auf der lokalen Platte des Benutzers ablegen kann. Diese Daten sind u.U. recht kryptisch gehalten, so daß meistens nur der Autor der serverseitigen Software &#8211; die den Cookie gesetzt hat &#8211; weiß, wie diese Cookie-Daten zu interpretieren sind.</p>
<p>Dies ist aber für uns irrelevant und soll uns nicht weiter beschäftigen, denn wir wollen feststellen, daß die Größe des Cookie &#8211; per Definition &#8211; ca. 4000 Zeichen nicht überschreiten darf (wovon wir ca. 40 Zeichen benötigen), und dass es zwei Arten von Cookies gibt:</p>
<ul>
<li>&#8220;Persistente Cookies&#8221; werden für einen definierten Zeitraum (Gültigkeitsdauer) auf der Festplatte des Benutzers als normal lesbare Textdatei gespeichert. Dieser Zeitraum kann sich von wenigen Minuten bis mehreren Jahren erstrecken.</li>
<li>Die Lebensdauer der &#8220;temporären Session-Cookies&#8221; beschränkt sich auf die Lebensdauer des Browser-Fensters. Wird dieses geschlossen, wird auch der temporäre Cookie verworfen. Dieser Cookie wird üblicherweise nicht auf der Festplatte gespeichert; er residiert im Arbeitsspeicher des Rechners.</li>
</ul>
<p>In der Standardeinstellung benutzt PHP 4 die zweite Variante &#8211; die temporären Cookies &#8211; um Session-IDs zu speichern. Im Cookie wird der Name der Session und die bereits erwähnte zufällige Zeichenfolge der Session-ID gespeichert. Der Name der Session ist eine frei wählbare Bezeichnung, die uns später als Variable bei der Auswertung der Sessiondaten im PHP-Script zu Verfügung stehen wird. Per Voreinstellung lautet der Name der Variable bei PHP 4: <tt>PHPSESSID</tt>. Die Länge der von PHP 4 produzierten Session-ID beträgt 32 Zeichen.</p>
<p>Als Ergebnis können wir annehmen, dass bei der Initialisierung einer Session, PHP einen Cookie mit etwa dem folgenden Inhalt beim Benutzer hinterlegt:</p>
<pre>PHPSESSID=edb0e8665db4e9042fe0176a89aade16</pre>
<p>Der linke Teil des Strings wird als Sessionname und der rechte &#8211; die zufällige Zeichenkette &#8220;edb0e8665db4e9042fe0176a89aade16&#8243; &#8211; als Session-ID bezeichnet.</p>
<p>Diese Session-ID ist der Schlüssel zur Wiedererkennung des Benutzers und zur Restaurierung der von ihm gesetzten Daten. Die Session-ID repräsentiert bei PHP 4 &#8211; per Voreinstellung &#8211; eine temporäre Datei im Filesystem des Servers. Auf unixoiden Betriebssystemen wird die PHP-Sessiondatei standardmäßig im Verzeichnis <tt>/tmp/</tt> erstellt. In der <tt>php.ini</tt> &#8211; der globalen Konfigurationsdatei &#8211; oder ein der Webserverkonfiguration läßt sich dieser Wert natürlich verändern.</p>
<p>Diese Session-Datei bekommt im Namen den Prefix <tt>sess_</tt>, so dass das Ergebnis im Filesystem des Servers folgendermaßen aussehen kann:</p>
<pre>goosh@warpcore:~&gt; ls /tmp/ -l
insgesamt 0
-rw------- 1 wwwrun www 0 Apr 17 18:00 sess_edb0e8665db4...</pre>
<p>In dieser Datei kann ein PHP-Script Benutzerdaten ablegen &#8211; z.B. die Artikelnummer und die Anzahl der bestellten Artikel für einen Warenkorb oder einfach nur ob ein Benutzer sich authorisiert hat und Zugriff auf eine Webseite hat.</p>
<p>Dadurch dass der Browser den Inhalt des Cookies bei einem Request mitschickt, ist es möglich den Benutzer über mehrere Webseiten zu authentifizieren oder die vom Benutzer gesetzten Variablen von einer Seite auf eine andere zu übernehmen.</p>
<p>Die Manipulation dieser Session-Datei bleibt nur dem serverseitig ausgeführtem PHP-Script vorbehalten. Der Client weiß nicht welche Daten von dem Script gespeichert werden und er kann keinen mittelbaren Einfluß auf diese Daten nehmen. Ausnahme bildet hier die Änderung oder Löschung dieser Daten durch den Administrator oder durch ein auf dem Server laufendes Script mit entsprechenden (Datei-)Rechten.</p>
<hr />Merke:</p>
<ul>
<li>In der Voreinstellung benutzt PHP 4 temporäre Cookies um Session-IDs zu speichern.</li>
<li>Defaultname der Session ist PHPSESSID.</li>
<li>Eine mit PHP 4 generierte Session-ID ist 32 Zeichen lang (MD5 digest).</li>
<li>Sessiondateien werden im Ordner <tt>/tmp/</tt> gespeichert.</li>
<li>Sessiondateien können nur serverseitig geändert werden.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://develnet.org/was-ist-eine-session-id-wo-werden-sessiondaten-gespeichert.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sessions mit PHP</title>
		<link>http://develnet.org/sessions-mit-php.html</link>
		<comments>http://develnet.org/sessions-mit-php.html#comments</comments>
		<pubDate>Thu, 18 Jun 2009 18:38:54 +0000</pubDate>
		<dc:creator>Horno</dc:creator>
				<category><![CDATA[PHP Tutorials]]></category>
		<category><![CDATA[PHP Session]]></category>

		<guid isPermaLink="false">http://develnet.org/?p=7</guid>
		<description><![CDATA[Die Möglichkeit, Benutzerdaten über mehrere Webseiten hinweg zu erhalten und dem Benutzer wieder zuzuordnen, eröffnet neue Möglichkeiten für Webprogrammiererer. Administrative Webbereiche, wie z.B. Foren- oder Communityverwaltung, Benutzerverfolgung (User-Tracking), seitenübergreifende Formulare oder individuelle Inhalte für jeden einzelnen Benutzer (Customizing) werden mit Sessions möglich. Die Grundlagen der Sessionverwaltung mit PHP werden hier erläutert.
Wozu Sessions?
Sofern man dieses Tutorial [...]]]></description>
			<content:encoded><![CDATA[<p>Die Möglichkeit, Benutzerdaten über mehrere Webseiten hinweg zu erhalten und dem Benutzer wieder zuzuordnen, eröffnet neue Möglichkeiten für Webprogrammiererer. Administrative Webbereiche, wie z.B. Foren- oder Communityverwaltung, Benutzerverfolgung (User-Tracking), seitenübergreifende Formulare oder individuelle Inhalte für jeden einzelnen Benutzer (Customizing) werden mit Sessions möglich. Die Grundlagen der Sessionverwaltung mit PHP werden hier erläutert.<span id="more-7"></span></p>
<h2>Wozu Sessions?</h2>
<p>Sofern man dieses Tutorial online liest, wird man entweder auf einen Link geklickt, oder die Adresse dieser Seite manuell eingegeben haben. Spätestens dabei wird es (hoffentlich) aufgefallen sein, dass die Adressen der meisten Webseiten mit <tt>http://</tt> beginnen.</p>
<p>Die Abkürzung HTTP liest sich &#8220;HyperText Transfer Protocol&#8221; und ist der Grundstein für das World Wide Web, wie wir es heute kennen &#8211; es regelt die Verständigung zwischen dem Client (z.B. Browser) und dem Webserver, der die auf ihm gespeicherten Webseiten zur Verfügung stellt.</p>
<p>In der derzeitigen Implementation (HTTP 1.1), hat das HTT-Protokoll leider einen großen Nachteil: es ist &#8220;zustandslos&#8221;. Vereinfacht bedeutet das:</p>
<ul>
<li>Der Client (Browser) öffnet eine Verbindung zum Webserver, und fragt nach einer Webseite (Request).</li>
<li>Der Webserver antwortet (Response) mit dem gewünschten Inhalt (oder einer Fehlermeldung).</li>
<li>Der Client empfängt bestenfalls die Daten und stellt sie dar.</li>
<li>Die Verbindung zwischen Client und Server wird beendet, es wird kein &#8220;Zustand&#8221; &#8211; keine dauerhafte Verbindung &#8211; aufrecht erhalten.</li>
</ul>
<p><strong>Merke:</strong></p>
<ul>
<li>Das HTT-Protokol ist zustandslos (stateless)</li>
<li>Request: die Anfrage des Browsers an den Webserver</li>
<li>Response: die Antwort des Webservers auf einen Request</li>
</ul>
<p>Zunächst klingt diese Verfahrensweise logisch und nicht besonders tragisch, da offensichtlich die angeforderten Daten &#8211; wie gewünscht &#8211; ihren Weg zum Browser finden. Das Problem für den Programmierer der Webseiten-Logik entsteht erst dann, wenn es nötig wird, den Client von einem Request zum anderem zu identifizieren &#8211; d.h. die Requests zu unterscheiden, ob sie vom gleichem Client stammen oder nicht.</p>
<p>Diese Unterscheidung (Authentifizierung) ist schon z.B. bei einer einfachen Warenkorb-Funktion notwendig, damit bestellte Artikel nicht im Warenkorb eines anderen Benutzers landen, der sich zufällig zur gleichen Zeit im gleichem Online-Shop bewegt. Ebenfalls wird diese Unterscheidung notwendig, um ausgewählten Benutzern restriktiven Zugriff auf spezielle Teile einer Website zu erlauben (Authorisierung) z.B. auf Administrationsbereiche oder Bereiche in denen Informationen für einen geschlossenen Benutzerkreis (CUG &#8211; closed user group) zur Verfügung stehen.</p>
<p>Eine eindeutige Unterscheidung anhand der IP-Adresse ist &#8211; wie es oft landläufig von Neulingen geglaubt wird &#8211; nicht möglich bzw. stellt aus der Sicht des Webservers keinen sicheren Weg zu Authentifizierung eines Clients dar, da einerseits mehrere Clients mit der gleichen IP im WWW unterwegs sein können (Masquerading) und andereseits ein Client über mehrere Requests hinweg verschiedene IP-Adressen (Proxies) haben kann. Wie das genau funktioniert ist aber eine andere Geschichte.</p>
<p>Merke:</p>
<ul>
<li>Eine IP ist in unserem Kontext nicht eindeutig.</li>
<li>Authentifizierung: Wiedererkennung eines Benutzers.</li>
<li>Authorisierung: Überprüfung individueller Zugangsdaten eines wiedererkannten Benutzers und Gewährleistung damit vebundener Rechte.</li>
</ul>
<p>Die Lösung für das Problem sind sog. Sessions-IDs, eindeutige &#8220;Schlüssel&#8221;, die bei der HTTP-Kommunkation über den Zeitraum einer Sitzung (engl. Session) auf einer Webseite ihre Gültigkeiten behalten.</p>
<h2>Was ist eine Session-ID? Wo werden Sessiondaten gespeichert?</h2>
<p>Die Session-ID &#8211; es ist eine zufällige Zeichenfolge &#8211; wird serverseitig generiert und wird beim allerersten Response des Webservers an den Browser geschickt, der sie dann speichert. Üblicherweise wird eine Session-ID in Cookies abgelegt, da der Browser bei jedem Request automatisch den Inhalt des Cookies an den Webserver schickt der ihn gesetzt hat.</p>
<p>Dies bedeutet, dass sich der Programmierer der serverseitigen Software theoretisch keine Sorgen machen muss, wie die Session-ID vom Browser wieder zurück zum Webserver kommt, da diese Arbeit automatisch vom Browser erledigt wird.</p>
<p>Cookies sind nichts anderes als menschenlesbare Textdateien, in denen ein Webserver spezifische Daten auf der lokalen Platte des Benutzers ablegen kann. Diese Daten sind u.U. recht kryptisch gehalten, so daß meistens nur der Autor der serverseitigen Software &#8211; die den Cookie gesetzt hat &#8211; weiß, wie diese Cookie-Daten zu interpretieren sind.</p>
<p>Dies ist aber für uns irrelevant und soll uns nicht weiter beschäftigen, denn wir wollen feststellen, daß die Größe des Cookie &#8211; per Definition &#8211; ca. 4000 Zeichen nicht überschreiten darf (wovon wir ca. 40 Zeichen benötigen), und dass es zwei Arten von Cookies gibt:</p>
<ul>
<li>&#8220;Persistente Cookies&#8221; werden für einen definierten Zeitraum (Gültigkeitsdauer) auf der Festplatte des Benutzers als normal lesbare Textdatei gespeichert. Dieser Zeitraum kann sich von wenigen Minuten bis mehreren Jahren erstrecken.</li>
<li>Die Lebensdauer der &#8220;temporären Session-Cookies&#8221; beschränkt sich auf die Lebensdauer des Browser-Fensters. Wird dieses geschlossen, wird auch der temporäre Cookie verworfen. Dieser Cookie wird üblicherweise nicht auf der Festplatte gespeichert; er residiert im Arbeitsspeicher des Rechners.</li>
</ul>
<p>In der Standardeinstellung benutzt PHP 4 die zweite Variante &#8211; die temporären Cookies &#8211; um Session-IDs zu speichern. Im Cookie wird der Name der Session und die bereits erwähnte zufällige Zeichenfolge der Session-ID gespeichert. Der Name der Session ist eine frei wählbare Bezeichnung, die uns später als Variable bei der Auswertung der Sessiondaten im PHP-Script zu Verfügung stehen wird. Per Voreinstellung lautet der Name der Variable bei PHP 4: <tt>PHPSESSID</tt>. Die Länge der von PHP 4 produzierten Session-ID beträgt 32 Zeichen.</p>
<p>Als Ergebnis können wir annehmen, dass bei der Initialisierung einer Session, PHP einen Cookie mit etwa dem folgenden Inhalt beim Benutzer hinterlegt:</p>
<pre>PHPSESSID=edb0e8665db4e9042fe0176a89aade16</pre>
<p>Der linke Teil des Strings wird als Sessionname und der rechte &#8211; die zufällige Zeichenkette &#8220;edb0e8665db4e9042fe0176a89aade16&#8243; &#8211; als Session-ID bezeichnet.</p>
<p>Diese Session-ID ist der Schlüssel zur Wiedererkennung des Benutzers und zur Restaurierung der von ihm gesetzten Daten. Die Session-ID repräsentiert bei PHP 4 &#8211; per Voreinstellung &#8211; eine temporäre Datei im Filesystem des Servers. Auf unixoiden Betriebssystemen wird die PHP-Sessiondatei standardmäßig im Verzeichnis <tt>/tmp/</tt> erstellt. In der <tt>php.ini</tt> &#8211; der globalen Konfigurationsdatei &#8211; oder ein der Webserverkonfiguration läßt sich dieser Wert natürlich verändern.</p>
<p>Diese Session-Datei bekommt im Namen den Prefix <tt>sess_</tt>, so dass das Ergebnis im Filesystem des Servers folgendermaßen aussehen kann:</p>
<pre>goosh@warpcore:~&gt; ls /tmp/ -l
insgesamt 0
-rw------- 1 wwwrun www 0 Apr 17 18:00 sess_edb0e8665db4...</pre>
<p>In dieser Datei kann ein PHP-Script Benutzerdaten ablegen &#8211; z.B. die Artikelnummer und die Anzahl der bestellten Artikel für einen Warenkorb oder einfach nur ob ein Benutzer sich authorisiert hat und Zugriff auf eine Webseite hat.</p>
<p>Dadurch dass der Browser den Inhalt des Cookies bei einem Request mitschickt, ist es möglich den Benutzer über mehrere Webseiten zu authentifizieren oder die vom Benutzer gesetzten Variablen von einer Seite auf eine andere zu übernehmen.</p>
<p>Die Manipulation dieser Session-Datei bleibt nur dem serverseitig ausgeführtem PHP-Script vorbehalten. Der Client weiß nicht welche Daten von dem Script gespeichert werden und er kann keinen mittelbaren Einfluß auf diese Daten nehmen. Ausnahme bildet hier die Änderung oder Löschung dieser Daten durch den Administrator oder durch ein auf dem Server laufendes Script mit entsprechenden (Datei-)Rechten.</p>
<p><strong>Merke:</strong></p>
<ul>
<li>In der Voreinstellung benutzt PHP 4 temporäre Cookies um Session-IDs zu speichern.</li>
<li>Defaultname der Session ist PHPSESSID.</li>
<li>Eine mit PHP 4 generierte Session-ID ist 32 Zeichen lang (MD5 digest).</li>
<li>Sessiondateien werden im Ordner <tt>/tmp/</tt> gespeichert.</li>
<li>Sessiondateien können nur serverseitig geändert werden.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://develnet.org/sessions-mit-php.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
