2010-01-06 8 views
13

Tengo un script php que necesita conectarse a una base de datos. Las credenciales para la base de datos se almacenan en otra secuencia de comandos php.Permisos de Unix, leer y ejecutar (contexto PHP)

Si configuré los permisos del archivo de credenciales en 661 para que Public tenga permiso de ejecución pero no de lectura, ¿permite esto que la secuencia de comandos principal acceda a las credenciales y se conecte a la base de datos mientras impide que alguien con una cuenta de usuario servidor de ver los contenidos del archivo de credenciales?

Supongo que estoy confundido en cuanto a la distinción entre leer y ejecutar. ¿Un script php (que se ejecuta como www o algo similar) necesita permiso de lectura para incluir otro script php y usar cualquier contenido dentro? ¿O solo necesita ejecutar? ¿El permiso de lectura da implícitamente permiso de ejecución?

Subpregunta: Si configuro todos mis scripts para que solo tengan permiso de ejecución y no se lean, ¿hay algún inconveniente que deba esperar? Esto supone que dejaré cualquier archivo que necesite permisos de lectura explícitos (archivos de datos) para leer.

Respuesta

9

En lo que respecta a los archivos, el permiso de ejecución es irrelevante para usted: la cuenta de usuario con la que se ejecuta su servidor web necesita permiso para acceder y leer los archivos en cuestión. Para atravesar en un directorio, el usuario también requerirá permiso de ejecución en ese directorio.

Si intenta hacer que sus scripts sean leíbles por el servidor web (supongamos que se ejecuta como la cuenta "www" que pertenece al grupo "www"), y no por otros usuarios en el sistema, esto es lo haría (supone que su cuenta es "miUsuario"):

# Change owner to "myuser" and group to "www" for file(s) in question 
chown myuser:www config.php 

# 640: myuser has rw-, www has r--, world has --- 
chmod 640 config.php 

Si desea evitar que el mundo de la lectura de cualquier archivo en un directorio "secretos", simplemente desactivar el bit de ejecución:

# 750: myuser has rwx, www has r-x, world has --- 
chmod 750 secrets 

Si configura todos los scripts para tener permisos de ejecución pero no de lectura, nadie puede hacer cosa útil con ellos (incluido el servidor web) ;-)

+0

Tenga en cuenta que si otros usuarios tienen acceso para ejecutar su propio código PHP a través del servidor web, esto no los detendrá. En ese caso, tal vez consulte open_basedir o una solución que le permita ejecutar diferentes vhosts/aplicaciones como diferentes usuarios. – oops

+0

Sí, en una inspección más cercana, descubrí que www era un miembro del grupo para el directorio en el que basé mi confusión. No estaba tratando de hackearlo, solo quería emular lo que habían hecho, pero sin solo reflejarlo. – Anthony

12

Los scripts se leen, no se ejecutan. El permiso de ejecución para las secuencias de comandos le dice al cargador o kernel que lea la línea shebang y pase la secuencia de comandos al intérprete nombrado.

+0

Así que si tengo un script en una carpeta llamada "secretos" y tengo secretos configurados para ejecutar solo, alguien que alguna vez tuvo acceso de lectura a secretos (pero ahora no) conectar un nombre de archivo directamente a algo como nano y aún ver los contenidos? Esta es mi verdadera preocupación, supongo. – Anthony

+0

Si "secretos" es un script, no se puede ejecutar si el usuario que ejecuta el intérprete no tiene acceso de lectura al script. Cualquier permiso que solía tener es irrelevante; la única vez que importan los permisos es cuando se abre el archivo, ya sea para leer o para ejecutar. –

Cuestiones relacionadas