ich uebergebe einen Link als Parameter, der wiederrum Parameter enthaelt, also z.B.
frage.php?link=antwort.php?m=5&x=t
Dank Michael Schröpl weiss ich nun, dass ich da noch ein paar Sonderzeichen zu viel drin habe.
Das kommt drauf an. In URIs resp. jeweils bestimmten Teilen einer URI haben bestimmte Zeichen eine besondere Bedeutung. Wenn man diese Zeichen verwenden will, ohne dass sie diese besondere Bedeutung haben, muss man sie entsprechend maskieren. Wie es hier richtig wäre, lässt sich ohne weitere Informationen nicht sagen.
Im Abfrageteil (nach dem Fragezeichen) haben die Zeichen ";", "/", "?", ":", "@", "&", "=", "+", ",", und "$" gegebenenfalls eine besondere Bedeutung. Ob das im Endeffekt zutrifft, legt das URI-Schema und derjenige, der Software schreibt, die diese URI verarbeitet fest. Andere Zeichen sollten in jedem Fall keine besondere Bedeutung haben, das würde sonst zu einem Problem.
Gehen wir vom Normalfall aus, dass nur "&" hier eine besondere Bedeutung hat, dann ergäbe sich daraus
% perl -MURI -MData::Dumper -e
"print Dumper { URI->new('frage.php?link=antwort.php?m=5&x=t')
->query_form }"
$VAR1 = {
'x' => 't',
'link' => 'antwort.php?m=5'
};
Die URI hat zwei Abfrageparameter, 'link' und 'x' (durch das '&' voneinander getrennt). Du hast vielleicht aber gemeint, dass sie nur einen Parameter 'link' hat, dann hättest du das '&' entsprechend maskieren müssen, also
frage.php?link=antwort.php?m=5%26x=t
Das Fragezeichen solltest du auch maskieren, damit Software gar nicht auf die Idee kommt, das Fragezeichen könnte eine besondere Bedeutung haben:
frage.php?link=antwort.php%3Dm=5%26x=t
Wenn man dann konsequent sein will, müssten die Gleichheitszeichen auch maskiert werden:
frage.php?link=antwort.php%3Fm%3D5%26x%3Dt
Das erste Gleichheitszeichen darf natürlich nicht maskiert werden, es ist ja absichtlich so, dass es eine besondere Bedeutung hat.
Auf der sicheren Seite bist du natürlich dann, wenn du gute Software zur Erstellung der Software verwendest, die macht sowas dann automatisch, z.B.
% perl -w
use strict;
use URI;
my $uri = URI->new('frage.php');
$uri->query_form( link => 'antwort.php?m=5&x=t' );
print $uri->as_string;
Das ergibt dann
frage.php?link=antwort.php%3Fm%3D5%26x%3Dt
Das kennen wir ja schon von oben :-)
Ich habe mal ein Modul für PHP geschrieben, das dieselbe Funktionalität bereitstellt, die letzte "veröffentlichte" Version ist allerdings unvollständig, undokumentiert, veraltet und wird nicht mehr gewartet... Wen es dennoch interessiert:
http://groups.google.com/groups?selm=39863d6b.19823424%40news.bjoern.hoehrmann.de
Also hier die Frage:
mit welchen Sonderzeichen bin ich DEFINITIV auf der sicheren Seite?
Das steht in RFC 2396
http://www.ietf.org/rfc/rfc2396.txt
Als Faustregel kann ich dir nur sagen, maskieren schadet nie, solange man Zeichen mit besonderer Bedeutung in Ruhe lässt.
Die Site soll auch vom Ausland aus problemlos funktionieren und da ich mich irgendwann schon mal vergeblich mit 'µ' rumgeschlagen habe (3 Stunden in einem InternetCafe in ChiangMai, Thailand, um meinen eMail-Client wieder zum Laufen zu bringen...), will ich das diesmal ausschliessen.
Nicht-ASCII-Zeichen (so wie Umlaute) sind in URIs ein Thema für sich...