2012-07-22 9 views
5

Ich habe ein paar Anrufe zu is_dir auf einer Seite. Sie haben immer keine Probleme gemacht.PHP: open_basedir erlaubt Pfad

Vor ein paar Tagen hat das Hosting-Unternehmen PHP von 5.2 auf 5.3 aktualisiert. Seitdem alle meine Anrufe is_dir haben in der folgenden Fehler (Meldung) ergab:

Warning: is_dir(): open_basedir restriction in effect. 
File(/home/virtual/domain.com/public_html/galleries/img/002.JPG/) 
is not within the allowed path(s): 
(/home/virtual/domain.com:/home/virtual/_tmp) 
in /home/virtual/domain.com/public_html/index.php on line 201 

Diese mir ein Rätsel.

ist klar, nach der Fehlermeldung (und php_info auch), das Verzeichnis /home/virtual/domain.com (ohne Schrägstrich, also einschließlich der Unterverzeichnisse) enthalten ist/in open_basedir aktiviert und die Dateien, die is_dir versucht, durch iterieren sind alle befindet sich in Unterordnern unter diesem Ordner. Warum also sind sie nicht innerhalb der erlaubten Pfade? Offensichtlich sind sie!

Merkwürdigerweise dieser Fehler scheint nur bis zu zeigen, wenn is_dir false zurück, das heißt, wenn die Datei nicht ein Ordner, sondern eine reguläre Datei. Es scheint durch Verzeichnisse in Ordnung zu iterieren, ohne Fehler zu werfen.

Ähnliche Frage zuvor hier gepostet: Open_basedir restriction oddness (keine Lösung gefunden).

Wer hat irgendwelche Ideen?

(Hinweis: Einstellungen PHP Ändern ist keine Option, da dies ein Hostern ist, und ich habe keinen Zugang admin)

+0

Ist diese Nachricht der tatsächliche Fehler ist? Oder sind bestimmte Sonderzeichen in einem Pfad? – SteAp

+0

Einige Pfade haben einige Sonderzeichen: '&' (Ampersand) und '_' (Unterstrich). Der Fehler tritt jedoch auch bei solchen Pfaden auf, die überhaupt keine Sonderzeichen enthalten (außer Großbuchstaben zählen als Sonderzeichen). Und die Sonderzeichen befinden sich alle in Verzeichnisnamen (und werden in den Fällen, in denen "is_dir" zu "TRUE" führt) korrekt analysiert und iteriert, niemals in Dateinamen (wo der Fehler auftritt). –

Antwort

4

Es gibt einen unfixierten Fehler in PHP, der ausgelöst wird, wenn Sie einen Pfad öffnen oder prüfen, der eine existierende Datei als Präfix und keinen existierenden Teil als Suffix hat. In Ihrem Beispiel existiert der Teil /home/virtual/domain.com/public_html/galleries/img/002.JPG mit dem nicht vorhandenen Suffix / (Schrägstrich im Pfad).

Es gibt eine Erklärung, dass dies kein Fehler ist: "Dies ist das erwartete Verhalten. Ein Nicht-Pfad, der nicht existiert (der mit dem Schrägstrich) wird außerhalb des basedir betrachtet. ", Aber das glaube ich nicht. Dieser Fehler wird nur ausgelöst, wenn der erste Teil des Pfades eine existierende Datei ist.

PHP Bugs:

3

die Antwort doch völlig unlogisch war stellte sich heraus, super einfach,:

Beim Erstellen (Verketten) der Pfade zum Iterieren hatte ich aus irgendeinem Grund einen nachgestellten Schrägstrich festgeschrieben, wie der obige Pfad in img/002.JPG/ mit einem Schrägstrich am Ende endet. Durch Entfernen dieses Schrägstrichs wurde der Fehler behoben. Dies erklärt auch, warum es in Verzeichnissen (die nachgestellte Schrägstriche haben sollen) nicht fehlgeschlagen ist, nur Dateien (die nicht sind).

Geht von was die PHP-Dokumentation sagt, is_dir() sollte TRUE zurückgeben, wenn der angegebene Pfad ein vorhandenes Verzeichnis darstellt; und FALSE in allen anderen Fällen, einschließlich wenn die angegebene Datei nicht existiert (was img/002.JPG/ nicht tut).

Also ich bin immer noch ein bisschen wie zu verwirrt, warum es gerade FALSE kam nicht wieder so, wie es auf 5,2 in PHP verwendet, sondern macht diese eher abstruse und ehrlich gesagt nur geradezu falsch Aussage, dass die Datei nicht ist innerhalb des erlaubten Pfades ... aber zumindest funktioniert es jetzt wieder.