Quando um aplicativo PHP faz uma conexão com o banco de dados, é claro que geralmente precisa passar um login e senha. Se eu estiver usando um único login de permissão mínima para o meu aplicativo, o PHP precisará conhecer esse login e senha em algum lugar. Qual é a melhor maneira de proteger essa senha? Parece que apenas escrevê-lo no código PHP não é uma boa ideia.
404
Respostas:
Várias pessoas interpretaram isso incorretamente como uma pergunta sobre como armazenar senhas em um banco de dados. Isso esta errado. É sobre como armazenar a senha que lhe permite obter a base de dados.
A solução usual é mover a senha do código-fonte para um arquivo de configuração. Em seguida, deixe a administração e a proteção desse arquivo de configuração para os administradores do sistema. Dessa forma, os desenvolvedores não precisam saber nada sobre as senhas de produção e não há registro da senha no seu controle de origem.
fonte
Se você estiver hospedando no servidor de outra pessoa e não tiver acesso fora do seu webroot, sempre poderá colocar sua senha e / ou conexão com o banco de dados em um arquivo e bloqueá-lo usando um .htaccess:
fonte
A maneira mais segura é não ter as informações especificadas no seu código PHP.
Se você estiver usando o Apache, significa definir os detalhes da conexão no arquivo httpd.conf ou no arquivo de hosts virtuais. Se você fizer isso, poderá chamar mysql_connect () sem parâmetros, o que significa que o PHP nunca exibirá suas informações.
É assim que você especifica esses valores nesses arquivos:
Então você abre sua conexão mysql assim:
Ou assim:
fonte
ini_get()
.but any user (or a hacker abusing badly written php script) can read the password via ini_get()
Como você lida com isso?ini_get()
ougetenv()
.Armazene-os em um arquivo fora da raiz da web.
fonte
include('../otherDirectory/configfile.conf')
?Para sistemas extremamente seguros, criptografamos a senha do banco de dados em um arquivo de configuração (que é protegido pelo administrador do sistema). Na inicialização do aplicativo / servidor, o aplicativo solicita ao administrador do sistema a chave de descriptografia. A senha do banco de dados é então lida no arquivo de configuração, descriptografada e armazenada na memória para uso futuro. Ainda não é 100% seguro, pois é armazenado na memória descriptografado, mas você precisa chamá-lo de 'seguro o suficiente' em algum momento!
fonte
Esta solução é geral, pois é útil para aplicativos de código aberto e fechado.
Vantagens:
Este método é sugerido por Heroku, que é muito bem-sucedido.
fonte
se for possível criar a conexão com o banco de dados no mesmo arquivo em que as credenciais estão armazenadas. Inline as credenciais na instrução de conexão.
Caso contrário, é melhor desmarcar as credenciais após a instrução connect, porque as credenciais que não estão na memória não podem ser lidas na memória ;)
fonte
Suas escolhas são meio limitadas, pois você diz que precisa da senha para acessar o banco de dados. Uma abordagem geral é armazenar o nome de usuário e a senha em um arquivo de configuração separado, em vez do script principal. Guarde isso fora da árvore principal da web. Ou seja, se houver um problema de configuração da web que deixe seus arquivos php simplesmente sendo exibidos como texto, em vez de serem executados, você não expôs a senha.
Fora isso, você está nas linhas corretas com acesso mínimo para a conta que está sendo usada. Adicione a isso
Pedro
fonte
Se você estiver usando o PostgreSQL, ele procurará
~/.pgpass
senhas automaticamente. Veja o manual para mais informações.fonte
Anteriormente, armazenávamos usuário / senha do banco de dados em um arquivo de configuração, mas desde então atingimos o modo paranóico - adotando uma política de Defesa em Profundidade .
Se seu aplicativo estiver comprometido, o usuário terá acesso de leitura ao seu arquivo de configuração e, portanto, é possível que um cracker leia essas informações. Os arquivos de configuração também podem ser apanhados no controle de versão ou copiados nos servidores.
Mudamos para o armazenamento de usuário / senha nas variáveis de ambiente definidas no Apache VirtualHost. Essa configuração é legível apenas pelo root - espero que seu usuário do Apache não esteja executando como root.
O problema disso é que agora a senha está em uma variável PHP global.
Para mitigar esse risco, temos as seguintes precauções:
phpinfo()
está desabilitado. PHPInfo é um alvo fácil para obter uma visão geral de tudo, incluindo variáveis de ambiente.fonte
Coloque a senha do banco de dados em um arquivo e torne-o somente leitura para o usuário que está servindo os arquivos.
A menos que você tenha algum meio de permitir apenas que o processo do servidor php acesse o banco de dados, isso é tudo que você pode fazer.
fonte
Se você está falando sobre a senha do banco de dados, ao contrário da senha proveniente de um navegador, a prática padrão parece ser colocar a senha do banco de dados em um arquivo de configuração PHP no servidor.
Você só precisa ter certeza de que o arquivo php que contém a senha possui permissões apropriadas. Ou seja, deve ser legível apenas pelo servidor web e por sua conta de usuário.
fonte
Colocá-lo em um arquivo de configuração em algum lugar é como costuma ser feito. Apenas certifique-se de:
fonte
Nós resolvemos desta maneira:
fonte
Um truque adicional é usar um arquivo de configuração separado do PHP que se parece com isso:
Isso não impede que você defina as regras de acesso corretamente. Porém, no caso de seu site ser hackeado, um "require" ou um "include" sairá do script apenas na primeira linha, tornando ainda mais difícil obter os dados.
No entanto, nunca deixe os arquivos de configuração em um diretório que possa ser acessado através da web. Você deve ter uma pasta "Web" contendo seu código de controle, css, fotos e js. Isso é tudo. Qualquer outra coisa entra em pastas offline.
fonte
require
/include
mas como impedir de fazerfopen
?A melhor maneira é não armazenar a senha!
Por exemplo, se você estiver em um sistema Windows e se conectar ao SQL Server, poderá usar a Autenticação Integrada para se conectar ao banco de dados sem uma senha, usando a identidade do processo atual.
Se você precisar se conectar com uma senha, primeiro criptografe -a, usando criptografia forte (por exemplo, usando AES-256 e, em seguida, proteja a chave de criptografia, ou usando criptografia assimétrica e que o sistema operacional proteja o certificado) e, em seguida, armazene-a em um arquivo de configuração (fora do diretório da web) com ACLs fortes .
fonte