Índice das dicas
Criando senha de segurança com o PHP e GD
Criado 21/abr/2006 às 17h24 por Angelo Valle
0Olá pessoal, depois de um longo tempo volto a publicar algumas coisas por aqui. E para este "retorno" resolvi escrever sobre uma coisa que é simples de fazer, é útil e o melhor de tudo: Ajuda a deixar nossos formulários html um pouco mais seguros.
Estou falando da library GD. Bastante conhecida na web e amplamente utilizada para criação de thumbs, senhas de confirmação (em chats por exemplo), cadastro em determinados derviços, etc. Fatalmente você já passou por ela e hoje vamos conhecer o básico de seu funcionamento.
Criaremos a famosa senha de confirmação e de quebra aprenderemos um pouco. Tendo criatividade você pode usar o que aprender aqui para outras coisas de acordo com a sua necessidade.
É necessário que o apache esteja instalado com suporte a PHP, e o PHP com suporte ao GD. No caso do Kurumin ou outros derivados do Debian basta dar um apt-get install php4-gd para instalar a library e todas as suas dependências.
Não entrarei em detalhes sobre a instalação da GD, essa informação é facilmente encontrada no Google. Minha meta é apenas mostrar o funcionamento com o PHP.
Link para a pesquisa no Google
Vamos ao que interessa: Códigos!
Nosso formulário terá apenas dois campos. Um para nome e o outro para a senha. Veja logo abaixo o código do mesmo:
Arquivo dicagd.php
$_SESSION["numeroaleatorio"]=rand(10000000,99999999);
?>
Aprendendo com o GDH
Nome:
Confirmação:
É isso mesmo, ele chama um .php como se fosse uma imagem. Criei uma session e defini um valor aleatório entre 10000000 e 99999999 para a variável numeroaleatorio. É com ela que vamos gerar a imagem e fazer a comparação lá na frente.
Agora vamos fazer o dicagd2.php, que é para onde o nosso formulário está enviando os dados:
Arquivo dicagd2.php
$NOME=$_POST['nome'];
$CONFIRMACAO1=$_POST['confirmacao'];
$CONFIRMACAO2=$_SESSION['numeroaleatorio'];
if ($CONFIRMACAO1==$CONFIRMACAO2) {
echo $NOME . ", a senha digitada está correta!";
}
else {
echo $NOME . ", a senha digitada está incorreta!";
}
?>
Bem, o que o dicagd2.php faz? Ele captura as variáveis enviadas pelo formulário no método POST, abre a session e captura aquele valor randômico que criamos no dicagd.php. Logo e, seguida ele compara o valor digitado com o valor gerado e responde dizendo se está correto, ou não.
Agora vamos criar o arquivo imagemgd.php, que é o motivo desta dica :)
Arquivo imagemgd.php
$imagem = imagecreate(70, 15);
$fundo = imagecolorallocate($imagem, 255, 255, 255);
$fonte = imagecolorallocate($imagem, 0, 0, 0);
imagestring($imagem, 4, 0, 0, $_SESSION['numeroaleatorio'], $fonte);
header("Content-type: image/png");
imagepng($imagem);
?>
O que foi feito? Vamos lá:
- A session foi chamada
- O tamanho da imagem foi definido (em pixels)
- A cor de fundo foi escolhida. No caso, branco
- Cor da fonte: Preto
- imagestring - Aqui a gente define o que vai ser escrito em nossa imagem
- header - Fala pro seu navegador que esse .php é na verdade apenas uma imagem :)
- imagepng - A nossa criação, no formato png.
Claro que este é um exemplo bem básico, simples. Muitas coisas devem ser mudadas se for usado de forma profissional.
O rand() por exemplo, poderia ser trocado por uma função que randomiza letras e números.
A imagem pode ter uma outra imagem de fundo para dificultar programas de leitura.
A session pode trabalhar em conjunto com um cookie, e até uma tabela mysql gravando o ip do usuário para evitar um flood
Mas é apartir de coisas simples que nós criamos base para construir coisas complexas, essa é a intenção da dica.
"Não dê o peixe. Ensine a pescar" ;-)
E por falar em pesca, seguem alguns links interessantes e que não devem deixar de ser vistos por quem se interessou na dica:
http://br.php.net/manual/pt_BR/function.header.php
http://br.php.net/manual/pt_BR/function.gd-info.php
http://www.google.com.br/linux
Sem comentáriosPor Angelo Valle. Revisado 21/abr/2006 às 17h24

Comentários