The Flash The Flash  • 30.01.17 4:07

Qual a melhor maneira de criar um sistema de login com PHP Empty Qual a melhor maneira de criar um sistema de login com PHP 30.01.17 4:07

Para uma autenticação segura é necessário identificar vários pontos.

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.";
}
Um exemplo de como gerar o Hash

Código:
crypt( rand(99999) . time() .  $_SERVER["REMOTE_ADDR"], SECURITY_HASH );
Uma forma mais segura de utilizar esta funcão é utilizar alguns $2a$ no inicio do segundo parâmetro para identificar o tipo de criptografia que deverá ser usada. Ficando da seguinte maneira:

Código:
crypt( rand(99999) . time() .  $_SERVER["REMOTE_ADDR"], '$2a$07$' . SECURITY_HASH );
Onde $2a$ especifica o algoritmo Blowfish e 07$ o custo para gerar o hash.



Código:
$_SERVER["REMOTE_ADDR"]
// Obtem o IP do usuário
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

nadi0s nadi0s  • 02.02.17 21:38

Qual a melhor maneira de criar um sistema de login com PHP Empty Re: Qual a melhor maneira de criar um sistema de login com PHP 02.02.17 21:38

Ótimo! Muito obrigado por compartilhar.

Nando Nando  • 02.02.17 21:38

Qual a melhor maneira de criar um sistema de login com PHP Empty Re: Qual a melhor maneira de criar um sistema de login com PHP 02.02.17 21:38

Aconselho usar MySQLi ou PDO. MySQLi é mais rápido que o PDO, pois o PDO deixa o site um pouco com lerdeza!

The Flash The Flash  • 02.02.17 23:19

Qual a melhor maneira de criar um sistema de login com PHP Empty Re: Qual a melhor maneira de criar um sistema de login com PHP 02.02.17 23:19

Nando escreveu:Aconselho usar MySQLi ou PDO. MySQLi é mais rápido que o PDO, pois o PDO deixa o site um pouco com lerdeza!
No tópico já está recomendado o uso de PDO

Conteúdo patrocinado  • 

Qual a melhor maneira de criar um sistema de login com PHP Empty Re: Qual a melhor maneira de criar um sistema de login com PHP

Permissões neste sub-fórum
Não podes responder a tópicos

BH Servers

Recomendamos a BH Servers com proteção DDOS gratuita em Cloud Server de alta performance. Entrega imediata.