Deja-vu

Warning: realpath() - Installation Joomla 1.7

Die Joomla 1.7.0 stable! ist da, also rauf damit auf meinen virtuellen Server.

Ich will kein www-run-Problem also richte ich die Domain mit php fastcgi ein.

Zunächst - bei der Installation - sieht noch alles gut aus. Aber danach ist die Seite voll mit: Warning: realpath() ...

Warning: realpath() [function.realpath]: Unable to access /var/www/vhosts/meineDomain/subdomains/meinJoomla/httpdocs.. .../path.php on line 252

Na das hatte ich doch schon mal Mitte 2010, beim Umzug auf meinen neuen virtuellen Server (Joomla 1.5). Schon damals hatte ich mich über die diversen, nicht gerade hilfreichen Beiträge, in den meisten deutschsprachigen Foren geärgert, die mir empfahlen "... mir einen besseren Hoster zu suchen". Denn das dachte ich gerade getan zu haben. Schließlich war ich der 100% ige Chef auf meinem virtuellen Server!

Auch war bei mir der safe-mode nicht das Problem, denn der war aus. Mal ganz abgesehen davon, dass die Fehlermeldung dann auch anders aussieht! Da kommt zwingend der Text "safe-mode restriction" vor.

Da mir damals keiner erklären wollte, wo das Problem liegt, habe ich es selbst versucht rauszuknobeln. Hier ist das Ergebnis. Da das Problem leider immer noch aktuell ist, habe ich mir jetzt mal die Mühe gemacht, es aufzuschreiben.

Was macht die Funktion realpath()?

Die Funktion ermittelt aus einer übergebene relativen Pfadangabe, den absoluten Pfad.

absoluter Pfad = realpath(relative Pfad)

absoluter Pfad+Dateiname = realpath(relative Pfad+Dateiname)

Was macht die Funktion find($paths, $file), die diese Funktion aufruft?

Sie sucht in einem array aus möglichen Pfaden, die letzte gültige aus und gibt diese als absolute Angabe zurück oder false, wenn keine Datei gefunden wurde.

Soweit so gut, aber woher kommt jetzt der Fehler? Ganz offensichtlich tritt der Fehler nicht bei allen Installationen auf. Deshalb wird in diversen Foren auch immer wieder empfohlen sich einen "ordentlichen" Webpspace zu besorgen, was hier allerdings Blödsinn ist. Das Problem ist liegt nicht beim Provider!

Die PHP-Funktion realpath() funktioniert nur, wenn die Datei bzw. das Verzeichnis existiert!
Ob das jetzt ein Bug ist oder nicht, ist mir egal!

Leider steht im php-Manual, siehe PHP-Manual auf (php.net), nichts eindeutiges drin.

Unter Changelog steht: Bis zur PHP-Version 5.3.0 schlug realpath() auf BSD Systemen nicht fehl, wenn nur die letzte path Komponente nicht existierte. Jetzt schlägt realpath() auch in diesem Fall fehl.

Im Klartext es kommt eine Warnmeldung.

Wenn auf dem Server bzw. dem Webspace die Anzeige von Fehlern auf dem Bildschirm ausgeschaltet, dann wird auch diese Fehler nicht angezeigt.

Ein Auschalten der Anzeige der Fehlermeldung, behebt den Fehler selbst jedoch nicht. In die error.log-Datei wird der Fehler natürlich weiterhin gespeichert.

Unabhängig davon, ob das jetzt ein Bug ist, oder nicht, ist es besser den Fehler in Programm abzufangen. Also zu prüfen, ob es den Verzeichnispfad gibt, bevor man den realpath(Verzeichnispfad) abfragt.

Lösung

In der Datei path.php muss der Quellcode (ca. Zeile 250):

durch

ersetzt werden. Dadurch wird die Funktion realpath() nur noch aufgerufen, wenn es die Datei auch gibt.

Was mich wundert und auch etwas verärgert hat, ist allerdings, dass obwohl das Problem bereits seit längerem bekannt ist, die neue Joomla-Version die paar Zeilen Code nicht direkt eingebaut hat, denn selbst wenn der "Bug"(?) im PHP einmal behoben sein wird, würde diese Änderung weiterhin funktionieren.

Weitere Info's

Was ist ein Traversal-Angriff?

Wenn Zeichen wie '.' und '/' als Buchstaben erkannt und daher dort zu gelassen werden, wo sie gefährlich sind, kann z.B. mit der Zeichenkette '../' ein sogenannter directory traversal-Angriff eingeleitet werden, um auf Dateien in einem Verzeichnis zuzugreifen, bei dem das vom Programm selbst nicht vorgesehen ist.

^