2012-05-11 13 views
5

Tengo una pregunta si se me permite. Tengo una variable llamada $source y esto debería contener una ruta relativa a un archivo, por ejemplo ./uploads/2012/some-document.pdfComprobación de una cadena para ver si el archivo existe localmente

Ahora, esta variable $source contendrá la entrada del usuario, a través de $ _GET y $ _POST. No deseo que las personas ingresen URL y solo quiero hacer algo si el archivo existe solo en el servidor local.

Mi pregunta es ¿cuál es la mejor manera de verificar si un archivo existe solo en el servidor local?


Esto es lo que tengo hasta ahora:

1) file_exists puede devolver verdadero en función de la configuración del servidor, por lo que podría utilizar este lado stripos para comprobar si los primeros charatcers de la cadena es http: // así:

if(file_exists($source) && stripos($source,'http://')!==0) { 
    echo 'File exists on local'; 
} 

Sin embargo, el inconveniente sería que tendría que especificar todos los diferentes tipos de URL como https: //, http: // ftp: // sólo para cuidate.

2) Yo uso realpath para obtener la ruta absoluta del archivo, y esto devuelve falso si no se puede encontrar. Esto parece ser bastante sólido, pero no es 100% esta es la mejor aplicación para él

3) Use preg_replace para eliminar todas las menciones de URL en la cadena primero, y luego simplemente use file_exists. Si bien esto probablemente sería el más seguro, probablemente sería el más intenso y preferiría no utilizar este método.

Respuesta

3

Además de las otras respuestas, puede denegar caminos que utilizan un esquema simple con:

if (parse_url($path, PHP_URL_SCHEME)) { 
    // has something:// so ignore 
} 

Esto también funcionaría con envolturas especiales, tales como php://, zlib://, etc ...

También puede forzar un control local en la variable de entrada anteponiendo a file://:

file_exists('file://' . $path); 
+0

Esa es una excelente sugerencia para usar parse_url, creo que file_exists sería bueno. Gracias –

+0

Puede haber problemas en Windows usando file_exists() y is_file() en combinación con archivos remotos. Parece que Windows está descargando o algo así. Mejor use parse_url() y verifique si hay un host vacío. – redaxmedia

2

Vaya con realpath() (junto con file_exists). Filtrará las URL por usted y obtendrá un resultado sólido y confiable sobre si el archivo existe o no.

+0

Gracias, no pensé en combinar esos dos, piensan que van a funcionar bien juntos. Cheers –

Cuestiones relacionadas