PHP-TUT-16 Permisos para directorios y archivos

Facebooktwittergoogle_pluslinkedinmailFacebooktwittergoogle_pluslinkedinmail
Permisos de ficheros y directorios

Permisos de ficheros y directorios

Cuando se intenta trabajar con archivos es necesario tener permisos para hacerlo. Dicho así suena como una tontería, de tan evidente que parece, pero pensemos un poco en ello. Supongamos que tienes, en un servidor remoto, unos archivos de imagen (fotografías, gráficos, etc.), archivos de texto, de vídeo, de sonido o, incluso, tus propios scripts de PHP. Todos estos archivos pueden ser leídos, re-escritos, eliminados, cambiados de nombre… si se cuenta con los permisos para ello. Por ejemplo, tienes publicado tu sitio en un servidor de Internet. En una de las páginas se le da al cliente la opción de que le envíe una fotografía, mediante un campo de archivo. Esta fotografía, tras pasar los controles adecuados, será almacenada por tu script en un directorio del servidor, tal como aprendimos a hacerlo en un artículo anterior. Este archivo (la imagen) tiene un propietario, que es, en este caso, el intérprete de PHP, ya que se ha grabado mediante un script escrito en este lenguaje. Todos los archivos alojados en el servidor pueden ser gestionados, según los permisos otorgados, por tres niveles de usuarios: el propietario, el grupo y todos los demás.

Éste es un concepto con el que los usuarios de Linux están muy familiarizados, aunque a los de Windows les resultará, probablemente, desconocido. Volviendo al ejemplo de la fotografía, si ahora te conectas mediante un cliente de FTP a tu servidor remoto, accedes con su login y contraseña y tratas de eliminar la fotografía que subió el usuario para tener una copia en tu ordenador, puede que te encuentres con que no puedas hacerlo (dependiendo de los permisos por defecto). Esto se debe a que el programa cliente de FTP no es el propietario de ese archivo.

Cada nivel de usuario puede tener tres tipos de permisos sobre los archivos: de lectura, de escritura y de ejecución. También puede ocurrir que un determinado nivel de usuarios no tenga ningún permiso sobre ciertos archivos. Como norma general, el propietario suele tener todos los permisos sobre sus propios archivos. Cuando alquilas un hosting en un servidor remoto, el segundo nivel de usuarios, el grupo, suele estar formado por un solo usuario, que es el mismo que el propietario. El tercer nivel está formado por todos los demás y lo normal, en un servidor de Internet, es que este grupo no tenga ningún permiso sobre tus archivos.

La cuestión es que tú puedes modificar los permisos de un archivo en concreto, para que, por ejemplo, todos los demás usuarios (el tercer nivel) puedan leerlo, pero no puedan modificarlo ni ejecutarlo. De este modo, ya podrías conectarse a tu servidor mediante un simple navegador y descargarte la fotografía que antes se te negaba.

Los permisos se identifican mediante un sistema de numeración octal, basado en la numeración binaria. El número 4 corresponde al permiso de lectura, el 2 al de escritura y el 1 al de ejecución. Si tú, como propietario de un archivo, quieres establecer permiso de lectura y escritura, pero no de ejecución, usarás el valor 6, que es la suma del valor 4 (lectura) y el 2 (escritura). Para establecer los permisos de un archivo se suman lo valores básicos de cada uno de los tipos de permiso que se puedan otorgar. Los niveles de usuarios y los niveles de permisos aparecen en la tabla siguiente:

TABLA DE PERMISOS PARA FICHEROS
Usuarios
Permisos
Propietario Grupo Otros
Lectura 4 4 4
Escritura 2 2 2
Ejecución 1 1 1

Cuando se otorgan los permisos de un archivo es necesario establecer, en la misma instrucción, los de los tres niveles de usuarios. Suponte que quieres darle a un archivo todos los permisos para el propietario, permiso de lectura para el grupo y ningún permiso para todos los demás usuarios. Sumando los valores que acabamos de ver en la tabla, vemos que el propietario recibe el valor 7 (4+2+1), el grupo recibe el valor 4 y el resto de los usuarios recibe el 0. Así pues, la secuencia adecuada es 740. Cuando se cambian los permisos desde PHP, esta secuencia debe ir siempre precedida por un 0, para asegurarnos de que el intérprete entiende que este número es octal. Por lo tanto, la secuencia definitiva queda así: 0740.

Para cambiar los permisos de un archivo recurrimos a la función chmod(), que recibe dos argumentos. El primero es el nombre del archivo, con la ruta, si es necesario. El segundo es la secuencia de permisos que queremos establecer. También debemos conocer la función fileperms(), que recibe como argumento el nombre de un fichero (y la ruta, si procede), y nos devuelve un valor numérico que indica los permisos actuales de ese fichero. Y aquí se presenta una pequeña dificultad. El valor devuelto por esta función no está en el formato octal habitual de los permisos. Debemos transformarlo a octal y mostrar, solamente, los cuatro últimos caracteres. Esto nos dará la secuencia real de permisos del fichero en cuestión, incluyendo el 0 preliminar que denota un valor octal. Veamos cómo en mostrarPermisos.php:

Como ves, es un código muy simple. Usamos la función fileperms() para recuperar los permisos de un fichero. La secuencia obtenida la formateamos en octal mediante la función printf() que ya conocemos de un artículo anterior, y extraemos los cuatro últimos caracteres de dicha secuencia. Tome nota. Si la función substr() recibe un número negativo para la cuenta de caracteres empieza a contarlos desde el final de la cadena. Al ejecutar este script verás en la página la secuencia 0666, salvo que tu fichero tenga otros permisos asignados (por ejemplo, si está marcado como de “Sólo lectura”). El valor 6 significa permiso de lectura (4) y escritura (2), para los tres niveles de usuarios.

Si, dado un fichero cualquiera, conocida su ruta respecto a nuestro script y su nombre, queremos establecerle determinados permisos, lo haremos muy fácilmente con la función que hemos comentado, así:

chmod ($fichero, 0755);

El valor 0755 es sólo un ejemplo. Pondremos el valor correspondiente a los permisos que queramos establecer, según se ha comentado, y siempre precedido de un 0, para indicar que se trata de un valor octal.

Por supuesto, lo mismo puede aplicarse a directorios. Dada una ruta concreta, podemos establecer permisos:

chmod ($ruta, 0755);

Un comentario final importante. Cuando tu servidor es una máquina corriendo bajo Windows existe una limitación. Esta plataforma no reconoce los tres niveles de usuarios, de modo que los permisos que fijes para el propietario del archivo quedarán también para el grupo y el resto de usuarios. Si por ejemplo, das permisos de lectura y escritura al propietario, y sólo de lectura al grupo y al resto, todos tendrán permisos de lectura y escritura. Esta limitación no existe si tu servidor está corriendo en una máquina bajo Linux o cualquier otra plataforma Unix. Esto se debe a que la función chmod() hace uso de las atribuciones de gestión de permisos del propio sistema operativo. Muchos servidores profesionales son Linux, pero si alguna vez trabajas para un servidor Windows recuerda esta circunstancia. Sólo cuenta el propietario de los archivos.

     

Un comentario:

  1. Pingback: PHP-TUT-21 Gestión de imágenes (II) » eldesvandejose.com

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *