Validar login PHP

lnarciso

Membro
Tenho este código para uma aplicação de uma loja online mas como sou novo em php estou com alguma dificuldade em validar o login pois ao submeter o form ele aceita tudo o que tiver escrito, existindo o utilizador na base de dados ou não. O que me está a faltar?

ficheiro: menu.php

<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Menu</title>


<?php
include ("estilos.php");
?>

</head>
<body>

<!-- menu -->
<div class="menu">
<ul>
<p><img src="imagens/logo.png" height="50px" width="50px"></p>
<p><h2>LOJA ONLINE LUIS NARCISO</h2></p>
<li><?php echo "<a href='index.php'> Produtos </a>";?></li>
<li><?php echo "<a href='carrinho.php'> Carrinho </a>";?></li>
<li><?php echo "<a href='forum.php'> Fórum </a>";?></li>
<li><?php echo "<a href='consultas.php'> Consultas </a>";?></li>
<li><?php echo "<a href='login.php'> Login/Registar </a>";?></li>
<li><?php
session_start();
if(!isset($_SESSION['username'])){
echo "<font color='white'>Olá&nbsp&nbsp<b>convidado</font>";
} else {
echo "<font color='white'>Olá&nbsp&nbsp<b>".$_SESSION['username']."</b><a href='logout.php'>Logout</a></font>";
};
?></li>
</ul>
</div>

</body>
</html>

ficheiro: login.php

<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Carrinho</title>

<?php
include ("menu.php");
?>

</head>
<body>

<!-- conteudo -->
<div class="conteudo">
<p><h1> Login/Registar </h1></p>

<!-- formulario login -->
<?php

if(!isset($_SESSION['username']) ){
if(!isset($_SESSION['']) and !isset($_SESSION['tentativas'])){
$_SESSION['codigo']=md5(rand());
$_SESSION['tentativas']=0;
$_SESSION['tempo_espera']=0;
}
if($_POST){
$_SESSION['tentativas']++;
if($_SESSION['tentativas']>10 and $_SESSION['tempo_espera']==0){
$_SESSION['tempo_espera']=time()+120;
} else {
if($_SESSION['codigo']==$_POST['codigo']){
$conexao = mysqli_connect("localhost", "root", "", "loja_online_lnarciso");
$hash = md5($_POST['password']);
$query = "SELECT * FROM utilizadores WHERE username = '{$_POST['username']}' and password = '{$hash}'";
$resultado = mysqli_query($conexao,$query);
$_SESSION['username']=$_POST['username'];
header("Location: {$_SERVER['PHP_SELF']}");
} else {
echo "formulário inválido!</br>";
}
}

} else if($_SESSION['tentativas']<10) {
?>

<form method="POST" action="">
<table align="center" width="300" border="0">

<tr>
<td><label>ENTRAR</label></td>
</tr>
<tr>
<td><label>Username</label></td>
<td><input type="text" name="username"><br></td>
</tr>
<tr>
<td><label>Password</label></td>
<td><input type="password" name="password"><br></td>
</tr>
<tr>
<td>&nbsp;</td>
<input type="hidden" name="codigo" value="<?php echo $_SESSION['codigo']; ?>" />
<td><input type="submit" value="login"></td>
</tr>
<tr>
<td><?php echo "<a href='utilizadores.php'><font color='black'> Registar </a></font>";?></td>
</tr>

</table>
</form>

<?php }
if($_SESSION['tempo_espera'] < time() and $_SESSION['tentativas']>10){
$_SESSION['tempo_espera']=0;
$_SESSION['tentativas']=0;
}
} else {
echo "<center>Login efetuado com sucesso!</center>";
}
?>

</div>
</body>
</html>
 
Não estás a fazer nada com o resultado da query. Esse resultado tanto pode ser um registo como nenhum registo mas na linha seguinte atribuis logo á sessão o username validando o login.
 
E não te esqueças de validar o input do utilizador para evitar sql injection. Pelo menos deves utilizar prepared statements.
 
Sempre podes partilhar o teu código com a malta para darmos a opinião se deve ou não ficar assim.
Adicionalmente ao partilhares o código sempre vais tirar dúvidas à malta com esse tipo de dúvidas.

Eu pessoalmente como trabalho muito com PHP, já tenho um ficheiro de funções com as funções core. Nunca perco tempo a fazer isso.
Já tenho uma função que faz o login e registo e afins. Também pode passar a ser uma boa prática para o futuro :)
 
Isso é bem pensado vou comecar a guardar funcoes com coisas que sejam necessarias no futuro porque facilita o trabalho.
Como ainda estou a fazer o projecto final do meu curso, ainda tenho muitas duvidas e esse tipo de praticas ainda nao as tenho.
 
Claro que sim.
No entanto se mantiveste algum do código dou-te já algumas sugestões para melhorar:
1. O session_start(); deve ser a primeira coisa do código PHP. Ele mal abres o site cria logo a sessão. Pode-te evitar muitas dores de cabeça.
2. Valida o input dos utilizadores. Se não o fizeres corres grande risco de SQL Injection. O principal que podes fazer já é alterar as queries à BD para prepared statements.
3. Em vez de usares MD5 usa SHA. É muito mais seguro.
4. O rand não é assim tão random quanto se pensa. Se queres criar um código hash (que é o que me parece dado fazeres um MD5 de um rand), utiliza antes o uniqid que te gera um número único baseado no timestamp (que é sempre diferente).

Qualquer coisa que precises diz :)
 
Ora bem, não entendo é uma cena... porque estas a usar tanto PHP desnecessário? Estes echo's todos.... mano essa cena não vale a pena.
Ok se precisas de tratar resultados, do tipo:
Código:
<?php 

$menu_items = [
                       "index" => "Produtos",
                       "carrinho" => "Carrinho", 
                       "forum" => "Fórum", 
                       "consultas" => "Consultas", 
                       "login" => "Login/Registar"
                       ];

foreach($menu_items as $file_name => $display_name):

?>

<li><a href='<?php echo $file_name; ?>.php'> <?php echo $display_name; ?> </a></li>

<?php endforeach; ?>

Para alem de outros sitios. Trazer html com echo's é mau estilo, php serve para controlar html em vez de o escrever.

________________________________________________________________________________________


Acerca do MD5, SHA etc. Ambos hash não são seguros, mesmo com sal. Por isso existe a função crypt(), que apesar do seu nome enganador faz hash (fck the logic, pelos vistos para alguns encrypt e hashing é a mesma coisa) de qualquer forma o crypt() da te mais opções, como sha256, sha512, blowfish etc. Mas isso poderas ver melhor no manual.
http://php.net/manual/en/function.crypt.php


Agora o seguinte. Se queres trabalhar serio com PHP, caga nessas cenas e começa ja a estudar um framework a serio, do tipo Laravel.

ps. não sei quem é o teu prof, mas estares a fazer design com tabelas é um pouco muito para os 2000's. Se formos por ai podes lhe perguntar se ele para rounded borders usa imagens ou border-radius. Se usa border-radius então porque ensina aos alunos a fazer design com tabelas e 0 HTML5?
Para mim é bom, daqui a alguns anos, quando vocês forem para o mercado, poderei pedir melhor salário como especialista, mas b1tch please, estou em programação pouco mais de 1 ano e ja tenho essas noções, porque os vossos prof's não têm?
 
Ora bem, não entendo é uma cena... porque estas a usar tanto PHP desnecessário? Estes echo's todos.... mano essa cena não vale a pena.
Ok se precisas de tratar resultados, do tipo:
Código:
<?php

$menu_items = [
                       "index" => "Produtos",
                       "carrinho" => "Carrinho",
                       "forum" => "Fórum",
                       "consultas" => "Consultas",
                       "login" => "Login/Registar"
                       ];

foreach($menu_items as $file_name => $display_name):

?>

<li><a href='<?php echo $file_name; ?>.php'> <?php echo $display_name; ?> </a></li>

<?php endforeach; ?>

Para alem de outros sitios. Trazer html com echo's é mau estilo, php serve para controlar html em vez de o escrever.

________________________________________________________________________________________


Acerca do MD5, SHA etc. Ambos hash não são seguros, mesmo com sal. Por isso existe a função crypt(), que apesar do seu nome enganador faz hash (fck the logic, pelos vistos para alguns encrypt e hashing é a mesma coisa) de qualquer forma o crypt() da te mais opções, como sha256, sha512, blowfish etc. Mas isso poderas ver melhor no manual.
http://php.net/manual/en/function.crypt.php


Agora o seguinte. Se queres trabalhar serio com PHP, caga nessas cenas e começa ja a estudar um framework a serio, do tipo Laravel.

ps. não sei quem é o teu prof, mas estares a fazer design com tabelas é um pouco muito para os 2000's. Se formos por ai podes lhe perguntar se ele para rounded borders usa imagens ou border-radius. Se usa border-radius então porque ensina aos alunos a fazer design com tabelas e 0 HTML5?
Para mim é bom, daqui a alguns anos, quando vocês forem para o mercado, poderei pedir melhor salário como especialista, mas b1tch please, estou em programação pouco mais de 1 ano e ja tenho essas noções, porque os vossos prof's não têm?

Uma boa opção que me deveriam ter dito e que ajudava bastante.
Sinceramente os meus formadores pecam um pouco por perderem pouco tempo nas explicações e muito em como poderia ser feito.
em alguns exercicios práticos pedi para verem o meu código e dizer o que poderia melhorar mas até agora não tive resposta para isso.

Assim que finalizar o curso dou uma vista de olhos em lavarel... trabalhar e estudar é cansativo...
 
Claro que sim.
No entanto se mantiveste algum do código dou-te já algumas sugestões para melhorar:
1. O session_start(); deve ser a primeira coisa do código PHP. Ele mal abres o site cria logo a sessão. Pode-te evitar muitas dores de cabeça.
2. Valida o input dos utilizadores. Se não o fizeres corres grande risco de SQL Injection. O principal que podes fazer já é alterar as queries à BD para prepared statements.
3. Em vez de usares MD5 usa SHA. É muito mais seguro.
4. O rand não é assim tão random quanto se pensa. Se queres criar um código hash (que é o que me parece dado fazeres um MD5 de um rand), utiliza antes o uniqid que te gera um número único baseado no timestamp (que é sempre diferente).

Qualquer coisa que precises diz :)

o Session Start uso no header das páginas.
Ainda vou tentar melhorar o código com base no que já li nos restantes comentários que acho que tenho umas quantas coisas a melhorar, tenho 2 meses de PHP, ainda não tenho bases suficientes e ainda perco muito tempo com coisas aparentemente simples.
 
Ora bem, não entendo é uma cena... porque estas a usar tanto PHP desnecessário? Estes echo's todos.... mano essa cena não vale a pena.
Ok se precisas de tratar resultados, do tipo:
Código:
<?php

$menu_items = [
                       "index" => "Produtos",
                       "carrinho" => "Carrinho",
                       "forum" => "Fórum",
                       "consultas" => "Consultas",
                       "login" => "Login/Registar"
                       ];

foreach($menu_items as $file_name => $display_name):

?>

<li><a href='<?php echo $file_name; ?>.php'> <?php echo $display_name; ?> </a></li>

<?php endforeach; ?>

Para alem de outros sitios. Trazer html com echo's é mau estilo, php serve para controlar html em vez de o escrever.

________________________________________________________________________________________


Acerca do MD5, SHA etc. Ambos hash não são seguros, mesmo com sal. Por isso existe a função crypt(), que apesar do seu nome enganador faz hash (fck the logic, pelos vistos para alguns encrypt e hashing é a mesma coisa) de qualquer forma o crypt() da te mais opções, como sha256, sha512, blowfish etc. Mas isso poderas ver melhor no manual.
http://php.net/manual/en/function.crypt.php


Agora o seguinte. Se queres trabalhar serio com PHP, caga nessas cenas e começa ja a estudar um framework a serio, do tipo Laravel.

ps. não sei quem é o teu prof, mas estares a fazer design com tabelas é um pouco muito para os 2000's. Se formos por ai podes lhe perguntar se ele para rounded borders usa imagens ou border-radius. Se usa border-radius então porque ensina aos alunos a fazer design com tabelas e 0 HTML5?
Para mim é bom, daqui a alguns anos, quando vocês forem para o mercado, poderei pedir melhor salário como especialista, mas b1tch please, estou em programação pouco mais de 1 ano e ja tenho essas noções, porque os vossos prof's não têm?
Ora bem, não entendo é uma cena... porque estas a usar tanto PHP desnecessário? Estes echo's todos.... mano essa cena não vale a pena.
Ok se precisas de tratar resultados, do tipo:
Código:
<?php

$menu_items = [
                       "index" => "Produtos",
                       "carrinho" => "Carrinho",
                       "forum" => "Fórum",
                       "consultas" => "Consultas",
                       "login" => "Login/Registar"
                       ];

foreach($menu_items as $file_name => $display_name):

?>

<li><a href='<?php echo $file_name; ?>.php'> <?php echo $display_name; ?> </a></li>

<?php endforeach; ?>

Para alem de outros sitios. Trazer html com echo's é mau estilo, php serve para controlar html em vez de o escrever.

________________________________________________________________________________________


Acerca do MD5, SHA etc. Ambos hash não são seguros, mesmo com sal. Por isso existe a função crypt(), que apesar do seu nome enganador faz hash (fck the logic, pelos vistos para alguns encrypt e hashing é a mesma coisa) de qualquer forma o crypt() da te mais opções, como sha256, sha512, blowfish etc. Mas isso poderas ver melhor no manual.
http://php.net/manual/en/function.crypt.php


Agora o seguinte. Se queres trabalhar serio com PHP, caga nessas cenas e começa ja a estudar um framework a serio, do tipo Laravel.

ps. não sei quem é o teu prof, mas estares a fazer design com tabelas é um pouco muito para os 2000's. Se formos por ai podes lhe perguntar se ele para rounded borders usa imagens ou border-radius. Se usa border-radius então porque ensina aos alunos a fazer design com tabelas e 0 HTML5?
Para mim é bom, daqui a alguns anos, quando vocês forem para o mercado, poderei pedir melhor salário como especialista, mas b1tch please, estou em programação pouco mais de 1 ano e ja tenho essas noções, porque os vossos prof's não têm?


Já agora, que sites recomendas para estudar Lavarel?
 
Já agora, que sites recomendas para estudar Lavarel?
A opção é boa, porque da uma lógica completamente diferente a execução. Desta forma tu podes ate meter as cenas na base de dados e trabalhar a partir dai da mesma forma e validar alguns dados. =)

Acerca do Laravel, hmmm... o site deles tem uma documentação muito boa. Mas é preciso saber bastante bem o PHP. Estou a estudar por um curso de um russo a versão 5.2, mas duvido que isso será util para ti, a não sei que fales russo e agora ja esta na 5.4 xD
https://laravel.com/docs/5.4

Tambem, ja que estas a apostar em desenvolvimento web, acho que deves fazer a questão a ti proprio. O que queres fazer no futuro. Eu foquei me com cabeça no PHP e sim, em termos da WEB é bastante bom e em termos de freelancing, para alem do facto que tem varias platformas em php, nomeadamente Wordpress, Opencart entre outros dos mais populares. Entretanto o JS com node.js vai muito alem e tem mais possibilidades, sabendo bem o javascript es capaz de escrever o frontend, o backend e tambem a desktop app... so por enquanto não ficou no olimpo, devido ao facto que muita coisa ta escrita em PHP. Ouvi dizer que a nova versão do PHP tmb é fixe e não tenho a analise de PHP 7, com o JS, entretanto ando agora aos poucos a passar para JS, para por os meus projetos em JS. E la esta, com PHP não da para por as coisas a funcionar tão facilmente...

Ah e adicionando, tambem consegues escrever web games, pois agora com HTML5 canvas + JS poder ir muito alem das possibilidades do flash player
 
A opção é boa, porque da uma lógica completamente diferente a execução. Desta forma tu podes ate meter as cenas na base de dados e trabalhar a partir dai da mesma forma e validar alguns dados. =)

Acerca do Laravel, hmmm... o site deles tem uma documentação muito boa. Mas é preciso saber bastante bem o PHP. Estou a estudar por um curso de um russo a versão 5.2, mas duvido que isso será util para ti, a não sei que fales russo e agora ja esta na 5.4 xD
https://laravel.com/docs/5.4

Tambem, ja que estas a apostar em desenvolvimento web, acho que deves fazer a questão a ti proprio. O que queres fazer no futuro. Eu foquei me com cabeça no PHP e sim, em termos da WEB é bastante bom e em termos de freelancing, para alem do facto que tem varias platformas em php, nomeadamente Wordpress, Opencart entre outros dos mais populares. Entretanto o JS com node.js vai muito alem e tem mais possibilidades, sabendo bem o javascript es capaz de escrever o frontend, o backend e tambem a desktop app... so por enquanto não ficou no olimpo, devido ao facto que muita coisa ta escrita em PHP. Ouvi dizer que a nova versão do PHP tmb é fixe e não tenho a analise de PHP 7, com o JS, entretanto ando agora aos poucos a passar para JS, para por os meus projetos em JS. E la esta, com PHP não da para por as coisas a funcionar tão facilmente...

Ah e adicionando, tambem consegues escrever web games, pois agora com HTML5 canvas + JS poder ir muito alem das possibilidades do flash player


Sendo assim e pelo que dizes vale bem apostar em JS com node.js que dá mais saida especialmente porque me dizes que PHP não é tão fácil de por as coisas a funcionar corretamente.
Eu ainda estou muito verde seja no que for por isso agora é uma boa altura para ver qual o melhor caminho a seguir.

Acho que antes de Laravel tenho que conseguir consolidar bem as minhas bases de PHP.
 
o Session Start uso no header das páginas.
Ainda vou tentar melhorar o código com base no que já li nos restantes comentários que acho que tenho umas quantas coisas a melhorar, tenho 2 meses de PHP, ainda não tenho bases suficientes e ainda perco muito tempo com coisas aparentemente simples.

Eu percebo perfeitamente. Apenas estou a dar alguns conselhos sobre o que podes ver para melhorar já. Obviamente tudo tem uma curva de aprendizagem, mas a verdade é que aprendendo PHP fica muito mais facil de depois aprenderes Java ou C que são muito parecidas.

Aquilo que te posso sugerir é que te foques numa coisa de cada. Quando te sentires à vontade passa ao seguinte. Ao nivel web tudo se complementa perfeitamente.
Por exemplo, primeiro conhece o HTML e depois o CSS e JS que é tudo client side. Depois podes passar ao PHP que é server side e complementa-se muito bem com o resto. Por fim, frameworks para cima e novas libs :)

Mas para quem tem 2 meses de PHP já andares com sessões e base de dados estás no bom caminho ;)
 
Sendo assim e pelo que dizes vale bem apostar em JS com node.js que dá mais saida especialmente porque me dizes que PHP não é tão fácil de por as coisas a funcionar corretamente.
Eu ainda estou muito verde seja no que for por isso agora é uma boa altura para ver qual o melhor caminho a seguir.

Acho que antes de Laravel tenho que conseguir consolidar bem as minhas bases de PHP.

Vale so no caso de não quereres ir para freelance... la esta é uma cena que vais estar sempre a tocar... as vezes ate sera mais facil de por um site em WP a correr e precisas de PHP... mas se fores independente de freelance e de clientes e queres apostar em algo mais universal então JS sem duvida. O PHP é e sera popular ainda uns bons anos, tanto o JS vai estar ao seu lado. Por isso é dificil fazer a escolha. Não te estou a empurar para um ou para outro, pois se formos a ver o mercado ta tipo 51% php e 49% js com muito mais potencial... isso são numeros a toa, pois tambme temos ruby e ruby on rails que ja estao a cavar o buraco onde ficarão, para alem de outras linguagens. Por isso é uma coisa que tu tens de decidir. E não posso discordar com XRS, sabendo PHP teras facilidade com C, C++ e C#. Java acho mais parecido com javascript...

Acerca de
PHP não é tão fácil de por as coisas a funcionar corretamente.
Não sei se percebeste bem. O PHP não é dificil de meter a funcionar. Ele funciona e bem, mas precisas de um server. O que quis dizer é que por exemplo para fazeres um frontend não precisas de nenhum software adicional. HTML + CSS + JS + Bloco de notas e ta feito, ao contrario de PHP.
Queres um servidor tambem para parte de backend? Facil, poe node.js (aqui ja vais precisar tmb de um server).
Queres uma aplicação no teu desktop, independentemente da OS que estas a utilizar? Facil, Electron.
Queres facilitar o trabalho com o frontend? jQuery.
Queres dar um upgrade ao HTML? AngularJS
Queres fazer um jogo? Canvas + JS


Por outro lado. Queres arranjar trabalho em web, como backend developer? 90% do trabalho sera PHP! Sem duvida.
Teras de refazer um site? 90% que este foi escrito em PHP.
Teras de fazer uma landing page com admin panel? O cliente vai querer WP. Ou outra platforma com PHP.
Teras de trabalhar com outros gajos? Eles vão preferir PHP.
PHP é um classico, é um mustang. Entretanto JS ja é um tesla... (não entendo muito de carros, mas espero que o exemplo foi bom xD)
É bom ter um mustang, muitos querem, muitos conhecem... mas o futuro esta no tesla.
Mesma coisa aqui... vai demorar tempo para pessoas passarem para JS.
 
$hash = md5($_POST['password']);

md5 é um hash extremamente fraco e facilmente quebravél hoje em dia. SHA256 ou SHA512 com salt seriam opções mais viáveis. Vê a função hash_hmac por exemplo. Se usares salt, vai-te obrigar a guardar na tabela de utilizadores o salt para fazer o reconstruir o hash. Vê na net, há montes de exemplos como fazer

$query = "SELECT * FROM utilizadores WHERE username = '{$_POST['username']}' and password = '{$hash}'";

Tudo bem que usas mysqli mas não estás a fazer escape ao input do utilizador, logo estás mais sujeito a ataques de SQL injections. Usa antes PDO com prepared statements. É mais seguro e é fácil de compreender.

<table align="center" width="300" border="0">

<tr>
<td><label>ENTRAR</label></td>
</tr>
<tr>
<td><label>Username</label></td>
<td><input type="text" name="username"><br></td>
</tr>
<tr>
<td><label>Password</label></td>
<td><input type="password" name="password"><br></td>
</tr>
<tr>
<td>&nbsp;</td>
<input type="hidden" name="codigo" value="<?php echo $_SESSION['codigo']; ?>" />
<td><input type="submit" value="login"></td>
</tr>
<tr>
<td><?php echo "<a href='utilizadores.php'><font color='black'> Registar </a></font>";?></td>
</tr>

</table>

Opinião picuinhas, mas já ninguém usa tabelas hoje em dia :D
 
md5 é um hash extremamente fraco e facilmente quebravél hoje em dia.
Não é extremamente fraco, antes pelo contrario é bastante bom por ser simples e lento. Ao ser lento é uma vantagem contra brute, quando alguem ta a tentar fazer 10 000 requests. Por isso md5 foi uma coisa fantastica no seu tempo e continua a ser utilizado em muitos sites como opção. Entetanto sim, ele ja foi quebrado ha muito tempo, para alem do facto que "Palhaço" e "Ontem" podem ter o mesmo hash. E tem tabelas para decifrar agora, o que é pena... RIP md5 =(
 
Back
Topo