Dar permiso a PHP para escribir en archivos y carpetas

Dar permiso a PHP para escribir en archivos y carpetas

ACTUALIZADO PARA MAYOR CLARIDAD:

De acuerdo ahttp://expressionengine.com/user_guide/installation/installation.html, dice:

Para la mayoría de los hosts Unix, lo siguiente es típico, pero puede consultar con su host para ver si se pueden usar permisos más restrictivos parapermitir que PHP escriba en archivos (666) y carpetas (777). En servidores Windows, lo siguiente no se aplicará, pero deberá asegurarse de que ExpressionEngine pueda escribir en los archivos y carpetas. Es posible que deba comunicarse con su anfitrión para esto.

No estoy seguro que significa esto. Puedo cambiar los archivos y carpetas específicos a 666 y 777 respectivamente, donde soy el chown'er, pero lo anterior parece que necesito permitir que PHP haga esto también.

PREGUNTA ORIGINAL:

Necesito asegurarme de que PHP pueda escribir en archivos específicos (666) y carpetas (777).

¿Cómo hago esto?

Respuesta1

Completaré las respuestas de rahmu y MV con una solución técnica. Todo lo que sigue es válido sólo para sistemas tipo UNIX.

Desplácese más allá de la sección chmod/chown para ver un ejemplo usando ACL, una herramienta más poderosa que los modos de archivo UNIX.

Encontrar el nombre de usuario de su servidor web

Primero, necesitará saber el nombre de usuario con el que se ejecuta su servidor web. Si está utilizando Apache, puede ser apacheo httpd, www-data, etc. En la mayoría de los sistemas tipo Debian, Apache es www-data. Para nginx, generalmente, también es www-data.

Para comprobarlo, prueba:

ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1

Asegúrese de que el nombre de usuario que devuelve este comando sea coherente(por ejemplo, uso nginx el 99% del tiempo, pero este comando devuelve tomcat7un servidor web Java que instalé una vez).


Dar permisos al servidor web: usar chmodychown

Hacer un chmod666 o 777 (la solución ideal para ese tipo de problemas en malas documentaciones/tutoriales) puede hacer que las cosas funcionen mágicamente, pero es inseguro. Dar permisos 666 o 777 dará acceso a "otros". Entonces, no solo Apache, sino también grandmothery nsa(siempre que esas cuentas de usuario existan en su máquina, pero en realidad no, evite hacer esto a menos que sea solo para probar/solucionar problemas).

Es mejor ser más específico y otorgar permisos solo a usted y a Apache. Cambie el grupo de sus archivos para darle control total sobre sus archivos al servidor web. Para ello, cambie el propietario de forma recursiva:

chown -R www-data:www-data your/folder/

Pero lo más probable es que quieras mantener el acceso completo a tus archivos cambiando únicamente el grupo:

chown -R yourusername:www-data your/folder/

Luego, haz lo apropiado chmodpara darle al grupo www-datalos mismos permisos que tú. Por ejemplo, si el modo actual es 640(6 para usted, 4 para www-data, 0 para otros, traducido a -rw-r-----), configúrelo en 660(6 para usted, 6 para www-data, 0 para otros, traducido a -rw-rw----). Consulte la respuesta de rahmu para obtener más información sobre los modos de archivo; es un mecanismo antiguo, aunque elegante.

Para evitar manipular números arcanos con chmod, también puedes usar esta sintaxis:

chmod -R g+rw your/folder/

Significa "al grupo ( g), agregar ( ) permisos +de lectura y escritura ( ) en la carpeta , de forma recursiva ( )".rwyour/folder/-R

En el 90% de los casos esto debería ser suficiente.


Mi método preferido: usar ACL (Lista de control de acceso)

A veces la primera solución no es suficiente. Tomaré el ejemplo deMarco Symfonyque registra y almacena en caché una gran cantidad de datos. Por lo que necesita acceso de escritura a la carpeta apropiada.

Y el método chmod/ chownpuede no ser suficiente cuando utilizas en paralelo la Consola Symfony en CLI (bajo mi cuenta de usuario) y la Web (usuario del servidor web). Esto causa muchos problemas porque Symfony modifica los permisos constantemente.

En este caso, usaremos la ACL (Lista de control de acceso), que es una forma más avanzada de administrar permisos en muchos sistemas UNIX.

Aquí los comandos dados por la documentación oficial de Symfony (por favor cambia app/cachey app/logsa tus necesidades):

En un sistema que admita chmod +a(es decir, no Debian/Ubuntu)

sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs
sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" app/cache app/logs

En un sistema que no admite chmod +a(el más común)

Necesitará la setfaclherramienta; tal vez esté instalado en su sistema de forma predeterminada, así que intente setfacl -vver si el comando está disponible.

Si el comando no está disponible,yestás usando Ubuntu 14.04+, solo tendrás que instalar la herramienta:

sudo apt install acl

De lo contrario, siga la documentación de su sistema operativo, ya que es posible que necesite cambiar la forma en que se monta su partición (Documentación de Ubuntu aquí).

Y ahí estamos:

sudo setfacl  -R -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs
sudo setfacl -dR -m u:"www-data":rwX -m u:`whoami`:rwX app/cache app/logs

Nunca tuve ningún problema con este método, satisfecho o te devolvemos tu dinero.

Respuesta2

No importa quién sea el propietario de los archivos, 666 permisos y 777 serían suficientes: el último dígito asegura quecadael usuario del sistema tiene acceso. Si bien esta es la forma más fácil de hacerlo, definitivamente no es la más segura por esa misma razón.

Una mejor manera de hacerlo

Lo primero que debes entender escómo funcionan los permisos de Unix. Para comprender la respuesta que di en este enlace, tenga en cuenta que los permisos se pueden traducir a números:

  • 0:---
  • 1:--x
  • 2:-w-
  • 3:-wx
  • 4:r--
  • 5:r-x
  • 6:rw-
  • 7:rwx

Entonces A chmod 666equivale a cambiar los permisos a rw-rw-rw.

A continuación debes averiguar cuál es el usuario que está ejecutando el script PHP. Normalmente, ese sería el usuario que ejecuta su servidor web.Aquí tienes un ejemplo de cómo hacer esto.(puedes reemplazar Apache con el nombre de tu servidor web).

Una vez que sepa cuál es el usuario que ejecuta los scripts y cuál es el propietario de los archivos que menciona, depende de usted establecer los permisos adecuados. Tenga en cuenta que dar acceso de escritura (incluso lectura) acadausuario en su sistema puede ser potencialmente desastroso.

Respuesta3

Expression Engine es como muchas otras aplicaciones web PHP que necesitan acceso de lectura+escritura a algunos archivos y directorios. Por ejemplo, EE requiere acceso de escritura a sus archivos config.php y base de datos.php, y acceso de escritura a sus directorios de carga de archivos.

Lo que indica la documentación es que, como la mayoría de los servidores ejecutan PHP como mod_php (y por lo tanto se ejecutan con los permisos del servidor web), y como probablemente cargará sus archivos con FTP (o similar) usando su propio usuario, esos archivos y Los directorios deberán tener los permisos 666 (todos pueden leer y escribir) y 777 (todos pueden leer, escribir y navegar).

Esa no es la forma más segura, pero ciertamente es la más fácil, especialmente si estás utilizando un servicio de hosting.

Sin embargo, como dicen las instrucciones de EE, pregúntele a su proveedor de alojamiento, porque algunos no usan mod_php sino fastcgi, suphp o una versión diferente. Esos servidores ejecutan PHP como su propio usuario, por lo que todos los archivos que cargue ya se pueden leer y escribir en PHP y en cualquier archivo creado por los scripts EE. En ese caso, los archivos y directorios a los que se accede mediante PHP deberían tener acceso 600 y 700. Otros archivos a los que el servidor web puede acceder directamente (no el tiempo de ejecución de PHP) aún necesitarían acceso 666 y 777).

información relacionada