Ir para conteúdo
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';
            }
        }
?>

Compartilhar este post


Link para o post
Compartilhar em outros 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!
=]

Compartilhar este post


Link para o post
Compartilhar em outros 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í.

Compartilhar este post


Link para o post
Compartilhar em outros 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;

 

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por ILR master
      Fala galera, tudo bem?
       
      Tenho o seguinte codigo:
       
       class Data {
      public static function ExibirTempoDecorrido($date)
      {
          if(empty($date))
          {
              return "Informe a data";
          }
          $periodos = array("segundo", "minuto", "hora", "dia", "semana", "mês", "ano", "década");
          $duracao = array("60","60","24","7","4.35","12","10");
          $agora = time();
          $unix_data = strtotime($date);
          // check validity of date
          if(empty($unix_data))
          {  
              return "Bad date";
          }
          // is it future date or past date
          if($agora > $unix_data) 
          {  
              $diferenca     = $agora - $unix_data;
              $tempo         = "atrás";
          } 
          else 
          {
              $diferenca     = $unix_data - $agora;
              $tempo         = "agora";
          }
          for($j = 0; $diferenca >= $duracao[$j] && $j < count($duracao)-1; $j++) 
          {
              $diferenca /= $duracao[$j];
          }
          $diferenca = round($diferenca);
          if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
          return "$diferenca $periodos[$j] {$tempo}";
      }
      }
       
      Funciona redondinho se o valor retornado for de algumas horas, mas...
      Quando passa de dois meses, ele retorna a palavra mess. Deve ser por conta dessa linha
      if($diferenca != 1) 
          {
              $periodos[$j].= "s";
          }
       
      Quero que modre:
       
      2 meses atrás
      e não
      2 mess atrás.
       
      Espero que tenham entendido.
       
      Valeu
    • Por Carlos Web Soluções Web
      Olá...
      Estou tentando fazer o seguinte !!
      Listando dados em tabela !!
      Gostaria que....se na listagem houver 4 linhas...indepedente de seu número de ID, faça a listagem em ID ser em ordem 1 2 3 4 !!
      Exemplo...se tiver uma listagem de dados que está em ID 1 3 3...faça ficar 1 2 3 !!

       
      echo "<table class='tabela_dados' border='1'> <tr> <td>ID</td> <td>Nome Empresa</td> <td>Responsável</td> <td>Telefone 1</td> <td>Telefone 2</td> <td>E-mail 1</td> <td>E-mail 2</td> <td>Endereço</td> <td>CEP</td> <td>Bairro</td> <td>AÇÃO 1</td> <td>AÇÃO 2</td> </tr> "; $sql = "SELECT ID FROM usuarios_dados WHERE Usuario='$usuario'"; $result = $conn->query($sql); $num_rows = $result->num_rows; $Novo_ID = 1; for ($i = 0; $i < $num_rows; $i++) { $registro = $result -> fetch_row(); $sql2 = "UPDATE usuarios_dados SET ID='$Novo_ID' WHERE ID='$Novo_ID'"; $result2 = $conn->query($sql2); $Novo_ID++; } $sql = "SELECT * FROM usuarios_dados"; $result = $conn->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { echo "<tr> <td>$row[ID]</td> <td>$row[Nome_Empresa]</td> <td>$row[Responsavel]</td> <td>$row[Telefone_1]</td> <td>$row[Telefone_2]</td> <td>$row[Email_1]</td> <td>$row[Email_2]</td> <td>$row[Endereço]</td> <td>$row[CEP]</td> <td>$row[Bairro]</td> <td> <form method='post' action='Editar_Dados.php'> <input type='hidden' name='usuario' value='$usuario'> <input type='hidden' name='senha' value='$senha'> <input type='hidden' name='ID' value='$row[ID]'> <input type='submit' style='padding: 10px;' value='EDITAR'> </form> </td> <td> <form method='post' action='Deletar_Dados.php'> <input type='hidden' name='usuario' value='$usuario'> <input type='hidden' name='senha' value='$senha'> <input type='hidden' name='ID' value='$row[ID]'> <input type='submit' style='padding: 10px;' value='DELETAR'> </form> </td> </tr> "; } } else { echo "0 results"; } $conn->close();  
    • Por ILR master
      Boa tarde pessoal, tudo bem ?
       
      Eu uso o tinymce para cadastro de textos no meu siite, porém, quero fazer um sistema para que os colunistas possam fazer o próprio post.
      O problema do tinymce, é que ele mantém a formatação do texto copiado, como tamanho de fonts, negritos, etc... Quero que o usuário cole o texto e a própria textarea limpe a formatação para que ele formate como quiser.
       
      A pergunta é:
       
      O tinymce tem uma opção para desabilitar a formatação quando um texto é colocado?
      Tem alguma função via java ou php para retirar a formatação assim que o texto é colado?
      Ou é melhor usar um outro editor?
       
      Agradeço deste já.
    • Por Giovanird
      Olá a todos!
      Tenho uma pagina que possui uma DIV onde coloquei uma pagina PHP.
      Uso a função setInterval para atualizar a pagina inclusa dentro da DIV.
      O problema é que ao acessar o site , a DIV só me mostra a pagina inclusa somente quando completo o primeiro minuto.
      Preciso que a pagina inclusa já inicie carregada
       
      Meu código JavaScript e a DIV com a pagina PHP
       
      <script> function atualiza(){ var url = 'direita.php'; $.get(url, function(dataReturn) { $('#direita').html(dataReturn); }); } setInterval("atualiza()",60000); </script> <div> <span id="direita"></span> </div>  
    • Por juliosonic
      Boa noite..
      Estou desenvolvendo um site de https://www.maithunatantra.com.br/ e estou com um duvida sobre o menu de navegação da versão mobile.
      O menu que tem o dropdown "Terapeutas" e "Terapias" quando clico em cima ele expande como deve ser, mas quando clico denovo para recolher os submenus
      nao acontece nada.. segue o trecho do codigo do menu..
      <div class="collapse navbar-collapse" id="navbarsExample09">             <ul class="navbar-nav ml-auto">               <li class="nav-item  active"><a class="nav-link" href="index.html">Home</a></li>               <li class="nav-item  active"><a class="nav-link" href="about-us.html">Quem Somos</a></li>               <li class="nav-item dropdown1">                     <a class="nav-link dropdown-toggle" data-toggle="dropdown1" href="#">Terapeutas</a>                     <ul class="dropdown-menu">                         <li><a class="dropdown-item" href="terapeuta-julio-cezar.html">Julio Cezar</a></li>                         <li><a class="dropdown-item" href="terapeuta-pamela-priscila.html">Pamela Priscila</a></li>                     </ul>                                    </li>               <li class="nav-item dropdown">                     <a class="nav-link dropdown-toggle" data-toggle="dropdown1" href="#">Terapias</a>                     <ul class="dropdown-menu" aria-labelledby="dropdown01">                         <li><a class="dropdown-item" href="o-que-e-reiki.html">O que é Reiki</a></li>                         <li><a class="dropdown-item" href="beneficios-reiki.html">Benefícios do Reiki</a></li>                         <li><a class="dropdown-item" href="principios-reiki.html">Princípios do Reiki</a></li>                         <li><a class="dropdown-item" href="animais-reiki.html">Reiki em Animais</a></li>                         <li><a class="dropdown-item" href="animais-reiki.html">Estudos Sobre Reiki</a></li>                         <li><a class="dropdown-item" href="terapia-massagem-tantrica.html">Terapia Tântrica</a></li>                     </ul>               </li>               <li class="nav-item  active"><a class="nav-link" href="blog.html">Blog</a></li>                <li class="nav-item"><a class="nav-link" href="contato.html">Contato</a></li>             </ul>         </div>  
      Massagem Tantrica em Curitiba
      Tantra Curitiba
      Massagem Tântrica
      Tantra
      Julio Darshan

      Obrigado
      Att
      Julio Cezar
       
       
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.