Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

PHP e MySQL comparam senha


Vejo que você está armazenando um hash da senha no banco de dados, mas para o benefício de outros leitores, nunca armazenar senhas em texto simples no banco de dados. Você não quer ser como Monster.com.uk !

Você deve usar uma função de hash mais forte que MD5() . Idealmente, você deve usar SHA256. Este método de hash está disponível em PHP usando o hash() função.

Você também deve aplicar um sal aleatório à senha. Armazene um valor de sal diferente para a conta de cada usuário. Isso ajuda a derrotar ataques de dicionário e rainbow table ataques.

Você deve aprender a usar o mysqli extensão em vez da antiga extensão mysql. O Mysqli suporta consultas parametrizadas, para que você possa reduzir a vulnerabilidade a alguns ataques de injeção de SQL.

Aqui está um código de exemplo. Eu não testei, mas deve estar bem perto de funcionar:
$input_login = $_POST['login'];
$input_password = $_POST['password'];

$stmt = $mysqli->prepare("SELECT password, salt FROM customer WHERE login = ?");
$stmt->bind_param("s", $input_login);
$stmt->execute();
$stmt->bind_result($password_hash, $salt);

while ($stmt->fetch()) {
  $input_password_hash = hash('sha256', $input_password . $salt);
  if ($input_password_hash == $password_hash) {
    return true;
  }
  // You may want to log failed password attempts here,
  // for security auditing or to lock an account with
  // too many attempts within a short time.
}
$stmt->close();

// No rows matched $input_login, or else password did not match
return false;

Algumas outras pessoas sugerem que a consulta deve testar login = ? AND password = ? mas eu não gosto de fazer isso. Se você fizer isso, não poderá saber se a pesquisa falhou porque o login não existia ou porque o usuário forneceu uma senha errada.

É claro que você não deve revelar ao usuário o que causou a falha na tentativa de login, mas você pode precisar saber, para que você possa registrar atividades suspeitas.

@Javier diz em sua resposta que você não deve recuperar a senha (ou hash de senha neste caso) do banco de dados. Eu não concordo.

Javier mostra chamando md5() em código PHP e enviando a string de hash resultante para o banco de dados. Mas isso não suporta salgar a senha facilmente. Você precisa fazer uma consulta separada para recuperar o salt deste usuário antes de poder fazer o hash em PHP.

A alternativa é enviar o texto simples senha pela rede do seu aplicativo PHP para o servidor de banco de dados. Qualquer pessoa que grampeie sua rede pode ver essa senha. Se você tiver consultas SQL sendo registradas, qualquer pessoa que tenha acesso aos logs poderá ver a senha. Hackers motivados podem até mergulhar no dumpster para encontrar a mídia de backup do sistema de arquivos antigo e podem ler os arquivos de log dessa maneira!

O risco menor é buscar a string de hash de senha do banco de dados no aplicativo PHP, compará-la com o hash da entrada do usuário (também no código PHP) e descartar essas variáveis.