Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá,
Estou com muita dificuldade em inserir e atualizar a senha usando o método password_hash. Alguém poderia me explicar como eu posso fazer isso? Tenho um crud, ele funciona perfeitamente, mas quero implementar o password_hash na senha. Como fazer isso?
<?php
require_once 'Crud.php';
class Usuarios extends Crud {
protected $table = 'usuarios';
private $nome;
private $email;
private $senha;
public function setNome($nome) {
$this->nome = $nome;
}
public function getNome() {
return $this->nome;
}
public function setEmail($email) {
$this->email = $email;
}
public function setSenha($senha) {
$this->senha = $senha;
}
public function insert() {
$sql = "INSERT INTO $this->table (nome, email, senha) VALUES (:nome, :email, :senha)";
$stmt = DB::prepare($sql);
$stmt->bindParam(':nome', $this->nome);
$stmt->bindParam(':email', $this->email);
$stmt->bindParam(':senha', $this->senha);
return $stmt->execute();
}
public function update($id) {
$sql = "UPDATE $this->table SET nome = :nome, email = :email, senha = :senha WHERE id = :id";
$stmt = DB::prepare($sql);
$stmt->bindParam(':nome', $this->nome);
$stmt->bindParam(':email', $this->email);
$stmt->bindParam(':senha', $this->senha);
$stmt->bindParam(':id', $id);
return $stmt->execute();
}
}
#Edit:
Pensei em adicionar isso, mas não resultou, o que estou fazendo de errado?
public function hash($senha) {
$options = [
'cost' => 11,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
];
return password_hash($senha, PASSWORD_BCRYPT, $options);
}
public function verificarPassword($senha, $hash) {
if(password_verify($senha, $hash)) {
return true;
}
return false;
}Meu amigo o problema não é a versão, pois a versão do meu PHP é 5.5.12. O problema é que eu não sei como inserir o password_hash no código, não sei onde colocar para a senha ficar criptografada.
Você tem que usar password_hash antes de salvar a senha no banco (ao criar um usuário) e antes de verificar a senha digitada com a senha salva no banco.
Veja este meu artigo sobre Sistema de Login:
http://blog.ultimatephp.com.br/sistema-de-login-php/
Você vai seguir a mesma lógica, apenas mudando a forma como gera o hash da senha
Eu faria no método
public function setSenha($senha) {
$this->senha = $senha;
}Olá Beraldo.
Acho que estou conseguindo, algumas mensagens de erro desapareceu mas ficou uma que é super chata.
Usuarios.php
<?php
require_once 'Crud.php';
class Usuarios extends Crud {
protected $table = 'usuarios';
private $nome;
private $email;
private $senha;
public function setNome($nome) {
$this->nome = $nome;
}
public function getNome() {
return $this->nome;
}
public function setEmail($email) {
$this->email = $email;
}
public function setSenha($senha) {
$this->senha = $senha;
}
//
//$senhaHash = password_hash($senha, PASSWORD_DEFAULT);
public function hash($senha) {
$options = [
'cost' => 11,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
];
return password_hash($senha, PASSWORD_BCRYPT, $options);
}
public function verificarPassword($senha, $hash) {
if(password_verify($senha, $hash)) {
return true;
}
return false;
}
//
public function insert() {
$sql = "INSERT INTO $this->table (nome, email, senha) VALUES (:nome, :email, :senha)";
$stmt = DB::prepare($sql);
$stmt->bindParam(':nome', $this->nome);
$stmt->bindParam(':email', $this->email);
$stmt->bindParam(':senha', $senha);
return $stmt->execute();
}
public function update($id) {
$sql = "UPDATE $this->table SET nome = :nome, email = :email, senha = :senha WHERE id = :id";
$stmt = DB::prepare($sql);
$stmt->bindParam(':nome', $this->nome);
$stmt->bindParam(':email', $this->email);
$stmt->bindParam(':senha', $senha);
$stmt->bindParam(':id', $id);
return $stmt->execute();
}
}
index.php
<?php
$usuario = new Usuarios();
if(isset($_POST['cadastrar'])):
$nome = $_POST['nome'];
$email = $_POST['email'];
$senha = $_POST['senha'];
$usuario->setNome($nome);
$usuario->setEmail($email);
$usuario->setSenha($senha);
#Insert
if($usuario->insert()):
echo "Inserido com sucesso!";
endif;
endif;
?>
Mensagem de Erro
****
O que devo fazer para consertar este erro e fazer que o script cadastra a senha criptografada?
#Edit
William você fala colocar essa parte dentro do setSenha? public function hash($senha) { ? Eu tentei mas não deu certo... segue...
public function setSenha($senha) {
if($senha) {
$options = [
'cost' => 11,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
];
return password_hash($senha, PASSWORD_BCRYPT, $options);
}
$this->senha = $senha;
}
public function insert() {
$sql = "INSERT INTO $this->table (nome, email, senha) VALUES (:nome, :email, :senha)";
$stmt = DB::prepare($sql);
$stmt->bindParam(':nome', $this->nome);
$stmt->bindParam(':email', $this->email);
$stmt->bindParam(':senha', $this->senha);
return $stmt->execute();
}
Obrigado desde já.
Verifica se todas as propriedades do objecto estão a ser guardadas com os devidos valores antes de chamar a bindParam.
À cabeça do método insert faz um echo de $this->nome, $this->email e $this-senha.
Muito obrigado a todos, mas eu conseguir... utilizei o método que o nosso amigo William disse.
public function setSenha($senha) {
$options = [
'cost' => 11,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM)
];
$this->senha = password_hash($senha, PASSWORD_BCRYPT, $options);
if(password_verify($senha, $this->senha)) {
return true;
}
return false;
}
Se tiver alguma coisa errado me avise, pois eu testei aqui e funcionou tudo certinho.
possivelmente versão de php, na versão 5.5 foram criadas as funcoes:
password get info
mas não é tão segura quanto as da nova versao cheque pois a versao de seu phppassword hash
password needs rehash
password verify
minha versão é a 4.ponto alguma coisa e não funcionaram, funcionou somente a mais antiga: