Dar permiso de PHP para escribir en archivos y carpetas

13

ACTUALIZADO PARA MAYOR CLARIDAD:

De acuerdo con http://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 para permitir que PHP escriba en archivos (666) y carpetas (777) . En los servidores de Windows, lo siguiente no se aplicará, pero deberá asegurarse de que ExpressionEngine pueda escribir en los archivos y carpetas. Es posible que deba contactar a 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 también haga esto?

PREGUNTA ORIGINAL:

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

¿Cómo hago esto?

oshirowanen
fuente
2
¿No estoy seguro de qué problema estás tratando de resolver? Si puede acceder al directorio donde se encuentra el archivo y tiene permiso de ejecución, puede escribir en archivos y directorios con esos permisos.
Karlson
Se agregaron más detalles arriba.
oshirowanen
1
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 para permitir que PHP escriba en archivos (666) y carpetas (777) : ¿falta un coma? de lo contrario, esta frase no tiene ningún sentido. A menos que el directorio de nivel superior esté restringido, no tendrá problemas para escribir en archivos o directorios de escritura mundial.
Karlson
Acabo de copiar y pegar de la documentación. Además, es la razón por la que he publicado la pregunta que yo no entiendo lo que los medios de cotización ...
oshirowanen
1
Si ve documentación que sugiere que usa 666 o 777 en relación con archivos web, probablemente debería ignorarlo a menos que se explique una buena razón. Por lo general, es algo escrito por alguien que no pudo entender cómo configurar los permisos correctos, y se dio por vencido y dio a todos acceso de lectura o escritura a los archivos.
jsbillings

Respuestas:

18

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

Desplácese por la sección chmod / chown para ver un ejemplo con 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á usando Apache, que puede ser apacheo httpd, www-data, etc. En la mayoría de Debian-como sistemas, Apache es www-data. Para nginx, en general, también lo es www-data.

Para comprobarlo, intente:

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 tomcat7, un servidor web Java que instalé una vez) .


Otorgar permisos al servidor web: usar chmodychown

Haciendo un chmod 666 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. Otorgar 666 o 777 permisos 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 hacerlo a menos que sea solo para pruebas / solución de problemas).

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

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

Pero lo más probable es que desee mantener el acceso completo a sus archivos cambiando solo el grupo:

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

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

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

chmod -R g+rw your/folder/

Significa "para el grupo ( g), agregar ( +) leer y escribir ( rw) permisos en la carpeta your/folder/, recursivamente ( -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 de Symfony Framework que registra y almacena en caché una gran cantidad de datos. Por lo tanto, necesita acceso de escritura a la carpeta correspondiente.

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

En este caso, utilizaremos 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 cambie app/cachey app/logssegún sus 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ás la setfaclherramienta; tal vez esté instalado en su sistema de manera predeterminada, así que intente setfacl -vver si el comando está disponible.

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

sudo apt install acl

De lo contrario, siga la documentación de su sistema operativo, ya que es posible que deba 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 le devolvemos su dinero.

Morgan Touverey Quilling
fuente
1
+1 para 'ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | cabeza -1 | cut -d \ -f1 '
Amar Pratap
4

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

Una mejor manera de hacerlo

Lo primero que debe comprender es cómo funcionan los permisos de Unix . En aras de 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

UNA chmod 666 es entonces equivalente a cambiar los permisos arw-rw-rw .

A continuación, debe averiguar cuál es el usuario que está ejecutando el script PHP. Normalmente ese sería el usuario que ejecuta su servidor web. Aquí hay un ejemplo de cómo hacer esto (puede reemplazar Apache con el nombre de su 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 apropiados. Tenga en cuenta que otorgar acceso de escritura (incluso lectura) a todos los usuarios de su sistema puede ser potencialmente desastroso.

rahmu
fuente
0

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 database.php, y acceso de escritura a sus directorios de carga de archivos.

Lo que dice la documentación es que, como la mayoría de los servidores ejecutan PHP como mod_php (y se ejecutan con los permisos del servidor web), y como probablemente cargará sus archivos con FTP (o similar) utilizando su propio usuario, esos archivos y los directorios deberán tener 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á utilizando un servicio de alojamiento.

Sin embargo, como indican las instrucciones de EE, pregunte a su proveedor de alojamiento, porque algunos no usan mod_php sino un fastcgi, suphp o una versión diferente. Esos servidores ejecutan PHP como su propio usuario, por lo que todos los archivos que carga ya son legibles y escribibles por PHP y por cualquier archivo creado por los scripts EE. En ese caso, los archivos y directorios a los que accede PHP necesitarían tener acceso 600 y 700. Otros archivos a los que debe acceder directamente el servidor web (no el tiempo de ejecución de PHP) aún necesitarían acceso 666 y 777).

MV.
fuente