+2

PHP - Validação de senha simples e segura!

criado por Andrey Box em 22/12/2006 8:06am
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.

<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 &#30133;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&#36555;?<br /><br />
         <input type="submit" name="logar" value="Logar" /><br /><br />
      </div>
      <div id="obs">
         Obs.:
         <br /><br />
         O que &#12539;efetuar login com seguran&#36555; nessa p&#30090;ina?
         <br /><br />
         &#65417; remover todo c&#57944;igo com intuito de "burlar" o sistema.
      </div>
   </form>
</body>
</html>

Comentários:

Mostrando 1 - 8 de 8 comentários
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 (~6 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
28/01/2009 7:27pm (~7 anos atrás)

Andrey Box disse:
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
22/02/2007 3:56am (~9 anos atrás)

Victor Gondim disse:
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!!
22/02/2007 12:54am (~9 anos atrás)

realmente chará..
16/01/2007 7:12pm (~10 anos atrás)

parabens, ficou otimo, e bom ter companheiros mandando ver aqui na comunidade. show!
30/12/2006 8:22pm (~10 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...
27/12/2006 2:54pm (~10 anos atrás)

Parabéns Andrey !!!

Simples e eficaz ! Muito bom.
27/12/2006 2:12pm (~10 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)