PHP - Validação de senha simples e segura!
Hoje vou mostrar como montar uma área de login e senha e como validar isso no php de forma segura.
Primeiramente vamos começar com o formulário:
Esse primeiro código é somente com HTML e estilos CSS.
Primeiramente vamos começar com o formulário:
Esse primeiro código é somente com HTML e estilos CSS.
<html> <head> <title>Área Restrita - Efetue seu login!</title> <style> body { font:12px Verdana; } #caixaLogin { text-align:center; border:1px solid blue; border-top:20px solid blue; } h1 { font: 15px Verdana; font-weight:bold; } #obs { font:10px Verdana; text-align:left; margin:20px; } span { border: 1px solid green; background: #00FF00; } </style> </head> <body> <form action="" method="post" name="form"> <div id="caixaLogin"> <h1>Realize seu Login para acessar nossa 疵ea restrita:</h1> Login:<br /> <input type="text" name="login" /><br /> Senha:<br /> <input type="text" name="senha" /><br /><br /> <input type="checkbox" value="1" name="comSeguranca" /> Efetuar login com seguran軋?<br /><br /> <input type="submit" name="logar" value="Logar" /><br /><br /> </div> <div id="obs"> Obs.: <br /><br /> O que ・efetuar login com seguran軋 nessa p疊ina? <br /><br /> ノ remover todo cigo com intuito de "burlar" o sistema. </div> </form> </body> </html>
ola! Dei uma lida no codigo e nos comentarios, queria saber se o codigo esta certo ou não, se vai dar algum problema com o usuario, eu sou iniciante e godtaria muito de usar no site q estou desenvolvendo.
22/04/2010 12:36am
(~14 anos atrás)
Prezados ANDREY, FELIPE e VICTOR
Como iniciante, estou tentando aprender, mas ainda não tenho suficiente conhecimento para usar o código do Andrey com as adaptações sugeridas pelo Felipe e pelo Victor. Portanto, solicito que republiquem o código devidamente adaptado.
Fraternalmente,
CID PEREIRA
Como iniciante, estou tentando aprender, mas ainda não tenho suficiente conhecimento para usar o código do Andrey com as adaptações sugeridas pelo Felipe e pelo Victor. Portanto, solicito que republiquem o código devidamente adaptado.
Fraternalmente,
CID PEREIRA
28/01/2009 7:27pm
(~16 anos atrás)
Amigo!
Muito Obrigado! Vivendo e aprendendo, claro que não vou levar isso como uma depreciação do meu trabalho, muito pelo contrário, vou ficar feliz em saber qual seria a melhor maneira!
Att.,
Andrey
Muito Obrigado! Vivendo e aprendendo, claro que não vou levar isso como uma depreciação do meu trabalho, muito pelo contrário, vou ficar feliz em saber qual seria a melhor maneira!
Att.,
Andrey
22/02/2007 3:56am
(~18 anos atrás)
Andrey, é otimo se preocupar com a segurança. Antes pecar pelo excesso dela do que pelo desleixo. Mas como você mesmo disse, direcionou esse artigo para iniciantes, por isso queria te expor mais algumas coisas:
1) Como o Felipe falou, as linhas de str_replace nao são necessarias. Mas vou um pouco alem: A htmlspecialchars também nao é necessaria, e a junção da htmlspecialchars e da str_replace deixam o programa errado. Infelizmente, errado, pois se a senha do usuario tiver um aspas, um <, ou tiver escrito SELECT, ela vai ser alterada quando nao deveria e o usuario nao vai se identificar mesmo com a senha certa, voce me compreende?
2) Fora isso, como voce vai cifrar a senha usando o md5 antes de coloca-la na busca do banco de dados, voce NAO deve "limpa-la" com a sua funcao. Isso porque, novamente, se a senha do usuario contiver aspas, ela vai ser alterada sem que devesse ser, e o usuario tera problemas novamente, mesmo usando a senha correta.
3) O uso de addslashes() não é mais recomendado para "limpar" entradas para o MySQL. Devemos usar o mysql_real_escape_string() agora.
É isso. Veja bem, nao estou querendo depreciar seu trabalho, pelo contrario, so queria chamar a atencao para esses detalhes. A segurança é muito importante, mas temos que olhar o codigo como um todo e ver exatamente o que estamos fazendo, ao inves de simplesmente filtrar toda a entrada que o usuario dá como se estivessemos prestes a sermos invadidos se nao o fizermos.
Valeu!!
1) Como o Felipe falou, as linhas de str_replace nao são necessarias. Mas vou um pouco alem: A htmlspecialchars também nao é necessaria, e a junção da htmlspecialchars e da str_replace deixam o programa errado. Infelizmente, errado, pois se a senha do usuario tiver um aspas, um <, ou tiver escrito SELECT, ela vai ser alterada quando nao deveria e o usuario nao vai se identificar mesmo com a senha certa, voce me compreende?
2) Fora isso, como voce vai cifrar a senha usando o md5 antes de coloca-la na busca do banco de dados, voce NAO deve "limpa-la" com a sua funcao. Isso porque, novamente, se a senha do usuario contiver aspas, ela vai ser alterada sem que devesse ser, e o usuario tera problemas novamente, mesmo usando a senha correta.
3) O uso de addslashes() não é mais recomendado para "limpar" entradas para o MySQL. Devemos usar o mysql_real_escape_string() agora.
É isso. Veja bem, nao estou querendo depreciar seu trabalho, pelo contrario, so queria chamar a atencao para esses detalhes. A segurança é muito importante, mas temos que olhar o codigo como um todo e ver exatamente o que estamos fazendo, ao inves de simplesmente filtrar toda a entrada que o usuario dá como se estivessemos prestes a sermos invadidos se nao o fizermos.
Valeu!!
22/02/2007 12:54am
(~18 anos atrás)
parabens, ficou otimo, e bom ter companheiros mandando ver aqui na comunidade. show!
30/12/2006 8:22pm
(~18 anos atrás)
Parabéns pela iniciativa Andrey.
Algumas coisas importantes que apreendi com o tempo.
1. BD: Campo user deve ser único (não se pode existir 2 usuários com o mesmo login);
2. Para o controle de SQL injections não é necessário essas linhas:
$comSeguranca = str_replace("SELECT","",$comSeguranca);
$comSeguranca = str_replace("FROM","",$comSeguranca);
$comSeguranca = str_replace("WHERE","",$comSeguranca);
$comSeguranca = str_replace("INSERT","",$comSeguranca);
$comSeguranca = str_replace("UPDATE","",$comSeguranca);
$comSeguranca = str_replace("DELETE","",$comSeguranca);
$comSeguranca = str_replace("DROP","",$comSeguranca);
$comSeguranca = str_replace("DATABASE","",$comSeguranca);
Porque: Vamos supor que tens uma query ("SELECT count(1) FROM users WHERE user = '".$username."' AND password = '".$password." LIMIT 1' ");
Caso o usuário deseje fazer aluguma injection ele tem que conseguir de alguma maneira escapar da aspas simples no local das duas variaveis, com o addslashes ele não vai conseguir de maneira alguma...
Algumas coisas importantes que apreendi com o tempo.
1. BD: Campo user deve ser único (não se pode existir 2 usuários com o mesmo login);
2. Para o controle de SQL injections não é necessário essas linhas:
$comSeguranca = str_replace("SELECT","",$comSeguranca);
$comSeguranca = str_replace("FROM","",$comSeguranca);
$comSeguranca = str_replace("WHERE","",$comSeguranca);
$comSeguranca = str_replace("INSERT","",$comSeguranca);
$comSeguranca = str_replace("UPDATE","",$comSeguranca);
$comSeguranca = str_replace("DELETE","",$comSeguranca);
$comSeguranca = str_replace("DROP","",$comSeguranca);
$comSeguranca = str_replace("DATABASE","",$comSeguranca);
Porque: Vamos supor que tens uma query ("SELECT count(1) FROM users WHERE user = '".$username."' AND password = '".$password." LIMIT 1' ");
Caso o usuário deseje fazer aluguma injection ele tem que conseguir de alguma maneira escapar da aspas simples no local das duas variaveis, com o addslashes ele não vai conseguir de maneira alguma...
27/12/2006 2:54pm
(~18 anos atrás)