php - Email de confirmação com password_hash - Stack Overflow em Português
Ao se cadastrar no site, o usuário recebe um email de ativação do cadastro, até aí tudo certo. O problema está na verificação do password_hash, sei que tem o password_verify, mas nesse caso parece que não é possível utilizá-lo. A variável $key pega o id do usuário criptografado utilizando o password_hash.
<title>Email de confirmação</title>
$key = filter_input(INPUT_GET, 'key', FILTER_SANITIZE_SPECIAL_CHARS);
$verify = $conexao->prepare("select * from user where password_hash(id) = '$key'");
$verify->execute();
$id = $verify->fetch(PDO::FETCH_OBJ);
$confirm = $conexao->prepare("update user set confirm = 1 where id = :id");
$confirm->bindValue(':id', $id->id, PDO::PARAM_INT);
$confirm->execute();
echo 'Cadastro ativado com sucesso!';
echo 'Erro ao ativar cadastro';
Como demostrado acima, tentei verificar o id do usuário no banco, dessa forma:
E dessa forma também:
$verify = $conexao->prepare("select * from user where password_hash(id, PASSWORD_DEFAULT) = '$key'");
Mas como esperado deu erro: 'Syntax error or access violation: 1305 FUNCTION password_hash does not exist', vi que dá para fazer desta forma com o MD5. É possível fazer algo parecido com isso com o password_hash?
O erro está na sua Query, password_hash é uma função do PHP, por isso está dando o erro de sintaxe. Faz o seguinte, pega o email para qual a mensagem de ativação foi enviado, a partir dele você pega o $id cadastrado e usa o password_verify com o $key – Leandro 17/07/18 às 3:29
password_hash é uma função do PHP. Ela não vai funcionar mesmo dentro de uma query. Talvez essa resposta pt.stackoverflow.com/a/147319/4751 te ajude. – gmsantos 17/07/18 às 3:33
Pois é Leandro, mas se eu fizer como MD5, assim por exemplo: $verify = $conexao->prepare("select * from user where MD5(id) = '$key'"); Funciona normal. queria saber se tem alguma função para o password_hash funcionar dentro de uma query, caso não tenha eu faço com MD5 mesmo. – Luizinho 17/07/18 às 3:35
O erro está em sua Query. usando MD5(id) funciona porque o mysql tem está função implementada. Você pode fazer o seguinte: encriptar o valor do id do usuário e então, comparar o hash gerado com o salvo no banco, ficando da seguinte forma:
$key = password_hash(filter_input(INPUT_GET, 'key', FILTER_SANITIZE_SPECIAL_CHARS));
$verify = $conexao->prepare("select * from user where id = '$key'");
OBS: isso imaginando que o valor do GET "key" não seja um hash de fato, pois se estiver, não é necessário gerar novamente (pois daria diferente)
respondida 17/07/18 às 3:41
Everton NeriEverton Neri
É uma boa ideia, mas no meu site vai dar problema, se eu criptografar o id, eu vou ter que fazer alteração em um monte de páginas do meu site, que estão puxando o id do usuário, porque o GET da url das páginas que pegam o id do usuário só pegam valor INT e o valor gerado pelo password_hash tem letras também. – Luizinho 17/07/18 às 4:09
Vou utilizar o MD5 mesmo, já que o mysql não tem nenhuma função imprementada para o password_hash. – Luizinho 17/07/18 às 4:22
Só um adendo bem rápido, já que está usando o prepare, use o placeholder para proteger seu sql. $conexao->prepare("select * from user where id = :id'"); – Alexandre Cardoso 17/07/18 às 16:52
Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag php mysql criptografia ou faça sua própria pergunta.