Markus: Frage zu dirname($_SERVER['PHP_SELF'])

Guten Morgen (hilfe ist ja schon wieder so spät/früh),

ich habe eine Frage zu diesen Konstrukt:

$link='http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/'.'index.php';

Bis vor kurzen habe ich noch Apache und PHP4 benuzt, dort kam da http://domain.de/index.php raus. Nun bin ich auf PHP5 und Lighttpd umgestiegen. Nun ist daraus http://domain.de//index.php geworden. Das zu korrigieren ist ja kein Problem. Nur woher kommt das, das ich mal den Schrägstrich hinzufügen muss und mal nicht? Kommt das durch den anderen Webserver oder die andere PHP-Version? Oder ist das an Anzeichen das ich irgendetwas falsch konfiguriert habe?

Ich weiß das man ganz einfach Abfragen kann ob der Schrägstrich hinzugefügt werden muss oder nicht aber bevor ich das tuhe wüsste ich halt gerne woher dieses Problem rührt :)

Gruß

Markus

  1. echo $begrüßung;

    $link='http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/'.'index.php';

    Bis vor kurzen habe ich noch Apache und PHP4 benuzt, dort kam da http://domain.de/index.php raus. Nun bin ich auf PHP5 und Lighttpd umgestiegen. Nun ist daraus http://domain.de//index.php geworden. [...]Nur woher kommt das, das ich mal den Schrägstrich hinzufügen muss und mal nicht? Kommt das durch den anderen Webserver oder die andere PHP-Version?

    Das ist durchaus möglich. Auf den Inhalt von $_SERVER hat PHP keinen Einfluss (vielleicht von PHP_SELF mal abgesehen). Man sollte sich nicht darauf verlassen, ein bestimmtes Feld auf allen Server-Konstellationen anzutreffen oder deren Inhalt als nur-so-und-nicht-anders vorzufinden.

    Oder ist das an Anzeichen das ich irgendetwas falsch konfiguriert habe?

    Glaub ich nicht.

    Ich weiß das man ganz einfach Abfragen kann ob der Schrägstrich hinzugefügt werden muss oder nicht [...]

    Ja, man kann sich dazu des wenig bekannten zweiten Parameters von (l|r)trim() bedienen:

    $foo = '/' . trim(dirname(...), '/') . '/';

    Dies ergibt garantiert nur jeweils ein / am Anfang und Ende von $foo.

    echo "$verabschiedung $name";

    1. Hallo,

      erstmal danke für euere Hilfe. Ich habe das Problem so gelöst, das ich in einer Config Datei die Adresse einmal richtig manuell angebe. Bei der trim Methode muss man glaube auch noch aufpassen das dirname($_SERVER['PHP_SELF'] nicht leer ist (also Basispfad), da man sonst auch wieder diesen domein.de//index.php bekommt.

      Gruß

      Markus

  2. Hallo!

    $link='http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/'.'index.php';

    Kleiner (Sicherheits-)Hinweis:
    Nimm statt $_SERVER['HTTP_HOST'] lieber $_SERVER['SERVER_NAME'] und validiere und escape $_SERVER['PHP_SELF'].
    Warum:
    http://blog.phpdoc.info/archives/13-XSS-Woes.html

    $_SERVER['HTTP_HOST'] gehört zu den Daten, die u.U. vom User manipuliert werden können. Wenn dann noch der Server schlecht konfiguriert (default-vhost) ist, kann ein Sicherheitsproblem entstehen. Ja, das ist eher selten, aber $man sollte sich nicht unbedingt darauf verlassen.

    $_SERVER['SERVER_NAME'] stammt aus dem vhost und ist nicht durch den User manipulierbar IMHO.

    MfG
    Erik