Armazenar senhas no MySql com PHP
09/08/2018Fala pessoal! No vídeo de hoje trataremos de gravação de senha com hash no banco de dados. Faremos também a verificação desse hash com a senha digitada pelo usuário.
Gravar senha no MySql com PHP
Vamos iniciar baixando a biblioteca zepto.js e incluindo ela e o arquivo javascript na nossa index.php
<html lang="pt-br">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<h1>Cadastro de Senha</h1>
<form id="formCadastro" name="formCadastro" action="controllers/ControllerCadastro.php" method="post">
Senha: <input type="password" id="senha" name="senha"><br>
Confirmação de Senha: <input type="password" id="confsenha" name="confsenha"><br>
<input type="submit" value="Gravar">
</form>
<h1>Verificação de Senha</h1>
<form id="formVerificacao" name="formVerificacao" action="controllers/ControllerLogin.php" method="post">
Senha: <input type="password" id="senha2" name="senha2"><br>
<input type="submit" value="Validar">
</form>
<script src="lib/zepto.min.js"></script>
<script src="lib/javascript.min.js"></script>
</body>
</html>
Posteriormente, podemos fazer uma validação no lado cliente, atribuindo características como quantidade de caracteres, caracteres especiais e letras maiúsculas e minúsculas. Na função abaixo foi feito um debounce de 1s também para evitar requisições sucessivas.
function debounce(func, wait, immediate) {
var timeout;
return function() {
var context = this, args = arguments;
var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
}
}
$('#senha').on('keyup',debounce(function(){
var senha = $('#senha').val();
var regex = /^(?=(?:.*?[A-Z]){3})(?=(?:.*?[0-9]){2})(?=(?:.*?[!@#$%*()_+^&}{:;?.]){1})(?!.*\s)[0-9a-zA-Z!@#$%;*(){}_+^&]*$/;
if(senha.length < 8)
{
alert("A senha deve conter no minímo 8 digitos!");
senha.focus();
return false;
}
else if(!regex.exec(senha))
{
alert("A senha deve conter no mínimo 3 caracteres em maiúsculo, 2 números e 1 caractere especial!");
senha.focus();
return false;
}
else{
alert('A senha está certa');
}
return true;
},1000));
Posteriormente vamos criar nosso banco de dados e fazer a classe de conexão ao banco.
CREATE TABLE `login` (
`id` int(11) NOT NULL,
`password` varchar(100) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
ALTER TABLE `login` ADD PRIMARY KEY (`id`);
ALTER TABLE `login` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
A classe de conexão ficará assim:
<?php
abstract class ClassConexao{
protected function conectaDB()
{
try{
$con=new \PDO("mysql:host=localhost;dbname=sistema","root","");
return $con;
}catch (PDOException $erro){
return $erro->getMessage();
}
}
}
Finalizando nosso projeto, faremos o ControllerCadastro responsável por inserir a senha com hash (password_hash) no banco de dados MySql e o ControllerLogin que fará a validação da senha com o banco (password_verify).
ControllerCadastro.php
<?php
include("../class/ClassConexao.php");
class ControllerCadastro extends ClassConexao{
private $senha;
private $confsenha;
private $db;
public function __construct()
{
$this->senha=filter_input(INPUT_POST,'senha',FILTER_SANITIZE_STRING);
$this->confsenha=filter_input(INPUT_POST,'confsenha',FILTER_SANITIZE_STRING);
$this->verificaSenha();
}
private function verificaSenha()
{
if($this->senha == $this->confsenha)
{
$this->cadastraSenha();
}else{
echo "Senha e confirmação de senha diferentes";
return false;
}
}
private function hashSenha()
{
$this->senha=password_hash($this->senha,PASSWORD_DEFAULT);
}
private function cadastraSenha()
{
$id=0;
$this->hashSenha();
$this->db=$this->conectaDB()->prepare("insert into login values (?,?)");
$this->db->bindValue("1",$id);
$this->db->bindValue("2",$this->senha);
$this->db->execute();
echo "senha inserida com sucesso";
}
}
$new = new ControllerCadastro();
* A instância foi feita no mesmo arquivo. Essa prática não é recomendável.
ControllerLogin.php
<?php
include("../class/ClassConexao.php");
class ControllerLogin extends ClassConexao{
private $senha2;
private $db;
public function __construct()
{
$this->senha2=filter_input(INPUT_POST,'senha2',FILTER_SANITIZE_STRING);
$this->verificaSenhaLogin();
}
private function verificaSenhaLogin()
{
$this->db=$this->conectaDB()->prepare("select * from login where id = ?");
$this->db->bindValue(1,"2");
$this->db->execute();
$fetch=$this->db->fetch(PDO::FETCH_ASSOC);
if(password_verify($this->senha2,$fetch['password'])){
echo "senha é igual";
}else{
echo "a senha não confere";
}
}
}
$new = new ControllerLogin();
Espero que o conteúdo acima ajude os seus estudos. Sucesso nos códigos e na vida!