+2

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

criado por Andrey Box em 22/12/2006 8:06am
Obs.: Esse código estou reutilizando do POST de SQL Injection que fiz pouco tempo atrás em meu site!

http://www.andrey.eti.br/?p=124

Antes de mexer no PHP, vamos executar este SQL abaixo, para poder testar o form depois:
Para quem ainda é iniciante, abra o seu PHPMyAdmin crie um banco de dados chamado de test, acesse o banco e execute o SQL.
IMPORTANTE: Verifique se o Login e Senha de seu MySQL são "root" e "" respectivamente.

CREATE TABLE `usuario` (
  `usuarioCodigo` int(11) NOT NULL,
  `usuarioLogin` varchar(15) NOT NULL,
  `usuarioSenha` varchar(32) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

-- 
-- Extraindo dados da tabela `usuario`
-- 

INSERT INTO `usuario` (`usuarioCodigo`, `usuarioLogin`, `usuarioSenha`) VALUES
(0, 'andrey', 'baf22ddb7b1a317d860f48638254e2e9'),
(0, 'teste', '698dc19d489c4e4db73e28a713eab07b');

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 (~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
28/01/2009 7:27pm (~15 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 (~17 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 (~17 anos atrás)

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

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

Parabéns Andrey !!!

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

Novo Comentário:

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