Dando permissão ao PHP para gravar em arquivos e pastas

Dando permissão ao PHP para gravar em arquivos e pastas

ATUALIZADO PARA MAIS CLAREZA:

De acordo comhttp://expressionengine.com/user_guide/installation/installation.html, diz:

Para a maioria dos hosts Unix, o seguinte é típico, mas você pode verificar com seu host se permissões mais restritivas podem ser usadas parapermitir que o PHP grave em arquivos (666) e pastas (777). Em servidores Windows, o seguinte não se aplica, mas você precisará garantir que os arquivos e pastas possam ser gravados pelo ExpressionEngine. Pode ser necessário entrar em contato com seu anfitrião para isso.

Não tenho certeza do que isso significa. Posso alterar os arquivos e pastas específicos para 666 e 777, respectivamente, onde sou o chown'er, mas o que foi dito acima parece que preciso permitir que o PHP faça isso também?

PERGUNTA ORIGINAL:

Preciso garantir que o PHP possa gravar em arquivos (666) e pastas (777) específicos.

Como eu faço isso?

Responder1

Completarei as respostas de rahmu e MV com uma solução técnica. Tudo o que se segue é válido apenas para sistemas do tipo UNIX.

Passe pela seção chmod/chown para ver um exemplo usando ACLs - uma ferramenta mais poderosa que os modos de arquivo UNIX.

Encontrando o nome de usuário do seu servidor web

Primeiro, você precisará saber o nome de usuário com o qual seu servidor web é executado. Se você estiver usando Apache, pode ser apacheou httpd, www-data, etc. Na maioria dos sistemas do tipo Debian, Apache é www-data. Para nginx, geralmente, também é www-data.

Para conferir, tente:

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

Certifique-se de que o nome de usuário que este comando retorna seja coerente(por exemplo, eu uso nginx 99% do tempo, mas este comando retorna tomcat7um servidor web Java que instalei uma vez).


Dando permissões ao servidor web: usando chmodechown

Fazer um chmod666 ou 777 (a solução ideal para esse tipo de problema em documentações/tutoriais ruins) pode fazer as coisas funcionarem magicamente, mas é inseguro. Conceder permissões 666 ou 777 dará acesso a "outros". Portanto, não apenas o Apache, mas também grandmothere nsa(desde que essas contas de usuário existam em sua máquina - mas não, evite fazer isso, a menos que seja apenas para teste/solução de problemas).

É melhor ser mais específico e dar permissões apenas para você e o Apache. Altere o grupo de seus arquivos para dar controle total sobre seus arquivos ao servidor web. Para fazer isso, altere o proprietário recursivamente:

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

Mas provavelmente você deseja manter o acesso total aos seus arquivos alterando apenas o grupo:

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

Em seguida, faça o apropriado chmodpara conceder ao grupo www-dataas mesmas permissões que você. Por exemplo, se o modo atual for 640(6 para você, 4 para www-data, 0 para outros, traduzindo para -rw-r-----), defina-o para 660(6 para você, 6 para www-data, 0 para outros, traduzindo para -rw-rw----). Veja a resposta de rahmu para saber mais sobre os modos de arquivo, é um mecanismo antigo, porém elegante.

Para evitar a manipulação de números misteriosos chmod, você também pode usar esta sintaxe:

chmod -R g+rw your/folder/

Significa "ao grupo ( g), adicione ( ) permissões +de leitura e gravação ( ) na pasta , recursivamente ( )".rwyour/folder/-R

Em 90% dos casos, isso deveria ser suficiente.


Meu método preferido: usando ACLs (Lista de Controle de Acesso)

Às vezes a primeira solução não é suficiente. Vou pegar o exemplo deEstrutura Symfonyque registra e armazena em cache muitos dados. Portanto, é necessário acesso de gravação à pasta apropriada.

E o método chmod/ chownpode não ser suficiente, quando você estiver usando em paralelo o Symfony Console na CLI (na minha conta de usuário) e na Web (usuário do servidor web). Isso causa muitos problemas porque o Symfony modifica constantemente as permissões.

Neste caso, usaremos a ACL (Access Control List), que é uma forma mais avançada de gerenciar permissões em muitos sistemas UNIX.

Aqui estão os comandos dados pela documentação oficial do Symfony (por favor mude app/cachee app/logsde acordo com suas necessidades):

Em um sistema compatível chmod +a(ou seja, não 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

Em um sistema que não suporta chmod +a(mais comum)

Você precisará da setfaclferramenta; talvez esteja instalado em seu sistema por padrão, então tente setfacl -vver se o comando está disponível.

Se o comando não estiver disponível,evocê está usando o Ubuntu 14.04+, basta instalar a ferramenta:

sudo apt install acl

Caso contrário, siga a documentação do seu sistema operacional, pois pode ser necessário alterar a forma como sua partição é montada (Documentação do Ubuntu aqui).

E aí estamos nós:

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 tive problemas com esse método, satisfeito ou seu dinheiro de volta.

Responder2

Não importa quem é o proprietário dos arquivos, 666 permissões e 777 seriam suficientes: o último dígito garante quetodousuário no sistema tem acesso. Embora esta seja a maneira mais fácil de fazer isso, definitivamente não é a mais segura exatamente por esse motivo.

Uma maneira melhor de fazer isso

A primeira coisa que você precisa entender écomo funcionam as permissões Unix. Para entender a resposta que dei neste link, observe que as permissões podem ser traduzidas em números:

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

A chmod 666é então equivalente a alterar as permissões para rw-rw-rw.

Em seguida, você precisa descobrir qual é o usuário que está executando o script PHP. Normalmente esse seria o usuário executando seu servidor web.Aqui está um exemplo de como fazer isso(você pode substituir Apache pelo nome do seu servidor web).

Depois de saber qual é o usuário que está executando os scripts e qual é o proprietário dos arquivos mencionados, cabe a você definir as permissões apropriadas. Lembre-se de que conceder acesso de gravação (até mesmo leitura) atodousuário em seu sistema pode ser potencialmente desastroso.

Responder3

O Expression Engine é como muitos outros aplicativos da web PHP que precisam de acesso de leitura e gravação a alguns arquivos e diretórios. Por exemplo, EE requer acesso de gravação aos seus arquivos config.php e database.php e acesso de gravação aos seus diretórios de upload de arquivos.

O que a documentação está afirmando é que, como a maioria dos servidores executam PHP como mod_php (e então rodam com as permissões do servidor web), e como você provavelmente fará upload de seus arquivos com FTP (ou similar) usando seu próprio usuário, esses arquivos e os diretórios precisarão receber permissões 666 (todos podem ler e escrever) e 777 (todos podem ler, escrever e navegar).

Essa não é a forma mais segura, mas certamente é a mais fácil, principalmente se você estiver utilizando um serviço de hospedagem.

Porém, como afirmam as instruções do EE, pergunte ao seu provedor de hospedagem, pois alguns não usam mod_php, mas sim um fastcgi, suphp ou versão diferente. Esses servidores executam PHP como seu próprio usuário, portanto, todos os arquivos que você carrega já podem ser lidos e gravados pelo PHP e por qualquer arquivo criado pelos scripts EE. Nesse caso, os arquivos e diretórios acessados ​​pelo PHP precisariam receber acesso 600 e 700. Outros arquivos a serem acessados ​​diretamente pelo servidor web (não pelo tempo de execução do PHP) ainda precisariam de acesso 666 e 777).

informação relacionada