formulario com login e senha com o PDO.

Enviada por lena 
lena
formulario com login e senha com o PDO.
30 de March de 2010 às 06:30PM
Olá, pessoal! Preciso de exemplo completo de formulario com login e senha com o PDO incluso (urgente!).
Esse é o meu formulario com login e senha com o PDO, mas não está funcionando; não consegui achar o erro; me ajudem por favor!!
<?php
#$conexao = mysql_connect("localhost","usuario","senha","cliente");
mysql_select_db("mysql");
if(!get_magic_quotes_gpc()){
foreach($_POST as $campo => $valor){
$_POST[$campo] = mysql_real_escape_string($valor);
}
}

#$resultado = mysql_query($sql,$conexao);
#if(mysql_num_rows($resultado)) echo "ok";
#else echo "não ok";

$usuario = $_POST["usuario"];
$senha = $_POST["senha"];

$db = new mysqli("localhost", "usuario", "senha");
$c = $dbh->prepare("SELECT * FROM usuario WHERE login = ? AND senha = ?");
$c->bind_param("login", $_POST['login']);
$c->bind_param("senha", $_POST['senha']);
$c->execute();


?>

<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>
Rubens Takiguti Ribeiro
Re: formulario com login e senha com o PDO.
30 de March de 2010 às 11:15PM
Lena, esse seu script não está usando PDO. Está misturando o driver de funções do MySQL com a extensão MySQLi, que, embora esteja implementada sob o paradigma orientado a objetos e oferece alguns recursos extras, não faz parte do PDO.

Veja um exemplo usando PDO de fato (o ideal é você criptografar a senha que é guardada no BD):

<?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->bind_param(1, $_POST['login'], PDO::PARAM_STR);
$stmt->bind_param(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&aacute;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>
lena
Re: formulario com login e senha com o PDO.
31 de March de 2010 às 03:40PM
Valeu, Rubens, muito obrigada.... agora deu certo!!!!
Que bom poder contar com sua ajuda!!!
Roberto Lima
Re: formulario com login e senha com o PDO.
16 de April de 2010 às 12:12PM
Sr, Rubens Takiguti Ribeiro ;
O que você quis dizer com: "Veja um exemplo usando PDO de fato (o ideal é você criptografar a senha que é guardada no BD)"?
Como se faz isso usando seu script?

Obs: Eu vou usar a sua idéia para fazer login e gostaria de usar crypt para guardar senhas e fazer a comparação na hora do login.
Fica seguro comparando por crypt ou o melhor seria mesmo criptografar pelo sql?
Rubens Takiguti Ribeiro
Re: formulario com login e senha com o PDO.
19 de April de 2010 às 01:15AM
Roberto, a idéia é que, ao criar a senha, ela seja criptografada (com um mecanismo unidirecional, ou seja, que não possui decodificador) e guardada no BD. Assim que alguém tenta se autenticar (realizar log-in), você codifica a senha informada com o mesmo mecanismo e verifica se o valor codificado bate com aquele obtido do BD.

Um mecanismo simples é com MD5. Na hora de cadastrar o usuário, você aplica a função md5 sobre a senha:
$senha_codificada = md5($senha_original);

Depois, na hora de certificar a autenticação, você consultaria a senha do BD a partir do login.

Ao invés de fazer:
$stmt = $pdo->prepare("SELECT * FROM usuario WHERE login = ? AND senha = ?");

Você faria apenas:
$stmt = $pdo->prepare("SELECT * FROM usuario WHERE login = ?");

Ou seja, consultaria os dados do usuário apenas pelo login. Se existir o usuário, seria devolvida a senha do BD na forma codificada. Daí você codifica a senha informada e compara.

Você também pode usar outros mecanismos, como o crypt, que utiliza um sal (mais seguro).

$senha_codificada = crypt($senha_original);
$senha_codificada2 = crypt($senha_original, $senha_codificada);

Note que, neste caso, você usa a função sem parâmetros para gerar um sal aleatório e a senha codificada com aquele sal. Depois, para checar se uma senha bate com a senha codificada, você precisa passar o sal para a função de criptografia. Se você passar a própria senha codificada, também funciona, pois o sal está embutido.
Roberto Lima
Re: formulario com login e senha com o PDO.
19 de April de 2010 às 05:34PM
Rubens 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';
}

Eu queria usar o crypt pois o mesmo não tem decodificação, ao contrário do md5 que hoje já se consegue descriptografar..

1) Há uma maneira de eu fazer essa condição de verificar a criptografia direto no sql? (não consegui fazer com sql direto).
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.
Rubens Takiguti Ribeiro
Re: formulario com login e senha com o PDO.
20 de April de 2010 às 01:18AM
Roberto, normalmente não se codifica o login. Caso contrário, você precisaria percorrer todos usuários do banco para determinar exatamente qual é aquele como login informado. Codifique apenas a senha que é melhor, mais rápido e, ainda, seguro.

<?php
...
$post_login = $_POST['login'];
$post_senha = $_POST['senha'];

// Obter usuario do BD que possui o login informado
$stmt = $pdo->prepare("SELECT * FROM usuario WHERE login = :login LIMIT 1");
$stmt->bind_param(':login', $post_login, PDO::PARAM_STR);
$stmt->execute();
$usuario = $stmt->fetchObject();

if (!$usuario) {
// Usuario nao existe
}

// Verificar se a senha codificada com o sal usado na senha do BD produz a senha do BD
$senha_codificada = crypt($post_senha, $usuario->senha);
if ($senha_codificada == $usuario->senha) {
// Usuario/Senha correta
} else {
// Usuario/Senha incorreta
}

?>

E onde você viu que já conseguem decodificar MD5? O que eu sei é que existem tabelas gigantescas com valores MD5 pré-calculados de possíveis senhas. Daí, se o sistema estiver desprotegido e alguém obter a senha codificada, ele pode tentar achar o valor em uma tabela. O algoritimo para decodificar, matematicamente, o MD5 é muito complexo.

Se você quiser, pode até codificar o login com MD5, e buscá-lo pelo valor codificado. Porém, existe a possibilidade de dois logins diferentes gerarem o mesmo MD5 (muito raro). Em todo caso, protegeria a visibilidade do login.

<?php
...
$post_login = $_POST['login'];
$post_senha = $_POST['senha'];

$login_md5 = md5($post_login);

// Obter usuario do BD que possui o login informado
$stmt = $pdo->prepare("SELECT * FROM usuario WHERE login = :login_md5 LIMIT 1");
$stmt->bind_param(':login_md5', $login_md5, PDO::PARAM_STR);
$stmt->execute();
$usuario = $stmt->fetchObject();

if (!$usuario) {
// Usuario nao existe
}

// Verificar se a senha codificada com o sal usado na senha do BD produz a senha do BD
$senha_codificada = crypt($post_senha, $usuario->senha);
if ($senha_codificada == $usuario->senha) {
// Usuario/Senha correta
} else {
// Usuario/Senha incorreta
}

?>
Roberto Lima
Re: formulario com login e senha com o PDO.
20 de April de 2010 às 01:18PM
Rubens, obrigado pelas dicas...vou testar aqui.
Realmente não tinha pensado em percorrer os usuários. mas no meu caso iria ter somente um usuario na tabela com a sua senha.
digo um site pequeno onde somente o dono vai alterar...então pensei em criptografar tb o user...
mas blz..
obs eu achei sobre o md5 nesse site: http://www.md5decrypter.com/
fiquei sabendo ontem que eles usam tabelas gigantescas....mas no final das contas já não se tem mais segurança com md5 concorda?

valeu... abraço
Rubens Takiguti Ribeiro
Re: formulario com login e senha com o PDO.
21 de April de 2010 às 01:20AM
Na verdade não concordo.

Embora existam estas bases gigantescas, se a tabela do BD que guarda a senha codificada com MD5 não puder ser vista por ninguém indevidamente, então o fato de ela usar MD5 não influi tanto. Afinal, se o usuário malicioso nem tem acesso ao valor codificado, como ele vai decodificar?

Existem outros pontos a serem levados em conta quando se entra nesse assunto. Por exemplo, a página que trafega dados sigilosos (como senhas) precisa trafegá-los sob uma conexão segura (https). Isso sim é importante.
Roberto Lima
Re: formulario com login e senha com o PDO.
21 de April de 2010 às 12:53PM
Pois e se alguém consegue ver a tabela e os resultados da mesma, vendo aquele hash de md5 ele pode tentar querer descriptografar...isso é que eu penso....mas claro que é difícil de acontecer...
Agora sobre https eu concordo com você, mas nunca consegui usar isso...se não me engano precisa-se ter um certificado ou usar algo pago....Seria isso?
abs...
Marcos Regis
Re: formulario com login e senha com o PDO.
21 de April de 2010 às 03:28PM
Roberto, só para conhecimento.
NÃO EXISTE DESCRIPTOGRAFIA DE MD5.

MD5 é um algoritmo de geração de HASH e não de criptografia. O que existe é matematicamente conhecido como 'efeito colisão' que é a tentativa de conseguir uma string que gere um MD5 igual ao gerado por outra string.

Qualquer criptografia reversivel está passiva de ser quebrada o que daria não só a capacidade de logar mas também de desconverter TODAS as senhas criptografadas com ele. Por isso que se usa HASH quando se trabalha com senhas, pois mesmo que se consiga uma colisão, isso não significa que todas as outras senhas foram comprometidas.

Quanto ao https é exatamente como falou. É necessário utilizar um certificado para criptografar a conexão.
O certificado em si pode ser colocado no sistema de forma gratuita, porém se ele não for validado por uma Autoridade Certificadora o navegador identificará a conexão como não segura. Ainda sim será possível utilizá-lo, mas não para sistemas de e-commerce que utilizam pagamentos via Banco ou Cartão de Crédito.
gabriel
Re: formulario com login e senha com o PDO.
07 de March de 2016 às 12:26PM
Olá, eu estava usando algo assim:

session_start();
include ("config.php");

$usuario = $_POST['usuario'];
$senha = $_POST['senha'];

if (!empty($usuario) AND !empty($senha)) {

echo "Por favor, todos campos devem ser preenchidos! <br /><br />";
echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"5; URL= ..\">";

}



else {


$senha = md5($senha);

/** @noinspection PhpDeprecationInspection */
$sql = mysql_query("SELECT * FROM usuarios WHERE usuario='{$usuario}' AND senha='{$senha}' AND ativado='1'");
$login_check = mysql_num_rows($sql);

if ($login_check > 0) {

/** @noinspection PhpDeprecationInspection */
while ($row = mysql_fetch_array($sql)) {

foreach ($row AS $key => $val) {

$$key = stripslashes($val);

}

$_SESSION['usuario_id'] = $usuario_id;
$_SESSION['nome'] = $nome;
$_SESSION['sobrenome'] = $sobrenome;
$_SESSION['email'] = $email;
$_SESSION['nivel_usuario'] = $nivel_usuario;
$_SESSION['img_profile'] = $img;
$_SESSION['user'] = $usuario;



/** @noinspection PhpDeprecationInspection */
mysql_query("UPDATE usuarios SET data_ultimo_login = now() WHERE usuario_id ='{$usuario_id}'");


header("Location:../pagina/home.php");
//echo "<META HTTP-EQUIV=\"Refresh\" CONTENT=\"0; URL= ../dash.php">";


}

} else {
header("Location:../");
}
}

Adorei o seu exemplo, más preciso verificar se esta ativado.
INSERT INTO `usuarios` VALUES ('1', 'Nome', 'Sobrenome', 'email@email.com', 'user', '8e4441f86ad(senha)09db96e5459', 'Auto Autenticado', '(classe)', '2015-09-19 (data-cadastro)17:33:38', '2016-03-02(data-ultimologin)12:30:30', '(ativado=1)', 'assets/logos/iimg.png');

No caso as sessões já estou mais safo, mas esse PDO está me matando.
Você precisa estar logado no PHPBrasil.com para poder enviar mensagens para os nossos fóruns.

Faça o login aqui.