Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

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

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

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

  • Conteúdo Similar

    • Por eduardodsilvaq
      Erro retornado no console do navegador: 400 bad request
      Rastreei o erro ate essa parte no arquivo admin-ajax.php mudando o valor de resposta de 0 para 1:
      if ( is_user_logged_in() ) { // If no action is registered, return a Bad Request response. if ( ! has_action( "wp_ajax_{$action}" ) ) { wp_die( '0', 400 ); } Tentei de tudo, mas infelizmente nao entendi oq realmente significa esse login e como ele funciona.
      Vi algumas pessoas tendo problema com o host, no meu caso estou usando hostinger. (Nao creio que isso e relevante mas ta ai.)
       
      Código utilizado:
       
      Javascript
      function formValidation() { event.preventDefault(); var name = document.forms["contactForm"]["name"].value; var email = document.forms["contactForm"]["email"].value; var subject = document.forms["contactForm"]["subject"].value; var message = document.forms["contactForm"]["message"].value; document.getElementById('status').innerHTML = ''; var errorMessage="<span class='error'>All fields are required.</span>"; var regEx = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/; if (name.trim() == "" ||email.trim() == "" || subject.trim() == "" || message.trim() == "") { document.getElementById('status').innerHTML = errorMessage; return false; } if (!regEx.test(email)) { var errorMessage="<span class='error'>Invalid email.</span>"; document.getElementById('status').innerHTML = errorMessage; return false; } processContactSubmit(); return true; } function processContactSubmit() { var request = new XMLHttpRequest(); request.open("POST", "/wp-admin/admin-ajax.php?action=process_contact_form"); request.onreadystatechange = function() { if(this.readyState === 4 && this.status === 200) { document.getElementById("status").innerHTML = this.responseText; } }; var myForm = document.getElementById("contactForm"); var formData = new FormData(contactForm); request.send(formData); } functions.php
      add_action('wp_ajax_nopriv_process_contact_form', 'process_contact_form'); add_action('wp_ajax_process_contact_form', 'process_contact_form'); //Retirar essa parte para error no console, no contrario ira aparecer no navegador o numero 0. function process_contact_form() { $to = "Recipient Email Address"; $subject = $_POST["subject"]; $headers = "Testing"; $message = $_POST["message"]; $attachments = ""; $sent = wp_mail($to, $subject, $message, $headers, $attachments); if (! $sent) { echo "<span class='error'>Problem in sending mail.</span>"; } else { echo "<span class='success'>Hi, thank you for the message.</span>"; } wp_die(); } Html
      <form name="contactForm" id="contactForm" method="post" onsubmit="return formValidation()" action=""> <p class="comment-form-comment"><textarea id="message" name="message" required="" placeholder="" aria-required="true"></textarea></p> <p class="comment-form-author"><label for="author">Nome: </label> <input id="name" name="name" required="" size="30" type="text" value=" " /></p> <p class="comment-form-author about"><label for="author">Assunto: </label> <input id="subject" name="subject" required="" size="40" type="text" value=" " /></p> <p class="comment-form-email"><label for="email">Email: </label> <input id="email" name="email" required="" size="30" type="text" value="" /></p> <p class="form-submit"><input id="submit" class="submit" name="email_contato" type="submit" value="Enviar" /></p> </form>&nbsp; <h3><div id="status"></div></h3>  
    • Por belann
      Olá!
       
      Eu tentar logar no wordpress que instalei em minha máquina usando localhost e logando com wp-login.php, está dando uma mensagem que o banco de dados não pode ser acessado.
      Estou usando o xampp. O que pode estar errado.
    • Por acdestefani
      Olá pessoal!
      Peguei alguns códigos na internet para para estudar um pouco e aproveitei para desenvolver um sisteminha simples aqui onde eu trabalho. Consegui desenvolvê-lo usando esse arquivo de conexão:
      <?php /************************************************************************************************************* * @author William F. Leite * * Data: 20/06/2014 * * Descrição: Classe elaborada com o objetivo de auxlilar nas operações CRUDs em diversos SGBDS, possui * * funcionalidades para construir instruções de INSERT, UPDATE E DELETE onde as mesmas podem ser executadas * * nos principais SGBDs, exemplo SQL Server, MySQL e Firebird. Instruções SELECT são recebidas integralmente * * via parâmetro. * *************************************************************************************************************/ /* * Constantes de parâmetros para configuração da conexão */ define('SGBD', 'mysql'); define('HOST', 'localhost'); define('DBNAME', 'contratos_rh'); define('CHARSET', 'utf8'); define('USER', 'tonhao'); define('PASSWORD', '100375'); define('SERVER', 'linux'); class conexao { /* * Atributo estático de conexão */ private static $pdo; /* * Escondendo o construtor da classe */ private function __construct() { // } /* * Método privado para verificar se a extensão PDO do banco de dados escolhido * está habilitada */ private static function verificaExtensao() { switch(SGBD): case 'mysql': $extensao = 'pdo_mysql'; break; case 'mssql':{ if(SERVER == 'linux'): $extensao = 'pdo_dblib'; else: $extensao = 'pdo_sqlsrv'; endif; break; } case 'postgre': $extensao = 'pdo_pgsql'; break; endswitch; if(!extension_loaded($extensao)): echo "<h1>Extensão {$extensao} não habilitada!</h1>"; exit(); endif; } /* * Método estático para retornar uma conexão válida * Verifica se já existe uma instância da conexão, caso não, configura uma nova conexão */ public static function getInstance() { self::verificaExtensao(); if (!isset(self::$pdo)) { try { $opcoes = array(\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'); switch (SGBD) : case 'mysql': self::$pdo = new \PDO("mysql:host=" . HOST . "; dbname=" . DBNAME . ";", USER, PASSWORD, $opcoes); break; case 'mssql':{ if(SERVER == 'linux'): self::$pdo = new \PDO("dblib:host=" . HOST . "; database=" . DBNAME . ";", USER, PASSWORD, $opcoes); else: self::$pdo = new \PDO("sqlsrv:server=" . HOST . "; database=" . DBNAME . ";", USER, PASSWORD, $opcoes); endif; break; } case 'postgre': self::$pdo = new \PDO("pgsql:host=" . HOST . "; dbname=" . DBNAME . ";", USER, PASSWORD, $opcoes); break; endswitch; self::$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { print "Erro: " . $e->getMessage(); } } return self::$pdo; } public static function isConectado(){ if(self::$pdo): return true; else: return false; endif; } } O sistema está funcionando perfeitamente, porém gostaria de incluir a necessidade de fazer login para acessá-lo. Usei o código abaixo, que também consegui na internet:
      <?php session_start(); include('conexao.php'); if(empty($_POST['usuario']) || empty($_POST['senha'])) { header('Location: index.php'); exit(); } $usuario = mysqli_real_escape_string($conexao, $_POST['usuario']); $senha = mysqli_real_escape_string($conexao, $_POST['senha']); $query = "SELECT usuario FROM tab_usuarios WHERE usuario = '{$usuario}' AND senha = md5('{$senha}')"; $result = mysqli_query($conexao, $query); $row = mysqli_num_rows($result); if($row == 1) { $_SESSION['usuario'] = $usuario; header('Location: painel_professor.php'); exit(); } else { $_SESSION['nao_autenticado'] = true; header('Location: index.php'); exit(); } Porém esse login só funciona usando esse arquivo de conexão:
      <?php define('HOST', '127.0.0.1'); define('USUARIO', 'tonhao'); define('SENHA', '100375'); define('DB', 'contratos_rh'); $conexao = mysqli_connect(HOST, USUARIO, SENHA, DB) or die ('Não foi possível conectar'); Como poderia adaptá-lo para que funcione com o primeiro arquivo de conexão? Tentei por vários dias, mas como tenho pouca experiência com programação, não consegui.
      Desde já agradeço a ajuda de todos
       
    • Por feasso
      É possível criar um sistema de cadastre-se ou logue-se usando LinkedIn ? Não achei nada na web que seja novo... apenas postagem de 2013!
    • Por asacap1000
      Galera já não sei mais onde procurar, estou configurando o processo de login com certificação digital porém não consigo ler o retorno. No site da Certisign explica em java e .Net mas utilizo em minha aplicação da intranet tudo em PHP como eu teria que fazer. Segue exemplo que eles fornecem em .Net
       
      <form action="https://autenticador.certisign.com.br/CertisignLogin/certificado/login" method="get"> <input type="hidden" value="209" id="id" name="id"> <input type="hidden" value="CHAVE CRIPTOGRAFICA INICIAL" id="nome" name="nome"> <input type="hidden" value="http://www.seusite.com.br/suaAplicacao/retorno" id="retorno" name="retorno"> <div> <input type="image" src="images/ico-certisign_30x30.png" alt="Submit" id="btnLoginCertisign"> </div> </form> O de cima envia até aí tudo bem
       
      Abaixo o retorno que é o que não consigo fazer em PHP
       
      string retorno = Request["cb"]; string encryptionKey = "<conteúdo da chave criptográfica descarregada na etapa 2>"; retorno = CryptoLogin.Instance.DecryptText(retorno,encryptionKey);</conteúdo> A variável retorno deverá mostrar as informações como o exemplo aaixo.
       
      CertificadoBean: { emissor: Certisign Autoridade Certificadora TESTE, nome: "PROPRIETARIO DO CERTIFICADO DE TESTE", cpf: "001.002.003-44", cnpj: "", OAB: "", validade: "2015-05-27 20:59:59", emissao: "2014-05-27 21:00:00", email: "proprietario.teste@certisign.com.br", certificadoBase64: "MIIFmDCCBICgAwI...... BAQUFADCCARAx" }  
×

Informação importante

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