Para uma autenticação segura é necessário identificar vários pontos.
Alguns itens que deve tomar cuidado:
1 - Iniciando
Defina um hash que será utilizado por todo seu sistema. um exemplo é
define( 'SECURITY_HASH', 'uma frase qualquer ou letras aleatórias com números e simbolos' )
2 - Crie sua tabela no banco de dados
Sugestão de tabela
3 - Registro de usuário
Ao registrar valide se foi passado um email válido, se o campo de username está no formatado correto, e gere uma hash para o keymaster e utilize essa hash para criptografar a senha.
Para validar o email use
Armazene o IP do usuário e as datas de último acesso, e quando foi criado.
Deixe o usuário inativo (campo active = 0 ) e valide o email cadastrado enviando um email de confirmação.
No email de confirmação você informa um link do tipo
http://www.dominio.com.br/validateuser.php?key={hash do resultado da concatenação do keymaster e SECURITY_HASH}
Essa url irá mudar o campo active de 0 para 1, indicando que o usuário foi ativado.
4 - Login
Para o login você deve receber os dados do formulário e validá-los, verificando se está como o esperado.
Busque as informações do usuário no banco, utilizando apenas o username informado.
Com os dados que obteve do banco, criptografe a senha informada pelo formulário utilizando a keymaster do usuário, o mesmo procedimento do registro.
Compare a senha que obteve do banco com a senha que recebeu do formulário criptografada Caso sejam idênticas, inicie a sessão.
5 - Cuidados básicos
Para obter dados passados via POST ou GET, evite utilizar as variáveis globais puras. Para isso utilize filter_input().
Leia sobre na documentação: http://www.php.net/manual/en/function.filter-input.php
--
Para garantir que os dados enviados via formulário foi realizado de seu servidor, crie uma hash e armazene em sessão. Adicione essa hash em um campo hidden do formulário. Ao receber os valores do formulário, verifique se o hash que veio do formulário existe e está igual ao da sessão.
Renove o hash sempre que for exibir um formulário.
--
Nunca use o register_globals setado com on
Não valide seus formulários apenas no javascript, pois se o usuário estiver com o javascript desativado irá passar direto.
Utilize o PDO validando todos as variáveis antes de passá-las para uma SQL.
Configure no php.ini o seguinte session.cookie_httponly = 1 . Isso informa para o browser não expor cookies para linguagens clients side como o javascript.
Nomeie todos os arquivos com a extensão .php nunca com extensão como .inc, .conf, etc.
Evite usar md5 como criptografia, utilize bcrypt pois o algoritmo é muito mais seguro.
Guarde a sessão no banco de dados
Defina um domínio para seu cookie
Contabilize as tentativas de login e o tempo entre elas para evitar robos.
Em produção deixe o display_errors como off
Gere log de erros e envie para seu email, isso facilita identificar tentativas de invasão.
Cuidado com as permissões dos seus arquivos no servidor, garanta que apenas o apache tem permissão sobre eles.
Fonte: Stackoverflow
Alguns itens que deve tomar cuidado:
- SQL Injection
- Criptografia de senha
- Ataque de força bruta
- Ataques XSS
- Ataques CSRF
- Proteger arquivos de sessão
- Proteger arquivos de sistemas
1 - Iniciando
Defina um hash que será utilizado por todo seu sistema. um exemplo é
define( 'SECURITY_HASH', 'uma frase qualquer ou letras aleatórias com números e simbolos' )
2 - Crie sua tabela no banco de dados
Sugestão de tabela
- id
- email
- username
- password
- keymaster
- last_ip
- last_access
- active
- created_at
- uptaded_at
3 - Registro de usuário
Ao registrar valide se foi passado um email válido, se o campo de username está no formatado correto, e gere uma hash para o keymaster e utilize essa hash para criptografar a senha.
Para validar o email use
- Código:
if ( filter_var( $email, FILTER_VALIDATE_EMAIL ) ) {
echo "This ($email_a) email address is considered valid.";
}
- Código:
crypt( rand(99999) . time() . $_SERVER["REMOTE_ADDR"], SECURITY_HASH );
- Código:
crypt( rand(99999) . time() . $_SERVER["REMOTE_ADDR"], '$2a$07$' . SECURITY_HASH );
- Código:
$_SERVER["REMOTE_ADDR"]
Armazene o IP do usuário e as datas de último acesso, e quando foi criado.
Deixe o usuário inativo (campo active = 0 ) e valide o email cadastrado enviando um email de confirmação.
No email de confirmação você informa um link do tipo
http://www.dominio.com.br/validateuser.php?key={hash do resultado da concatenação do keymaster e SECURITY_HASH}
Essa url irá mudar o campo active de 0 para 1, indicando que o usuário foi ativado.
4 - Login
Para o login você deve receber os dados do formulário e validá-los, verificando se está como o esperado.
Busque as informações do usuário no banco, utilizando apenas o username informado.
Com os dados que obteve do banco, criptografe a senha informada pelo formulário utilizando a keymaster do usuário, o mesmo procedimento do registro.
Compare a senha que obteve do banco com a senha que recebeu do formulário criptografada Caso sejam idênticas, inicie a sessão.
5 - Cuidados básicos
Para obter dados passados via POST ou GET, evite utilizar as variáveis globais puras. Para isso utilize filter_input().
Leia sobre na documentação: http://www.php.net/manual/en/function.filter-input.php
--
Para garantir que os dados enviados via formulário foi realizado de seu servidor, crie uma hash e armazene em sessão. Adicione essa hash em um campo hidden do formulário. Ao receber os valores do formulário, verifique se o hash que veio do formulário existe e está igual ao da sessão.
Renove o hash sempre que for exibir um formulário.
--
Nunca use o register_globals setado com on
Não valide seus formulários apenas no javascript, pois se o usuário estiver com o javascript desativado irá passar direto.
Utilize o PDO validando todos as variáveis antes de passá-las para uma SQL.
Configure no php.ini o seguinte session.cookie_httponly = 1 . Isso informa para o browser não expor cookies para linguagens clients side como o javascript.
Nomeie todos os arquivos com a extensão .php nunca com extensão como .inc, .conf, etc.
Evite usar md5 como criptografia, utilize bcrypt pois o algoritmo é muito mais seguro.
Guarde a sessão no banco de dados
Defina um domínio para seu cookie
Contabilize as tentativas de login e o tempo entre elas para evitar robos.
Em produção deixe o display_errors como off
Gere log de erros e envie para seu email, isso facilita identificar tentativas de invasão.
Cuidado com as permissões dos seus arquivos no servidor, garanta que apenas o apache tem permissão sobre eles.
Fonte: Stackoverflow