Índice das dicas

Criando senha de segurança com o PHP e GD

Criado 21/abr/2006 às 17h24 por Angelo Valle

0

Olá 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_start();
$_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

session_start();

$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

session_start();
$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:

E para fechar, um pacote tar.gz com os arquivos que fui criando enquanto escrevia este texto: ontegd.tar.gz

Sem comentáriosPor Angelo Valle. Revisado 21/abr/2006 às 17h24