Ir para conteúdo

POWERED BY:

Arquivado

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

Beto Lima

[Resolvido] Login PDO

Recommended Posts

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

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

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

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

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

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

×

Informação importante

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