Jump to content
mikeysantana

Sistema de Login com password_verify em PDO

Recommended Posts

mikeysantana

Boa noite,

Estava a fazer um sistema de login simples, pela primeira vez.

Segui todos os pormenores, mas, ao que parece, o código consegue reconhecer quando as passwords estão incorretas e quando as contas não existem, mas quando o username e a password estão corretos, ele não redireciona para a página inicial, nem sei bem porquê. Se alguém puder ajudar, agradecia. Segui este tutorial: https://www.tutorialrepublic.com/php-tutorial/php-mysql-login-system.php

O código no topo da página do login é este:

<?php
// Include config file
require_once 'config.php';
 
// Define variables and initialize with empty values
$username = $password = "";
$username_err = $password_err = "";
 
// Processing form data when form is submitted
if($_SERVER["REQUEST_METHOD"] == "POST"){
 
    // Check if username is empty
    if(empty(trim($_POST["LoginUtilizador"]))){
        $username_err = 'Por favor, introduza o seu nome de utilizador.';
    } else{
        $username = trim($_POST["LoginUtilizador"]);
    }
    
    // Check if password is empty
    if(empty(trim($_POST['PasswordUtilizador']))){
        $password_err = 'Por favor, introduza a sua palavra-passe.';
    } else{
        $password = trim($_POST['PasswordUtilizador']);
    }
    
    // Validate credentials
    if(empty($username_err) && empty($password_err)){
        // Prepare a select statement
        $sql = "SELECT LoginUtilizador, PasswordUtilizador FROM Utilizadores WHERE LoginUtilizador = :LoginUtilizador";
        
        if($stmt = $pdo->prepare($sql)){
            // Bind variables to the prepared statement as parameters
            $stmt->bindParam(':LoginUtilizador', $param_username, PDO::PARAM_STR);
            
            // Set parameters
            $param_username = trim($_POST["LoginUtilizador"]);
            
            // Attempt to execute the prepared statement
            if($stmt->execute()){
                // Check if username exists, if yes then verify password
                if($stmt->rowCount() == 1){
                    if($row = $stmt->fetch()){
                        $hashed_password = $row['PasswordUtilizador'];
                        if(password_verify($password, $hashed_password)){
                            /* Password is correct, so start a new session and
                            save the username to the session */
                            session_start();
                            $_SESSION['LoginUtilizador'] = $username;      
                            header("location: index.php");
                        }
						else{
                            // Display an error message if password is not valid
                            $password_err = 'A palavra-passe inserida não é válida.';
                        }
                    }
                }
				else{
                    // Display an error message if username doesn't exist
                    $username_err = 'Nenhuma conta foi encontrada com esse nome de utilizador.';
                }
            }
			else{
                echo "Ups! Algo correu mal! Tente novamente mais tarde.";
            }
        }
        
        // Close statement
        unset($stmt);
    }
    
    // Close connection
    unset($pdo);
}
?>

No formulário, o código é assim:

<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
      <div class="form-group <?php echo (!empty($username_err)) ? 'has-error' : ''; ?>">
        <input type="text" class="form-control" name="LoginUtilizador" id="LoginUtilizador" placeholder="Nome de Utilizador" value="<?php echo $username; ?>">
        <span class="help-block"><?php echo $username_err; ?></span>
      </div>
      <div class="form-group <?php echo (!empty($password_err)) ? 'has-error' : ''; ?>">
        <input type="password" class="form-control" name="PasswordUtilizador" id="PasswordUtilizador" placeholder="Palavra-passe">
        <span class="help-block"><?php echo $password_err; ?></span>
      </div>
      <div class="row">
        <div class="col-xs-6">
          <div class="checkbox icheck">
            <label>
              <input type="checkbox"> Lembrar-me
            </label>
          </div>
        </div>
        <!-- /.col -->
        <div class="col-xs-6">
          <button type="submit" value="Submit" class="btn btn-primary btn-block btn-flat">Iniciar Sessão</button>
        </div>
        <!-- /.col -->
      </div>
    </form>

mikeysantana

Share this post


Link to post
Share on other sites
mikeysantana
55 minutos atrás, HappyHippyHippo disse:

posso adivinhar que existe cosias após o código php ?

Sim, basicamente apenas a página HTML com o formulário de login.

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>IDGest | Iniciar Sessão</title>
  <!-- Tell the browser to be responsive to screen width -->
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
  <!-- Bootstrap 3.3.6 -->
  <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
  <!-- Font Awesome -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
  <!-- Ionicons -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css">
  <!-- Theme style -->
  <link rel="stylesheet" href="dist/css/AdminLTE.min.css">
  <!-- iCheck -->
  <link rel="stylesheet" href="plugins/iCheck/square/blue.css">
  <link rel="stylesheet" href="dist/css/popup.css"

  <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
  <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
  <!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
  <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
  <![endif]-->
</head>
<body class="hold-transition login-page">
<div class="login-box">
  <div class="login-logo">
    <a href="index2.html"><b>ID</b>Gest</a>
  </div>
  <!-- /.login-logo -->
  <div class="login-box-body">
    <p class="login-box-msg">Inicie sessão para entrar no programa</p>

    <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
      <div class="form-group <?php echo (!empty($username_err)) ? 'has-error' : ''; ?>">
        <input type="text" class="form-control" name="LoginUtilizador" id="LoginUtilizador" placeholder="Nome de Utilizador" value="<?php echo $username; ?>">
        <span class="help-block"><?php echo $username_err; ?></span>
      </div>
      <div class="form-group <?php echo (!empty($password_err)) ? 'has-error' : ''; ?>">
        <input type="password" class="form-control" name="PasswordUtilizador" id="PasswordUtilizador" placeholder="Palavra-passe">
        <span class="help-block"><?php echo $password_err; ?></span>
      </div>
      <div class="row">
        <div class="col-xs-6">
          <div class="checkbox icheck">
            <label>
              <input type="checkbox"> Lembrar-me
            </label>
          </div>
        </div>
        <!-- /.col -->
        <div class="col-xs-6">
          <button type="submit" value="Submit" class="btn btn-primary btn-block btn-flat">Iniciar Sessão</button>
        </div>
        <!-- /.col -->
      </div>
    </form>

	  <a href="esqueci-palavra-passe.php">Esqueci-me da palavra-passe</a><br>
  </div>
</div>
<!-- /.login-box -->
			
<!-- jQuery 2.2.3 -->
<script src="plugins/jQuery/jquery-2.2.3.min.js"></script>
<!-- Bootstrap 3.3.6 -->
<script src="bootstrap/js/bootstrap.min.js"></script>
<!-- iCheck -->
<script src="plugins/iCheck/icheck.min.js"></script>
<script>
  $(function () {
    $('input').iCheck({
      checkboxClass: 'icheckbox_square-blue',
      radioClass: 'iradio_square-blue',
      increaseArea: '20%' // optional
    });
  });
</script>
</body>
</html>

Apenas isto.

mikeysantana

Share this post


Link to post
Share on other sites
HappyHippyHippo

e o que achas que acontece depois de fazeres isto ?

header("location: index.php");

 


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mikeysantana
2 minutos atrás, HappyHippyHippo disse:

e o que achas que acontece depois de fazeres isto ?


header("location: index.php");

 

Supostamente, redirecionar para a página "index.php", mas não acontece.

Share this post


Link to post
Share on other sites
HappyHippyHippo

pois não

porque estás a apresentar o formulário. que tal enfiar um die() logo depois da função header ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mikeysantana
2 minutos atrás, HappyHippyHippo disse:

pois não

porque estás a apresentar o formulário. que tal enfiar um die() logo depois da função header ?

Então ficaria assim?

if(password_verify($password, $hashed_password)){
	/* Password is correct, so start a new session and
    save the username to the session */
    session_start();
    $_SESSION['LoginUtilizador'] = $username;      
    header("location: index.php");
	die();
}

É que continua a fazer refresh à página e não entra na página "index.php"

Share this post


Link to post
Share on other sites
HappyHippyHippo

pois, mas como não faço ideia do que existe na página index.php, omo achas que te poderemos ajudar ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mikeysantana
3 minutos atrás, HappyHippyHippo disse:

pois, mas como não faço ideia do que existe na página index.php, omo achas que te poderemos ajudar ?

Pois, acredito!

Tive a experimentar sem o código que impede o acesso à página "index.php" sem login e já deu.

Assim, o problema deve estar neste código:

<?php
// Initialize the session
session_start();
 
// If session variable is not set it will redirect to login page
if(!isset($_SESSION['LoginUtilizador']) || empty($_SESSION['PasswordUtilizador'])){
  header("location: login.php");
  exit;
}
?>

 

Share this post


Link to post
Share on other sites
acao
5 minutos atrás, mikeysantana disse:

if(password_verify($password, $hashed_password)){

já verificaste  se retorna true?

cumpts

Share this post


Link to post
Share on other sites
HappyHippyHippo

que valores estás a guardar em sessão e em que linha estás a fazer-lo ?

1 minute ago, acao said:

já verificaste  se retorna true?

cumpts

lê melhor o código ... o erro está à vista ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mikeysantana
1 minuto atrás, acao disse:

já verificaste  se retorna true?

cumpts

Sinceramente, não verifiquei, mas ele impede o login com pass errada e com pass certa já entra, por isso, deve retornar true.

Share this post


Link to post
Share on other sites
HappyHippyHippo
4 minutes ago, HappyHippyHippo said:

que valores estás a guardar em sessão e em que linha estás a fazer-lo ?

 


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mikeysantana
2 minutos atrás, HappyHippyHippo disse:

que valores estás a guardar em sessão e em que linha estás a fazer-lo ?

Estou a guardar o login e a password, pelo menos é essa a minha intenção. Na linha 43 guardo a hashed_password e na linha 48 guardo o nome de utilizador.

5 minutos atrás, HappyHippyHippo disse:

lê melhor o código ... o erro está à vista ...

A sério?! Estive a ver isto tanta vez que ainda nem dei por ele! Onde está?

Share this post


Link to post
Share on other sites
HappyHippyHippo
1 minute ago, mikeysantana said:

Estou a guardar o login e a password, pelo menos é essa a minha intenção. Na linha 43 guardo a hashed_password e na linha 48 guardo o nome de utilizador.

então, para ti, guardar a password é copiar-la para uma variável qualquer, certo ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mikeysantana
Agora, HappyHippyHippo disse:

então, para ti, guardar a password é copiar-la para uma variável qualquer, certo ?

Pois..... eu disse que é a minha primeira vez com logins, por isso, não fiques muito chateado com algumas burrices! :P

Pelo teu discurso, já percebi que não...

Share this post


Link to post
Share on other sites
HappyHippyHippo

então vamos virar ao contrário : porque achas que estás a guardar o nome do utilizador numa variável/array tão estranho ?

agora uma dica de caras : porque raio estás a validar a existência da password num local/array que nunca fizeste referência anteriormente ?

  • Vote 1

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mikeysantana
1 minuto atrás, HappyHippyHippo disse:

então vamos virar ao contrário : porque achas que estás a guardar o nome do utilizador numa variável/array tão estranho ?

Estás a referir-te a "LoginUtilizador"?

2 minutos atrás, HappyHippyHippo disse:

agora uma dica de caras : porque raio estás a validar a existência da password num local/array que nunca fizeste referência anteriormente ?

Acredito que seja um pouco estranho, mas eu simplesmente segui o tutorial, e lá pedia para colocar isso em todas as páginas...

Share this post


Link to post
Share on other sites
HappyHippyHippo
Just now, mikeysantana said:

Estás a referir-te a "LoginUtilizador"?

não, a $_SESSION['LoginUtilizador']

Just now, mikeysantana said:

Acredito que seja um pouco estranho, mas eu simplesmente segui o tutorial, e lá pedia para colocar isso em todas as páginas...

e não pensaste o que isso iria implicar ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
mikeysantana
2 minutos atrás, HappyHippyHippo disse:

não, a $_SESSION['LoginUtilizador']

Mas deveria ser outro? É essa a coluna na BD. Ou não é assim?

3 minutos atrás, HappyHippyHippo disse:

e não pensaste o que isso iria implicar ?

Sinceramente, não, porque nunca tinha trabalhado com estes comandos com MySQL.

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

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.