2012-07-22 6 views
5

Ho alcune chiamate a is_dir su una pagina. Hanno sempre lavorato senza problemi.PHP: percorso autorizzato open_basedir

Pochi giorni fa, la società di hosting ha aggiornato PHP da 5.2 a 5.3. Da allora, tutte le mie chiamate a is_dir hanno provocato il seguente errore (messaggio):

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 

Questo mi lascia perplesso.

Chiaramente, secondo il messaggio di errore (e php_info pure), la directory /home/virtual/domain.com (senza barra finale, quindi incluse le sottodirectory) è incluso/abilitato in open_basedir, ei file che is_dir sta cercando di scorrere sono tutti situato in sottocartelle sotto quella cartella. Quindi, perché non sono all'interno dei percorsi consentiti, quindi? Chiaramente lo sono!

Stranamente, questo errore sembra per mostrare solo quando is_dir restituisce false, vale a dire, quando il file è non una cartella, ma un normale file. Sembra scorrere tutte le directory senza errori.

Domanda simile pubblicata in precedenza qui: Open_basedir restriction oddness (nessuna soluzione trovata).

Qualcuno ha qualche idea?

(Nota: Modificare le impostazioni di PHP non è un'opzione, in quanto questo è un host condiviso e non ho alcun accesso admin)

+0

fa questo è il messaggio di errore effettivo? O alcuni caratteri speciali sono in qualche modo? – SteAp

+0

Alcuni percorsi hanno alcuni caratteri speciali: '&' (e commerciale) e '_' (sottolineatura). Ma l'errore appare anche per quei percorsi che non contengono alcun carattere speciale (a meno che le lettere maiuscole contino come caratteri speciali). E i caratteri speciali sono tutti nei nomi delle directory (e sono correttamente analizzati e ripetuti nei casi in cui 'is_dir' restituisce 'TRUE'), mai nei nomi dei file (che è dove si verifica l'errore). –

risposta

4

C'è un bug non risolto in PHP che viene attivato quando si apre o si verifica un percorso che ha un file esistente come prefisso e una parte non esistente come suffisso. Nel tuo esempio c'è la parte esistente /home/virtual/domain.com/public_html/galleries/img/002.JPG con il suffisso non esistente / (barra finale nel percorso).

C'è una spiegazione che questo non è un bug: "Questo è un comportamento previsto. Un percorso non esistente che non esiste (quello con la barra) è considerato al di fuori della base. ", Ma io non la penso così. Questo errore si attiva solo se la prima parte del percorso è un file esistente.

bug di PHP:

3

Attiva la risposta era super semplice, ancora del tutto illogico:

Durante la creazione (concatenazione) dei percorsi di iterazione, per qualche motivo ho dovuto codificare in modo hard-code una barra che indica il percorso in alto che termina in img/002.JPG/ con una barra alla fine. La rimozione di questa barra ha corretto l'errore. Questo spiega anche perché non ha fallito nelle directory (che dovrebbero avere barre finali), solo file (che non lo sono).

In base a ciò che la documentazione PHP dice, is_dir() deve restituire TRUE se il percorso specificato rappresenta una directory esistente; e FALSE in tutti gli altri casi, incluso se il file specificato non esiste (il che non corrisponde a img/002.JPG/).

Quindi sono ancora un po 'perplesso sul motivo per cui non ha solo tornare FALSE il modo in cui ha usato in PHP 5.2, ma invece fa questo piuttosto astrusa e francamente solo decisamente sbagliato dichiarazione che il file non è all'interno del percorso consentito ... ma almeno funziona di nuovo ora.