Jump to content
tii3030

Sistema de login com PHP

Recommended Posts

Olá pessoal, desenvolvi um pequeno código em PHP com a função de verificar e validar usuário e senha de um formulário, juntamente com o meu banco de dados MySql.

Gostaria de saber como aprimorar o meu código para torna-lo mais seguro e mais próximo de algo "profissional". Lembrando que minha senha no banco está criptografada (PASSWORD_BCRYPT).

 

<?php

    #----------------- INCLUDING FILE --> "conf.php"
    include('conf.php');

        if (isset($_POST['submit'])) {
       
#--------------------------------INPUTS ---------------------------------------------#

            $email = mysqli_real_escape_string($conexao, $_POST['email']);
            $password = mysqli_real_escape_string($conexao, $_POST['password']);

#-----------------------#----------------------#-----------------_#-------------------#

            $query_select_email = "SELECT email FROM usuarios WHERE email = '$email'";
            $select_email = mysqli_query($conexao,$query_select_email);

            $query_select_password = "SELECT password FROM usuarios";
            $select_password = mysqli_query($conexao,$query_select_password);

            while($array = mysqli_fetch_array($select_password)) {
            $logarray = $array['password'];

            
                if (password_verify($password, $logarray)) {
                    if (mysqli_num_rows($select_email) == 1) {
                        
                    $_SESSION['email'] = $email;
                    header('location: XXX.html');
                    exit();
                    }
                }
                else {
                    echo "Loguin ou senha incorretos";
                }
            $logarray = '0';
            }
        }
?>

Share this post


Link to post
Share on other sites

Na verdade, você pode pegar os dados inseridos pelo usuário (email e senha) e fazer uma query pra ver se retorna do MySQL algum registro compatível com email e senha.
Ai você faz mais uma verificação que é comparar o email e senha retornado do MySQL com o email e senha inserido pelo usuário.
Essa segunda verificação é algo bom a se fazer pois fica seguro em relação a um SQL Inject!
Sucesso ae!
=]

Share this post


Link to post
Share on other sites

Como forma de aprimoramento e segurança é importante que o seu código se previna de SQL injection que é um tipo de ameaça de segurança que interage com dados através de comandos SQL, onde o atacante consegue inserir uma instrução SQL personalizada e indevida dentro de uma consulta query (SELECT/UPDATE) através de formulários ou URL de uma aplicação por exemplo.

 

No caso, para o PHP, você pode montar o seu script baseando-se em prepared statements que no caso, segundo manual do PHP,  consiste em dois estágios: preparar e executar. No estágio de preparação, um modelo de instrução é enviado ao servidor de banco de dados. O servidor executa uma verificação de sintaxe e inicializa os recursos internos do servidor para uso posterior. Isso é uma forma segura de evitar o SQL Injection.

 

Abaixo segue um exemplo de um script que tem a função de realizar um login depois que o usuário inseri os dados de acesso:

$message = '';

if(isset($_POST["login"]))
{
	$query = "
	SELECT * FROM register_user 
		WHERE user_email = :user_email
	";
	$statement = $connect->prepare($query);
	$statement->execute(
		array(
				'user_email'	=>	$_POST["user_email"]
			)
	);
	$count = $statement->rowCount();
	if($count > 0)
	{
		$result = $statement->fetchAll();
		foreach($result as $row)
		{
			if($row['user_email_status'] == 'verified')
			{
				if(password_verify($_POST["user_password"], $row["user_password"]))
				//if($row["user_password"] == $_POST["user_password"])
				{
					$_SESSION['user_id'] = $row['register_user_id'];
					$_SESSION['userName'] = $row['user_name'];
					header("location: minha-conta.php");
				}
				else
				{
					$message = "<label>Senha incorreta</label>";
				}
			}
			else
			{
				$message = "<label class="text-danger">Ative a sua conta clicando no link de ativação enviado para o e-mail de cadastro</label>";
			}
		}
	}
	else
	{
		$message = "<label class="text-danger">E-mail de cadastro incorreto</label>";
	}
}

Observe que a variável $query é preparada e depois executada no formato abaixo:

	$statement = $connect->prepare($query);
	$statement->execute(
		array(
				'user_email'	=>	$_POST["user_email"]
			)
	);

Outro ponto importante para um sistema de login é a validação do e-mail cadastrado. Dessa forma a autenticação de um e-mail válido seria mais eficiente pois é uma das maneiras de autenticar e validar o cadastro com um e-mail válido.

 

Além dessas formas aqui citadas, é importante também criar mecanismos de validação de campos para verificar se as informações inseridas dentro de um campo por um usuário por exemplo, estão corretas antes de serem enviadas para o banco de dados. Um exemplo poderia ser o campo CPF/CNPJ. Se nesses campos não houver um código jquery por exemplo, validando um número cpf o ucnpj, o banco de dados poderá receber qualquer sequência de números "sujando", digamos assim, o seu banco de dados com dados incorretos.

 

Por fim, criei um exemplo de um sistema simples de login, validação de e-mail usando a biblioteca PHPmailer e ativação de conta onde você pode baixar e fazer testes com ele. No mais, sucesso aí.

Share this post


Link to post
Share on other sites

Em um sistema de Login, recomendo a utilização de funções, para assim, reutilizar validações em arquivos. Utilizando funções facilitara muito a sua vida.

 

 

config.php

<?php

define('HOST','localhost');
define('USER','root');
define('PASS','');
define('DBSA','test');

function connection(){
	try {
	  $pdo = new PDO('mysql:host='.HOST.';dbname='.DBSA.';charset=utf8', USER,PASS, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
		$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		return $pdo;
	} catch(PDOException $e) {
		throw new \Exception(_("Erro ao conectar". $e->getMessage()));
	}
}	

functions.php

 

<?php

function isMail($mail){
	if (filter_var($mail, FILTER_VALIDATE_EMAIL)):
		return true;
	endif;
	return false;
}

function setMessage($key,$content){
	$_SESSION[$key] = $content;
}
function getMessage($key){
	$message = '';
	if(isset($_SESSION[$key])):
		$message = $_SESSION[$key];
		unset($_SESSION[$key]);
	endif;
	return $message;
}

function CryptPassword($password){
	return password_hash($password,PASSWORD_DEFAULT,['cost' => 12]);
}

function VerifyPassword($password,$hash){	
	return ( password_verify($password, $hash) ) ? true : false ;
}


function Auth($mail,$senha){

	if(!isMail($mail)):
		setMessage('login','O e-mail inválido.');
		return false;
	endif;

	$sql = "SELECT * from usuarios WHERE email = ? ";
	$exeQuery = connection()->prepare($sql);
	$exeQuery->execute([ $mail ]);
	if($exeQuery->rowCount() == 0 ):
		setMessage('login','Usuário não encontrado.');
		return false;
	endif;
	
	$user = $exeQuery->fetch(\PDO::FETCH_OBJ);
	if( !VerifyPassword($senha, $user->password) ):
		setMessage('login','Senha incorreta.');
		return false;
	endif;
	
	$_SESSION['userlogin'] = (array)$user;
	return (array)$user;
}


function checkAuth($session){
	if(!isset($session['email']) ):
		session_destroy();
		return false;
	endif;
	
	if(!isset($session['password']) ):
		session_destroy();
		return false;
	endif;
	
	
	if(!isMail($session['email'])):
		session_destroy();
		return false;
	endif;

	$sql = "SELECT * from usuarios WHERE email = ? and password = ?";
	$exeQuery = connection()->prepare($sql);
	$exeQuery->execute([ $session['email'],$session['password'] ]);
	if($exeQuery->rowCount() == 0 ):
		session_destroy();
		return false;
	endif;
	
	$user = $exeQuery->fetch(\PDO::FETCH_ASSOC);
	return $user;
}

index.php

 

<?php
session_start();
require_once('config.php');
require_once('functions.php');
?>
<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8" />
    <title>Login Auth</title>
</head>
<body>
    <?php
	
		$logar = filter_input_array(INPUT_POST,FILTER_DEFAULT);
		if(isset($logar)):
			$user = Auth($logar['email'],$logar['senha']);
			if(!$user):
				echo getMessage('login');
			else:
				header('Location: painel.php');
			endif;
		endif;
		
		
	?>
	<form action="" method="POST">
		<input type="text" name="email">
		<input type="password" name="senha">
		<input type="submit" value="Logar!"/>
	</form>
	
</body>
</html>

 

painel.php

 

<?php
session_start();
require_once('config.php');
require_once('functions.php');

$logoff = filter_input(INPUT_GET,'sair',FILTER_VALIDATE_BOOLEAN);
if(!isset($_SESSION['userlogin'])){
	@session_destroy();
	header('Location: index.php');
}elseif(isset($logoff) && $logoff){
	@session_destroy();
	setMessage('login','Você desconetou com sucesso.');
	header('Location: index.php');
}else{
	$user = checkAuth($_SESSION['userlogin']);
	if(!$user){
		@session_destroy();
		header('Location: index.php');
	}
}


?>
<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8" />
    <title>Painel de Administração</title>
</head>
<body>
    <h1>Olá <?=$user['nome'];?>!</h1>	
	<a href="?sair=true">Sair</a>
</body>
</html>

 

SQL:

 

CREATE TABLE `usuarios` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

 

 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By joao b silva
      Tenho uma pequena aplicação em php que gera arquivos pdf com a MPDF e envia email com a PHPMAILER. De repente a app parou de enviar os emails  e apresenta a seguinte mensagem de erro:
       
      Error PHPMailer: SMTP Error: Could not authenticate.
       
      Faço uso de um hotmail para a configuração do PHPMAILER.
    • By violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos.
       
      Quando programava em DOS. utilizava algumas teclas de atalho para: SALVAR / EDITAR / EXCLUIR / IMPRIMIR.
      Por exemplo:
      Salvar ----> ALT+S
      Editar ----> ALT+E
      Excluir --> ALT+X
      Imprimir -> ALT+I

      no PHP tem como colocar esses ATALHOS nos button, para o usuário trabalhar com esses atalhos e como seria ?

      grato,
       
      Cesar
    • By violin101
      Caros Amigos, saudações.
       
      Por favor, me perdoa em postar uma dúvida.
       
      Preciso criar uma Rotina onde o usuário possa buscar na Base de Dados de Produtos, tanto por Código e Descrição, ou seja:
      - caso o usuário digita o Código, mostra os dados do Produto.
      - caso o usuário digita a Descrição, mostra os dados do Produto
       
      Fiz uma Rotina, onde o usuário digita a DESCRIÇÃO com a função AUTOCOMPLETE.    <=== está funcionando certinho.
       
      Minha dúvida é como faço para DIGITAR o Código e mostrar os dados também.
       
      o meu AutoComplete na MODEL está assim.
      public function autoCompleteProduto($q){ $this->db->select('*' ) ->from('produtos') ->where('produtos.statusProd',1) ->like('descricao', $q) ->limit(5) ->order_by('descricao', 'ASC'); $query = $this->db->get(); if ($query->num_rows() > 0) { foreach ($query->result_array() as $row) { $row_set[] = ['label' => str_pad($row['idProdutos'], '5', '0', STR_PAD_LEFT).' - '.$row['descricao'], 'id' => $row['idProdutos'], 'descricao' => $row['descricao'], 'cod_interno' => $row['cod_interno'], 'prd_unid' => $row['prd_unid'], 'estoque_atual' => $row['estoque_atual'] ]; } echo json_encode($row_set); } }  
       
      no CONTROLLER está assim:
      public function autoCompleteProduto() { $this->load->model('estoque/lancamentos_model'); if (isset($_GET['term'])) { $q = strtolower($_GET['term']); $this->lancamentos_model->autoCompleteProduto($q); } }  
       
      na VIEW está assim:
      <div class="col-md-10"> <label for="idProdutos">Produto:</label> <input type="hidden" name="idProdutos" id="idProdutos"> <input type="text" class="form-control" id="descricao" name="descricao" style="font-size:15px; font-weight:bold;" placeholder="Pesquisar por descrição do produto" disabled> </div>  
      VIEW + JAVASCRIPT
       
      //Função para trazer os Dados pelo o AutoComplete. function resolveAutocomplete() { $("#descricao").autocomplete({ source: "<?php echo base_url(); ?>estoque/lancamentos/autoCompleteProduto/", minLength: 2, select: function (event, ui) { $("#idProdutos").val(ui.item.id); $("#cod_interno").val(ui.item.cod_interno); $("#descricao").val(ui.item.descricao); $("#prd_unid").val(ui.item.prd_unid); $("#estoque_atual").val(ui.item.estoque_atual); $("#qtde").focus(); } }); } // inicia o autocomplete resolveAutocomplete();  
      Grato,
       
      Cesar
    • By belann
      Olá!
       
      Estou tentando criar um projeto laravel e está dando o seguinte erro 
      curl error 60 while downloading https://getcomposer.org/versions: SSL certificate problem: unable to get local issu
        er certificate
      Já tentei atualizar o composer, mas dá o mesmo erro acima.
    • By violin101
      Caros amigos, saudações.
       
      Estou com uma dúvida de validação de INPUT com função moeda.
       
      Tenho um input onde o usuário digita um valor qualquer, por exemplo: 1.234,56
      o problema é quando precisa atualizar o valor.
       
      Quando o usuário atualizar o input fica assim: 1.234,
       
      como faço para atualizar as casas decimais, conforme o valor for sendo alterado ?
       
      o input está assim:
       
      <div class="col-md-2"> <label for="">Valor Unitário</label> <input type="text" class="form-control" id="estoqprod" name="estoqprod" style="font-size:15px; font-weight:bold; width:100%; text-align:center;" placeholder="0,00" OnKeyUp="calcProd();" onkeypress="return(FormataMoeda(this,'.',',',event))" > </div>  
      a função para formatar o input para moeda está assim:
      obs.: a Função CalcProd está executando corretamente
      function calcProd(){ //Obter valor digitado do produto var estoq_prod = document.getElementById("estoqprod").value; //Remover ponto e trocar a virgula por ponto while (estoq_prod.indexOf(".") >= 0) { estoq_prod = estoq_prod.replace(".", ""); } estoq_prod = estoq_prod.replace(",","."); //Obter valor digitado do produto var prod_qtde = document.getElementById("qtde").value; //Remover ponto e trocar a virgula por ponto while (prod_qtde.indexOf(".") >= 0) { prod_qtde = prod_qtde.replace(".", ""); } prod_qtde = prod_qtde.replace(",","."); //Calcula o Valor do Desconto if (prod_qtde > 0 && estoq_prod > 0) { calc_total_produto = parseFloat(prod_qtde) - parseFloat(estoq_prod); var numero = calc_total_produto.toFixed(2).split('.'); //Calculo para não deixar GRAVAR valores negativos if (calc_total_produto < 0 ) { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.') * -1; document.getElementById("qtdeTotal").value = numero.join(','); } else { numero[0] = numero[0].split(/(?=(?:...)*$)/).join('.'); document.getElementById("qtdeTotal").value = numero.join(','); } } else { if (estoq_prod > 0) { document.getElementById("qtdeTotal").value = document.getElementById("estoqprod").value; } else { document.getElementById("qtdeTotal").value = "0,00"; } } } /*---Função para Formatar Campo para Moeda [R$]---*/ function FormataMoeda(objTextBox, SeparadorMilesimo, SeparadorDecimal, e){ var sep = 0; var key = ''; var i = j = 0; var len = len2 = 0; var strCheck = '0123456789'; var aux = aux2 = ''; var whichCode = (window.Event) ? e.which : e.keyCode; if (whichCode == 13) return true; key = String.fromCharCode(whichCode); // Valor para o código da Chave if (strCheck.indexOf(key) == -1) return false; // Chave inválida len = objTextBox.value.length; for(i = 0; i < len; i++) if ((objTextBox.value.charAt(i) != '0') && (objTextBox.value.charAt(i) != SeparadorDecimal)) break; aux = ''; for(; i < len; i++) if (strCheck.indexOf(objTextBox.value.charAt(i))!=-1) aux += objTextBox.value.charAt(i); aux += key; len = aux.length; if (len == 0) objTextBox.value = ''; if (len == 1) objTextBox.value = '0'+ SeparadorDecimal + '0' + aux; if (len == 2) objTextBox.value = '0'+ SeparadorDecimal + aux; if (len > 2) { aux2 = ''; for (j = 0, i = len - 3; i >= 0; i--) { if (j == 3) { aux2 += SeparadorMilesimo; j = 0; } aux2 += aux.charAt(i); j++; } objTextBox.value = ''; len2 = aux2.length; for (i = len2 - 1; i >= 0; i--) objTextBox.value += aux2.charAt(i); objTextBox.value += SeparadorDecimal + aux.substr(len - 2, len); } return false; }  
      Grato,
       
      Cesar
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.