Publicidade

DinhoPHP

[Resolvido] Problema com login

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>";
    }
}

 

0

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>";
            }
0

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!

0

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" 

0

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.

0

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:

0

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.

0

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.

0

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!

0

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

0

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.

0

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.

0

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!

0

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");
        }
    }

 

0

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

0

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.

0

Compartilhar este post


Link para o post
Compartilhar em outros sites
print_r($dadoslogin);

retorna o que?

0

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.

0

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");
        }
    }

 

0

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 MenoR
      Eu queria sabe qual tipo de código/comando ou sla... para criar botão duplo "sei la como fala :D"
       
      exemplos:
      Visitante ver assim:

      Usuário Logados:

       
      esse negocio ficará nas pagina livre (fora da restrição de login).
    • Por Gabrielvt14
      Olá pessoal, estou com problemas para criar um simples sistema de login usando PDO statement.
      É um sistema de login bem simples, não utilizei nem criptografia nas senhas.
      Quando executo o código, trago as informações do banco em forma de array utilizando fetchAll(PDO::FETCH_ASSOC);
      Mas o array retorna vazio, e os dados inseridos no formulário existem no banco de dados.
       
      Arquivo login.php:
      <?php require_once 'Banco.php'; $email = isset($_POST['email']) ? $_POST['email']: ''; $senha = isset($_POST['senha']) ? $_POST['senha']: ''; $pdo = conecta(); $sql = "SELECT * FROM usuarios WHERE email = :email AND senha = :senha"; $stmt = $pdo->prepare($sql); $stmt->bindValue(':email', $email); $stmt->bindValue(':senha', $senha); $stmt->execute(); $array = $stmt->fetchAll(PDO::FETCH_ASSOC); if(count($array) <= 0){ echo 'Acesso liberado'; var_dump($array); }else{ echo 'Usuario ou senha incorretos'; } Desde já agradeço!
    • Por MenoR
      <?php include 'config.php'; // Conexão Ao Bancos De Dados session_start(); if(!isset($_SESSION['usuarioEmail']) || !isset($_SESSION["senha"])){ header("Location: login"); exit; } else { //echo "<script> window.alert('Você Ja Está Logado!'); </script>"; } ?> Eu queria ativa um Nivel de acesso para paginas, niveis: 1, 2 & 3....
      no mysql a tabela do nivel é "niveis_acesso_id", tudo funcionando para determinados nivel mais queria por na restrição o valor do mesmo pois se nao por o mesmo não faz sentido '-' 
      eu nao tenho a minima ideia alguém pode me ajuda?
       
      eu queria se possivel fazer uma pagina exemplo:
       
      admin > ID4
      Mod > ID3
      Play > ID2
      Ban > ID1
       
      Caso um Mod ou play acessa link: site.com/admin ele ser redirecionado para uma pagina informando: Vocênao tem permissão para acessa tal pagina
    • Por Alan Leandro
      Galera poderiam me tirar uma dúvida para me dar um norte sobre o que estudar?
      Estou fazendo um sistema web utilizando bootstrap,javascript,php e mysql.
      Gostaria de saber oq devo estudar para conseguir fazer uma pagina de login que de acesso ao sistema por completo, porem para cada usuário diferente deve trazer páginas diferentes, como por exemplo os acessos do adiministrador serão diferentes do usuário normal. Até ai ja ate fiz, mas não consigo controlar 1º que os usuário so acessem as paginas depois de logar, hj se o usuario digitar na barra por exemplo \index\relatorios.php ele abre normal mesmo não podendo ter acesso, 2º como diferenciar esse acesso apos o login de cada usuário.

      Acredito pelo que pesquisei que é com SESSION, so queria saber se eh isso msm, se vcs tem alguma dica , se estou esquecendo algo , se tenho que criar paginas diferentes para cada usuário ,estou começando a mexer com aplicação web agora , desde já agradeço abraços.
       
    • Por Saul da Silva Rolim
      Olá, eu sou meio novo nesses assuntos mas estava tentando desenvolver um site que o usuário logasse na MINHA página inicial e então todos os outros LINKS EXTERNOS já são automaticamente logados.
      Que nem nessa imagem o usuário(azul embaixo da nuvem) loga no meu site(seria a nuvem, no caso) e então quando ele clicar nos links externos já redirecionará para a página requisitada sem a necessidade do login novamente. Eu tava procurando e vi sobre SSO (Single Sign On), mas como implementar, precisa de token(aliás o que é token), o que é necessário?
      OBS: Os outros links a serem acessados são outros sites, que eu gostaria de pular a etapa de login do site deles, para facilitar a vida
      Exemplo Prático: Youtube, quando você loga no gmail ele já automaticamente está interligado com com o youtube. Era isso que eu queria só que com sites externos pois o outro site não está sobre meu domínio