Beto Lima 0 Denunciar post Postado Abril 19, 2010 Olá estou com uma dúvida quanto fazer um login usando PDO. vou primeiro postar o cód abaixo\; <?php // Definindo parametros de conexao $dsn = 'mysql:host=localhost;port=3306;dbname=banco'; $usuario = 'usuario'; $senha = 'senha'; // Conectando try { $pdo = new PDO($dsn, $usuario, $senha); } catch (PDOException $e) { echo $e->getMessage(); exit(1); } // Preparando statement $stmt = $pdo->prepare("SELECT * FROM usuario WHERE login = ? AND senha = ?"); $stmt->bindparam(1, $_POST['login'], PDO::PARAM_STR); $stmt->bindparam(2, $_POST['senha'], PDO::PARAM_STR); // Executando statement $stmt->execute(); // Obter linha consultada $obj = $stmt->fetchObject(); // Se a linha existe: indicar que esta logado e encaminhar para outro lugar if ($obj) { $_SESSION['login'] = $_POST['login']; header('Location: http://outro/lugar'); } else { echo '<p class="erro">Login/Senha inválidos</p>'; } ?> <form action="login.php" method="post"> Login: <input type="text" name="login" /> Senha: <input type="password" name="senha" /> <input name="submit" type="submit" value="Enviar" /> </form> A minha intenção é usar senha cryptografada com crypt recebendo os dados do post com crypt e comparando com a senha criptografada la no banco. Porém desta maneira não consegui fazer ('SELECT * FROM usuario WHERE login = ? AND senha = ?') Então fiz da seguinte maneira: // recebo os dados $post_login = crypt($_POST['login']); $post_senha = crypt($_POST['senha']); // aqui apenas fiz um select normal sem verificar user e senha, Irei verificar depois (isso me da sensação de desproteção), mas estou aqui justamente pra tirar essa dúvida... $stmt = $pdo->prepare("SELECT * FROM usuario"); // aqui comparo o post com a senha guardada no banco if ((crypt($post_login, $obj->login) == $obj->login) && (crypt($post_senha, $obj->senha) == $obj->senha)) { echo 'então passou e redireciona pro inicio'; } Perguntas: 1) Há uma maneira de eu fazer essa condição de verificar a criptografia direto no sql? 2) Estou deixando alguma brecha em usar somente select normal no primeiro exemplo? 3) Qual a melhor forma de fazer isso, visto que desejo usar criptografia dos dados. Obrigado a todos Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Abril 19, 2010 se o seu objetivo é proteger as informações durante a autenticação, terá de fazer uso de conexão segura (https://:443) e para isso, deverá comprar um certificado digital SSL. agora se deseja apenas proteger as informações do banco, utilizando-se de mysql, é possível aplicar as funções sha(), sha1() e md5() na hora de gravar/ler os dados INSERT INTO `usuarios` VALUES("evandro",MD5("minhasenha")); SELECT `nome` FROM `usuarios` WHERE `nome`="evandro" AND `senha`=MD5("minhasenha"); Compartilhar este post Link para o post Compartilhar em outros sites
Beto Lima 0 Denunciar post Postado Abril 19, 2010 eu queria usar crypt. há como na consulta? Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Abril 19, 2010 sim, se você gravar no banco já encriptado: <?php $pass = crypt($_POST['password']); mysql_query("INSERT INTO `usuarios` VALUES ('username','{$pass}');"); mysql_query("SELECT * FROM `usuarios` WHERE `nome`='username' AND `senha`='{$pass}';"); Compartilhar este post Link para o post Compartilhar em outros sites
Beto Lima 0 Denunciar post Postado Abril 19, 2010 Evandro, simples assim? Eu vou realmente gravar a senha no banco criptografada, gero ela na tela, copio e colo la na tabela. Mas o login seria só isso mesmo? recebo o post com crypt e faço o select na base comparando o valor exato do post com a senha guardada? pelo que eu sei o crypt se renova a cada refresh na tela. então eu nunca teria o mesmo hash. pelo que eu sei a comparação se faz assim: if(crypt($_POST['login'], senha guardada) == senha guardada){ passou... } Estou errado? Compartilhar este post Link para o post Compartilhar em outros sites
Evandro Oliveira 331 Denunciar post Postado Abril 19, 2010 pelo que eu sei o crypt se renova a cada refresh na tela. isso se você não definir um salt, aí é utilizado por padrão uma relação com a data/hora local (não sei ao certo se é o timestamp) basta definir um salt padrão na hora de (des)criptografar os dados Compartilhar este post Link para o post Compartilhar em outros sites
Beto Lima 0 Denunciar post Postado Abril 22, 2010 meu script final ficou assim. comentem.... valeu... <?php $sucesso = 'inicio.php?sessao=inicio'; $retorna_site = 'url do seu site'; $display = 'none'; if(isset($_POST['usuario']) && ($_POST['senha'])){ $post_login = $_POST['usuario']; $post_senha = $_POST['senha']; // Definindo parametros de conexao PDO $hos = 'mysql:host=localhost;port=3306;dbname=banco'; $usr = 'user'; $pwd = 'senha'; // Conectando try { $pdo = new PDO($hos, $usr, $pwd); } catch (PDOException $e) { echo $e->getMessage(); exit(1); // sai com um código de erro } // Obter usuario do BD que possui o login informado $stmt = $pdo->prepare("SELECT login,password FROM acesso WHERE login = :login LIMIT 1"); $stmt->bindparam(':login', $post_login, PDO::PARAM_STR); $stmt->execute(); $linha = $stmt->fetchObject(); if (!$linha) { // Usuario nao existe header("Location: ". $retorna_site); } // Verificar se a senha codificada com o sal usado na senha do BD produz a senha do BD $senha_codificada = crypt($post_senha, $linha->password); if ($senha_codificada == $linha->password) { session_start(); $_SESSION['user'] = $post_login; header("Location: ". $sucesso); } else { $display = 'block'; $saida = 'Usuário e(ou) senha inválido!'; } } // fecha if(isset($_POST)) ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html dir="ltr" xmlns="http://www.w3.org/1999/xhtml" lang="pt-PT"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>login</title> </head> <body> <div id="login_error" style="display:<?php echo $display;?>"><?php echo '<strong>ERRO</strong>:' . $saida;?><br /></div> <br /> <form name="loginform" id="loginform" action="<?php echo $_SERVER['PHP_SELF'];?>" method="post"> <label for="usuario">Usuário<br> <input name="usuario" id="usuario" type="text" /> </label> <label for="senha">Senha<br> <input name="senha" id="senha" /> </label> <input id="submit" value="Logar" type="submit"> </form> </body> </html> Compartilhar este post Link para o post Compartilhar em outros sites