Ir para conteúdo
DinhoPHP

[Resolvido] Problema com login

Recommended Posts

Tenho um sistema de login conforme o código abaixo, porém o post  já inicia com uma senha criptografada com 40string mesmo com o campo vazio, e o usuario se loga com qualquer senha digitada. Favor! Preciso de ajuda para concluir isto. Fiz várias pesquisas e nada.

logar.php

require_once 'conexao.php';
require_once 'Login.class.php';
    //RECEBE OS DADOS DO FORMULÁRIO
    /*$email = $_POST["email"];
    $senha = $_POST["senha"];*/

    $email = preg_replace('/[^[:alnum:]_.-]/', '', $_POST["email"]);
    $senha = sha1($_POST["senha"]. "spbrmitcz");

        //VERIFICA SE ESTÃO VAZIOS
        if (empty($email) || empty($senha)) {
            echo "Preencha todos os campos!";
        }else {
            //Email inválido!
            if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
                echo "Email ou senha inválidos! Por favor, digite novamente.";
            } else {
                //Executa a classe Login

                $logado = new Login();
                $logado = $logado->Logar($email, $senha);
            }
        }
    echo "<br>" . var_dump($email) . "<br>". var_dump($senha);

Login.class.php

require_once 'conexao.php';

class Login extends Conexao
{
    public function Logar($email, $senha){
        $datalog = $this->pdo->prepare("SELECT * FROM profissionais WHERE email = :email AND senha = :senha");
        $datalog->bindValue(':email', $email, PDO::PARAM_STR);
        $datalog->bindValue(':senha', $senha);
        $datalog->execute();
        $datalog->fetchAll(PDO::FETCH_ASSOC);

            if (count($datalog) <= 0) {
                echo "<h1>Digite seu email e senha corretamente!</h1>";
            } else {
                echo "<h1>Logado com sucesso!</h1>";
            }
echo "<br>"
        .var_dump($datalog)."<br>"
        .var_dump($email)."<br>"
        .var_dump($senha)."<br>";
    }
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

A sua senha "inicia" com 40 caracteres por esse motivo:

$senha = sha1($_POST["senha"]. "spbrmitcz");

 

Ele gera o hash sha1 do post vazio. Não deseja isto? Verifique se o post está preenchido ou não (if/else) ANTES de aplicar o sha1.

 

Quanto ao outro problema, altere a lógica:

 

$datalog = $this->pdo->prepare("SELECT * FROM profissionais WHERE email = :email AND senha = :senha LIMIT 1");
        $datalog->bindValue(':email', $email, PDO::PARAM_STR);
        $datalog->bindValue(':senha', $senha, PDO::PARAM_STR);
        $datalog->execute();
        

            if ($datalog->rowCount() != 1) {
                echo "<h1>Digite seu email e senha corretamente!</h1>";
				print_r($datalog->errorInfo();
            } else {
                echo "<h1>Logado com sucesso!</h1>";
            }

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pensei nisso, porém não testei sem o hash para a leitura da senha no BD, Assim como vi em um vídeo no Youtube. Vou testar e retorno. Obrigadão!

Compartilhar este post


Link para o post
Compartilhar em outros sites
 $email = preg_replace('/[^[:alnum:]_.-]/', '', $_POST["email"]);
    $senha = sha1($_POST["senha"]);

Está estranho esse negócio, continua com 40 strings

 if ($datalog->rowCount() != 1) {
                echo "<h1>Digite seu email e senha corretamente!</h1>";
                print_r($datalog->errorInfo());
            } else {
                echo "<h1>Logado com sucesso!</h1>";
            }

Mudei a lógica e só dá incorreto e...

Digite seu email e senha corretamente!

Array ( [0] => 00000 [1] => [2] => ) object(PDOStatement)#3 (1) { ["queryString"]=> string(67) "SELECT * FROM profissionais WHERE email = :email AND senha = :senha" } string(10) "nanapb.com" string(40) "7c222fb2927d828af22f592134e8932480637c0d" 



string(10) "nanapb.com" string(40) "7c222fb2927d828af22f592134e8932480637c0d" 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Login funcionando perfeitamente assim: (sem a preg_replace, pois ela removeu a arroba)

logar.php

require_once 'conexao.php';
require_once 'Login.class.php';
    //RECEBE OS DADOS DO FORMULÁRIO
    $email = $_POST["email"];
    $senha = $_POST["senha"];

    //$email = preg_replace('/[^[:alnum:]_.-]/', '', $_POST["email"]);
    $senha2 = sha1($senha. "spbrmitcz");
        //VERIFICA SE ESTÃO VAZIOS
        if (empty($email) || empty($senha)) {
            echo "Preencha todos os campos!";
        }else {
            //Todos os campos preenchidos
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                echo "Email ou senha inválidos! Por favor, digite novamente.";
            } else {
                //Executa a classe de cadastro

                $logado = new Login();
                $logado = $logado->Logar($email, $senha2);
            }
        }echo var_dump($email);

Login.class.php

require_once 'conexao.php';

class Login extends Conexao
{
    public function Logar($email, $senha2){
        $datalog = $this->pdo->prepare("SELECT * FROM profissionais WHERE email = :email AND senha = :senha LIMIT 1");
        $datalog->bindValue(":email", $email);
        $datalog->bindValue(":senha", $senha2);
        $datalog->execute();
        $datalog->fetchAll(PDO::FETCH_ASSOC);

            if ($datalog->rowCount() == 1){
                echo "<h1>Logado com sucesso!</h1>";
            } else {
                echo "<h1>Digite seu email e senha corretamente!</h1>";
                print_r($datalog->errorInfo());
            }echo "<br>"
            .var_dump($datalog)."<br>"
            .var_dump($email)."<br>"
            .var_dump($senha2)."<br>";
    }
}

Agora preciso tratar as SQL injections, me deparei com diversos posts até mesmo daqui, ainda não testei e apliquei nenhum. Se alguém tiver sugestão de qual a melhor e puder me ajudar, pois de SQL injection não entendo muito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

1 hora atrás, DinhoPHP disse:

Agora preciso tratar as SQL injections, me deparei com diversos posts até mesmo daqui, ainda não testei e apliquei nenhum. Se alguém tiver sugestão de qual a melhor e puder me ajudar, pois de SQL injection não entendo muito.

A PDO já faz isso! :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites
10 horas atrás, Williams Duarte disse:

 

A PDO já faz isso! :thumbsup:

Valeu William, desculpe enfadar mais uma vez, mas isso foi solucionado 100% com o PDO? Pois eu tentei algumas e realmente não consegui realizar a SQL Injection.

Compartilhar este post


Link para o post
Compartilhar em outros sites
10 minutos atrás, DinhoPHP disse:

Valeu William, desculpe enfadar mais uma vez, mas isso foi solucionado 100% com o PDO? Pois eu tentei algumas e realmente não consegui realizar a SQL Injection.

Não, nada é 100% garantido, PDO resolve muito bem problema de sql injection de primeira ordem, esse post explica exatamente essa situação:

http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to-prevent-sql-injection

 

Tenha em mente que nada que venha do usuário é seguro, mesmo vindo de campos "select", "checkbox" e etc, tudo pode ser manipulado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Agradeço aos dois pela ajuda e informação, bom, vejo que a frase que li em um livro JAVA no passado e a levo em mente sempre será verídica, na programação nada é 100% perfeito. É que bate uns receios, mas procurarei fazer o meu melhor, ter coragem e seguir. Bom, isso que fiz foi algo bem básico só para testar estas funções, tanto que não apliquei SESSION nem nada. Mas vlw!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tenha em mente que é seguro contra injeção sql, mas não é 100%.
Mas acredito que você não conseguira desenvolver algo mais seguro do que a própria PDO. Use as constantes na declarações.
 

...

$datalog = $this->pdo->prepare("SELECT * FROM profissionais WHERE email = :email AND senha = :senha LIMIT 1");
$datalog->bindParam(":email", $email, PDO::PARAM_STR);
$datalog->bindParam(":senha", $senha2, PDO::PARAM_STR);

...

 

http://php.net/manual/en/pdo.constants.php

Compartilhar este post


Link para o post
Compartilhar em outros sites
47 minutos atrás, Williams Duarte disse:

Tenha em mente que é seguro contra injeção sql, mas não é 100%.
Mas acredito que você não conseguira desenvolver algo mais seguro do que a própria PDO. Use as constantes na declarações.
 


...

$datalog = $this->pdo->prepare("SELECT * FROM profissionais WHERE email = :email AND senha = :senha LIMIT 1");
$datalog->bindParam(":email", $email, PDO::PARAM_STR);
$datalog->bindParam(":senha", $senha2, PDO::PARAM_STR);

...

 

http://php.net/manual/en/pdo.constants.php

Compreendo e sempre faço uso destas contants, mas como eu vinha tendo problemas eu a tinha removido. Já fiz alguns freelance só que nada relacionado à sistema de cadastro e login; e nesses eu percebi esses usos da PDO mesmo, só que como este eu estou desenvolvendo, veio uma preocupação extra.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Somente para complementar, o tutorial mais completo sobre sql injection + php solutions que eu já li está em:

https://phpdelusions.net/

 

Vale muito a leitura.

Compartilhar este post


Link para o post
Compartilhar em outros sites
5 minutos atrás, Gabriel Heming disse:

Somente para complementar, o tutorial mais completo sobre sql injection + php solutions que eu já li está em:

https://phpdelusions.net/

 

Vale muito a leitura.

Beleza! Gabriel. Super válido esse complemento. Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos, venho novamente e espero que possam me ajudar novamente. Uma vez que fiz esse SELECT * FROM, eu não deveria retornar à qualquer campo da minha tabela sem ter erros? Eu já fiz isso uma vez, inclusive no mesmo projeto, só que aqui não funciona, nem com PDO::FECTH_OBJ ou ASSOC.

 

public function Login($email, $senha2){
        $datalog = $this->pdo->prepare("SELECT * FROM profissionais WHERE email = :email AND senha = :senha LIMIT 1");
        $datalog->bindValue(":email", $email);
        $datalog->bindValue(":senha", $senha2);
        $datalog->execute();
        $dadoslogin = $datalog->fetchAll(PDO::FETCH_OBJ);

        if ($dadoslogin){
            session_start();
            $_SESSION["id"] = $dadoslogin->id; //TENTATIVA
            $_SESSION["email"] = $email; // FUNCIONAL
            echo "<h1>Logado com sucesso!".$_SESSION["email"]."</h1>";// TESTE DE EXIBIÇÃO
            echo "<h1>Logado com sucesso!".$_SESSION["id"]."</h1>";//FAIL RS
            //header("refresh: 3; url=mensagem.php");
        } else {
            echo "<h1>Email ou senha incorretos! Por favor, digite novamente.</h1>";
            session_destroy();
            header("refresh: 3; url=../login.php");
        }
    }

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use $datalog->rowCount() para ver quantas linhas retornaram na query...

Compartilhar este post


Link para o post
Compartilhar em outros sites
10 minutos atrás, ESerra disse:

Use $datalog->rowCount() para ver quantas linhas retornaram na query...

Retorna exatamente a uma.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dei um var_dump ($dadoslogin) e me retornou à isto

 

array(1) { [0]=> object(stdClass)#4 (7) { ["id"]=> string(2) "14" ["nivel"]=> string(1) "1" ["status"]=> string(1) "1" ["nome"]=> string(4) "Nana" ["rua"]=> string(14) "Rua souza maia" ["email"]=> string(11) "nana@pb.com" ["senha"]=> string(40) "senha criptografada" } } string(11) "nana@pb.com"

 

Ou seja, tudo está vindo no array.

4 minutos atrás, ESerra disse:

print_r($dadoslogin);

retorna o que?

Eu  estava enviando o var_dump quando me enviou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado ESerra pelo apoio, mas resolvi desta maneira. Tinha esquecido do Fetch rs

 

public function Login($email, $senha2){
        $datalog = $this->pdo->prepare("SELECT * FROM profissionais WHERE email = :email AND senha = :senha LIMIT 1");
        $datalog->bindValue(":email", $email, PDO::PARAM_STR);
        $datalog->bindValue(":senha", $senha2, PDO::PARAM_STR);
        $datalog->execute();
        $dadoslogin = $datalog->fetch(PDO::FETCH_ASSOC);
        echo var_dump($datalog->rowCount()). "<br>";

        if ($dadoslogin){
            session_start();
            $_SESSION["nome"] = $dadoslogin["nome"]; // FUNCIONAL
            $_SESSION["email"] = $dadoslogin["email"]; // FUNCIONAL

            echo "<h1>Logado com sucesso!".$_SESSION["nome"]."</h1>";// TESTE DE EXIBIÇÃO
            echo "<h1>Logado com sucesso!".$_SESSION["email"]."</h1>";//FAIL RS
            //header("refresh: 3; url=../mensagem.php");
            echo print_r($dadoslogin);
        } else {
            echo "<h1>Email ou senha incorretos! Por favor, digite novamente.</h1>";
            session_destroy();
            header("refresh: 3; url=../login.php");
        }
    }

 

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


  • Próximos Eventos

  • Conteúdo Similar

    • Por XCobra Commandx
      Ola !
       
      Sou iniciante em php e fui tentar criar um sistema de login usando um código pronto (página do tutorial com o sistema para download) , porem encontrei dificuldades em aplicar o código. O problema é que quando eu aperto o botão "sing up" ele não muda a tabela e fica travado apenas na plataforma de login além de não incorporar a fonte desejada. Aqui esta o meu :  site de testes.
       
      Estou usando o 000webhost para testar os códigos e praticar , porque além de gratuito ele oferece um banco de dados e a habilidade de editar os códigos em qualquer língua (php 7.1).
       
       
    • Por elicarlos1987
      Bom dia,
      Estou começando agora no universo da programação PHP e com a ajuda de uns tutoriais estou montando um sistema de login.
      Essa etapa consegui, porém estou tentando colocar níveis de acesso ao fazer o login. No meu banco de dados no PHPmyAdmin criei uma coluna com o nome "nível".
      Gostaria de saber como coloco cada usuario ao ser logado ser redirecionado diretamente para uma página de acordo com o seu nível colocado na tabela.
       
      Os códigos da página de login e a de validação para entenderem melhor o que foi feito:
      index.php

      <?php     if(isset($_GET['msg'])){         $msg = $_GET['msg'];         switch($msg){             case 1:             ?>                 <div class="message">                     <div class="alert alert-danger">                         <a href="index.php" class="close" data-dismiss="alert">&times</a>                         Email ou Senha errados tente outra vez.                     </div>                 </div>             <?php             break;             case 2:             ?>                 <div class="message">                     <div class="alert alert-danger">                         <a href="index.php" class="close" data-dismiss="alert">&times</a>                         Você não tem permissão para acessar esta página.                     </div>                 </div>             <?php             break;             case 3:             ?>                 <div class="message">                     <div class="alert alert-success">                         <a href="index.php" class="close" data-dismiss="alert">&times</a>                         Logout realizado com sucesso.                     </div>                 </div>             <?php             break;         }     }  ?> <!DOCTYPE html> <html lang="pt-br"> <head>     <meta charset="utf-8">     <meta http-equiv="X-UA-Compatible" content="IE=edge">     <title>Login</title>     <link rel="stylesheet" href="css/estilo.css">     <link rel="stylesheet" href="css/bootstrap.min.css"> </head> <body>     <div class="container">         <form action="autenticar.php" method="post" class="form-login">             <h2 class="form-login-heading">Entre com o usuário</h2>             <label for="inputUsuario" class="sr-only">Usuario</label>             <input type="text" id="inputUsuario" name="inputUsuario" class="form-control" placeholder="Usuario" required autofocus>             <label for="inputPassword" class="sr-only">Senha</label>             <input type="password" id="inputPassword" name="inputPassword" class="form-control" placeholder="Senha" required>             <div class="checkbox">                 <label><input type="checkbox"value="esqueci">Esqueci a senha</label>             </div>             <button type="submit" class="btn btn-lg btn-primary btn-block">Entrar</button>         </form>     </div> </body> </html>
      autenticar.php

      <?php     require ("db.php");     $email = $_POST['inputUsuario'];     $senha = md5($_POST['inputPassword']);          $query = mysqli_query($conn,"SELECT * FROM usuarios WHERE email = '$email' AND senha = '$senha'");     $row = mysqli_num_rows($query);     if ($row > 0){         session_start();         $_SESSION['email'] = $_POST['inputUsuario'];         $_SESSION['senha'] = $_POST['inputPassword'];         header('Location: dashboard.php');     }else{         header('Location: index.php?msg=1');     } ?>
       
      Desde já agradeço muito a ajuda.
    • Por RogérioSilva
      Alguém pode me salvar?
      Baixei um script de login do facebook, configurei o aplicativo, até ai ok
      Coloco pra fazer login, pede a autorização..
      Mas ai volta para página de login, não muda nada,  e a url fica tipo "?code=TOKEN..." no final, alguém sabe o que pode ser?
      Baixei esse script http://www.krizna.com/demo/login-with-facebook-using-php/
    • Por Jefferson andre
      Bom dia,
       
      Estou com um erro na tela de login do site que acontece quando o email + a senha nao sao encontrados no mysql.
       
      O estranho é que a rotina if nem deveria passar por esta parte
       
      <?php session_start(); $email = isset($_POST['a_email']) ? $_POST['a_email'] : ''; $senha = isset($_POST['a_senha']) ? $_POST['a_senha'] : ''; $senha=md5($senha); //print "$email"; include("conexao.php"); $sql = "SELECT * FROM empresa_emails WHERE email = '$email' AND senha = '$senha'"; foreach ($arquivo->query($sql) as $row) { // print $row['email'] . "\t"; // print $row['senha'] . "\t"; // print $row['codemp'] . "\n"; } if($arquivo->query($sql) !== true) { $_SESSION['email']=$email; $_SESSION['senha']=$senha; $codemp = $row['codemp']; ERRO BEM AQUI $_SESSION['id_emp']=$codemp; //echo $codemp; //header('location:menuprincipal.php'); } else{ unset ($_SESSION['email']); unset ($_SESSION['senha']); unset ($_SESSION['id_emp']); header('location:index.php'); } ?> Se o email e a senha md5 estão na base de dados ao meu ver o if é = true, se o query resulta em falso então ela vai pra parte do unset
       
      o erro ocorre na linha  $codemp = $row['codemp'] e faz sentido já que o row não existe com um query falso
       
      Alguem por favor pode me dizer onde esta o erro no if
       
      Obrigado pela atenção
       
    • Por Jefferson andre
      Saudações a todos,
       
      Estou iniciando em php e criando minha tela de usuários que poderão utilizar minha pagina por meio de login e senha.
       
      Gostaria de saber como colocar uma ou mais variáveis de memoria que controlem quem esta logado, isso impedira o usuário de se logar duas vezes ao mesmo tempo.
       
      Aceito sugestões e dicas a respeito, trabalho com programação faz muitos anos e na linguagem que conheço é fácil mas aqui estou ralando pra aprender.
       
      Obrigado pela atenção
       
       
×

Informação importante

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

Este projeto é mantido e patrocinado pelas empresas:
Hospedado por: