PHP - Validação de senha simples e segura!
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.
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');
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)