HTMELL
Administrator
Registriert: 11.05.2006
Beiträge: 544
|
|
Wie bereits in http://www.validome.org/forum/viewtopicp-424-1.htm geschrieben, gibt es häufig Probleme mit "&" in href und src-Attributen. Harte Dokumente können diesbezüglich manuell überarbeitet werden, problematischer wird es aber bei dynamischen Dokumenten, welche von PHP generiert werden. PHP "erweitert" jeden href-Attributwert automatisch um die Session-ID (sofern eine Session gestartet und nicht mit Cookies gearbeitet wird). So wird aus:
Code:
<a href="meinLink.html?id=1">test</a> |
folgendes gemacht:
Code:
<a href="meinLink.html?id=1&PHPSESSID=b428fce61f52afa3c1898cf6c3285b1a">test</a> |
Bei PHPSESSID handelt es sich um den Defaultwert von PHP, dieser kann aber auch ganz anders lauten. Dies ist aber für die hier beschriebene Problematik, ebenso wie "b428fce61f52afa3c1898cf6c3285b1a", irrelevant. Das Problem entsteht durch das "&" in "id=1&PHPSESSID", welches PHP automatisch einfügt. Dies führt aber zu einen HTML-Fehler, da "&PHPSESSID" richtigerweise für ein Entity gehalten wird (siehe http://www.validome.org/forum/viewtopicp-424-1.htm). Um diesen Fehler zu vermeiden muss man PHP beibringen, "&" anstelle von "&" zu verwenden. In PHP führt man dieses Verhalten herbei, indem in die Konfiguration eingegriffen wird. Dafür MUSS eine, und KANN eine weitere Konfigurationseinstellung geändert werden. Es gibt zwei Möglichkeiten, um diese Einstellungen zu ändern: 1. Wenn man die Möglichkeit und Rechte besitzt, in der php.ini. PHP wird dann in JEDEM Script nicht mehr das "&", sondern "&" einfügen. 2. Mit dem Befehl "ini_set()" direkt aus den PHP-Scripten. Diese Methode hat den Nachteil, dass man "ini_set()" in jedes betroffene Script einfügen muss.
Um nun PHP beizubringen "&" zu schreiben, muss die Konfigurationseinstellung "arg_separator.output" geändert werden: In der php.ini:
Code:
arg_separator.output = "&" |
Im PHP-Script:
Code:
ini_set( 'arg_separator.output' , '&' ); |
Die zweite Konfigurationseinstellung lautet "url_rewriter.tags" und bestimmt in welchen Tags und Attributen das automatische anhängen der Session-ID, bzw. das Einfügen von hidden-Formularfeldern mit der Session-ID erfolgen soll. Hier ist zu beachten, ob man es mit HTML oder XHTML-Dokumenten zu tun hat. In XHTML dürfen input-Elemente nicht unmittelbar in form-Elementen, sondern müssen innerhalb von Blockelementen (z. B. p, div, fieldset) stehen. Bei HTML muss PHP folgendes generieren:
Code:
Vorher:
<form action="test.html?a=b" method="get">
<input type="text" name="test">
</form>
Nachher:
<form action="test.html?a=b&PHPSESSID=765406fe3d957a8b072f8ff1e0a235c5" method="get">
<input type="hidden" name="PHPSESSID" value="765406fe3d957a8b072f8ff1e0a235c5">
<input type="text" name="test">
</form> |
Dafür muss PHP folgendermaßen konfiguriert werden: In der php.ini:
Code:
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=action" |
Im PHP-Script:
Code:
ini_set( 'url_rewriter.tags' , 'a=href,area=href,frame=src,input=src,form=action' ); |
Wenn die Session-ID nicht im action-Attribut des Form-Elementes eingetragen werden soll, dann ändern Sie den Eintrag 'form=action' nach 'form='.
Bei XHTML sieht die Sache ganz anders aus da, wie bereits gesagt, input-Elemente nicht unmittelbar in form-Elemente stehen dürfen, was auch für unsichtbare input-Elemente, welche von PHP eingefügt werden, gilt. Da PHP unsichtbare input-Elemente nur in form- und/oder fieldset-Elementen einfügen kann, ist man bei XHTML auf das fieldset-Element angewiesen.
Code:
Vorher:
<form action="test.html?a=b" method="get">
<fieldset>
<input type="text" name="test" />
</fieldset>
</form>
Nachher:
<form action="test.html?a=b" method="get">
<fieldset>
<input type="hidden" name="PHPSESSID" value="b192144b71650cece557f442cbcb540e" />
<input type="text" name="test" />
</fieldset>
</form> |
Dafür muss PHP folgendermaßen konfiguriert werden: In der php.ini:
Code:
url_rewriter.tags = "a=href,area=href,frame=src,input=src,fieldset=" |
Im PHP-Script:
Code:
ini_set( 'url_rewriter.tags' , ' a=href,area=href,frame=src,input=src,fieldset=' ); |
Bei diesen Verfahren ist es nicht möglich die session-ID im action-Attribut des form-Elementes einfügen zu lassen - bei "form=action" wird wieder das unsichtbare input-Element ins form-Element eingetragen.
Falls die Session auch für CSS oder Scripts benötigt wird, können auch die link und script-Elemente angepasst werden. Die Ergänzung lautet dann: ,link=href,script=src.
Code:
<?php
ini_set( 'arg_separator.output' , '&' );
ini_set( 'url_rewriter.tags' , 'a=href,area=href,frame=src,input=src,fieldset=,form=action,link=href,script=src' );
?> |
Adressen innerhalb von Javascripts oder andere Adressen, die mit der gleichen Session arbeiten sollen, müssen im PHP-Code ergänzt werden. Zur Ausgabe der Session-ID wird die Funktion session_id() abgefragt. Das ist z.B. bei Weiterleitungen mit META-Refresh (HTML) oder header() (PHP) der Fall.
Code:
<?php
$add_session_id = false;
if(!$_COOKIE['PHPSESSID'])
$add_session_id = '?' . session_name() . '=' . session_id();
?> |
_______________________________________ mfg Thomas Mell
www.validome.org
|
|