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

13

ATUALIZADO PARA MAIS CLARIDADE:

De acordo com http://expressionengine.com/user_guide/installation/installation.html , ele 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 para permitir que o PHP grave em arquivos (666) e pastas (777) . Nos servidores Windows, o seguinte não se aplicará, mas você precisará garantir que os arquivos e pastas sejam graváveis ​​pelo ExpressionEngine. Pode ser necessário entrar em contato com seu host 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 parece que eu preciso permitir que o PHP faça isso também?

PERGUNTA ORIGINAL:

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

Como eu faço isso?

oshirowanen
fonte
2
Não tenho certeza de qual problema você está tentando resolver? Se você puder acessar o diretório em que o arquivo está localizado e tiver permissão de execução, poderá gravar em arquivos e diretórios com essas permissões.
194 Karlson
Adicionado mais detalhes acima.
Oshirowanen
11
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 para permitir que o PHP grave em arquivos (666) e pastas (777) - Falta um coma? caso contrário, essa frase não faz sentido. A menos que o diretório de nível superior seja restrito, você não terá problemas ao gravar em arquivos ou diretórios graváveis ​​no mundo.
194 Karlson
Acabei de copiar e colar a partir da documentação. Além disso, é a razão pela qual eu postei a pergunta como eu não entendo o que isso significa quote ...
oshirowanen
11
Se você vir a documentação sugerindo o uso de 666 ou 777 em relação aos arquivos da web, provavelmente deverá ignorá-la, a menos que haja um bom motivo para isso. Geralmente, é algo escrito por alguém que não conseguiu descobrir como configurar as permissões corretas e desistiu e deu a todos acesso de leitura ou gravação aos arquivos.
Jsbillings

Respostas:

18

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.

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

Localizando o Nome de Usuário do Servidor da Web

Primeiro, você precisará saber o nome de usuário sob o qual o servidor da web é executado. Se você estiver usando Apache, pode ser apacheou httpd, www-dataetc. Na maioria Debian-like sistemas, 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 esse comando retorne seja coerente (por exemplo, eu uso o nginx 99% do tempo, mas esse comando retorna tomcat7, um servidor da Web Java que instalei uma vez) .


Conceder permissões ao servidor da Web: usando chmodechown

Fazer chmod666 ou 777 (a solução ideal para esse tipo de problemas em documentações / tutoriais ruins) pode fazer magicamente as coisas funcionarem, mas é inseguro. A concessão de 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 na sua máquina - mas na verdade não, evite fazer isso, a menos que seja apenas para teste / solução de problemas).

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

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

Mas o mais provável é que você queira manter 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 -----) , configure-o para 660 (6 para você, 6 para www- dados, 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 manipular números misteriosos chmod, você também pode usar esta sintaxe:

chmod -R g+rw your/folder/

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

Em 90% dos casos, isso deve ser suficiente.


Meu método preferido: usando ACLs (lista de controle de acesso)

Às vezes, a primeira solução não é suficiente. Vou usar o exemplo do Symfony Framework que registra e armazena em cache muitos dados. Portanto, ele precisa de 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 a Web (usuário do servidor da web). Isso causa muitos problemas porque o Symfony está constantemente modificando as permissões.

Nesse caso, usaremos a ACL (Lista de controle de acesso), que é uma maneira mais avançada de gerenciar permissões em muitos sistemas UNIX.

Aqui estão os comandos fornecidos pela documentação oficial do Symfony ( altere app/cachee de acordo app/logscom as suas necessidades ):

Em um sistema que suporta chmod +a(ie. 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(o mais comum)

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

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

sudo apt install acl

Caso contrário, siga a documentação do 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

Eu nunca tive problemas com esse método, satisfeito ou com seu dinheiro de volta.

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

Não importa quem é o proprietário dos arquivos, 666 permissões e 777 seriam suficientes: o último dígito garante que todos os usuários do sistema tenham acesso. Embora essa seja a maneira mais fácil de fazer isso, definitivamente não é a mais segura por esse motivo exato.

Uma maneira melhor de fazer isso

A primeira coisa que você precisa entender é como as permissões do Unix funcionam . No interesse de entender a resposta que eu dei neste link, observe que as permissões podem ser traduzidas para números:

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

A chmod 666é 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 da web. Aqui está um exemplo de como fazer isso (você pode substituir o Apache pelo nome do seu servidor da web).

Depois de saber qual é o usuário que está executando os scripts e qual é o proprietário dos arquivos mencionados, é sua responsabilidade definir as permissões apropriadas. Lembre-se de que conceder acesso de gravação (mesmo leitura) a todos os usuários do sistema pode ser potencialmente desastroso.

rahmu
fonte
0

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

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

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

No entanto, conforme as instruções do EE, pergunte ao seu provedor de hospedagem, porque alguns não usam o mod_php, mas um fastcgi, suphp ou versão diferente. Esses servidores executam o PHP como seu próprio usuário; portanto, todos os arquivos que você carrega já são legíveis e graváveis ​​pelo PHP e por qualquer arquivo criado pelos scripts EE. Nesse caso, os arquivos e diretórios acessados ​​pelo PHP precisariam ter acesso 600 e 700. Outros arquivos a serem acessados ​​diretamente pelo servidor da web (não o tempo de execução do PHP) ainda precisariam de acesso 666 e 777).

MV.
fonte