Hoje eu precisei fazer um formulário com proteção daquelas letrinhas doidas que o usuário tem que digitar... o nome disso é captcha...
O exemplo que tem lá num artigo de PHP_Security_Consortium (Leia o Artigo) obriga o cara a escrever a imagem em um arquivo... nem gostei disso e nem sei se isso funcionaria legal em um site com muuuuuitos acessos simultaneos.
Fiz, então, uma forma legal para funcionar sem ter que gerar um arquivo FIXO de image usando sessão.
Estou levando em consideração que o Text_CAPTCHA já esta pronto para o uso. No artigo citado acima, explica como instalar.
Bem... vamos lá.
Primeiro crie um arquivo que gerará a image...
<?php
require_once 'Text/CAPTCHA.php';
$captcha = Text_CAPTCHA::factory('Image');
// Altere para dados VÁLIDOS e verifique se esta fonte existe.
$options =
array('font_size'=>
'20',
'font_path'=>'./',
'font_file'=>'Vera.ttf');
$captcha->init(150, 60, NULL, $options);
// Coloca a frase na sessão
$_SESSION['captcha_phrase'] = $captcha->getPhrase();
$image = $captcha->getCAPTCHAAsJPEG();
header("Cache-Control: no-store, no-cache, must-revalidate");
header('Content-Type: image/jpeg');
imagejpeg($captcha->_im);
?>
Este arquivo mostra a imagem e coloca a frase de verificação na sessão ($_SESSION['captcha_phrase']).
Agora, crie o arquivo com formulário.
<form action="arquivo.submit.php" method="POST">
Name:
<input type="text" name="name" /><br />
Email:
<input type="text" name="email" /><br />
Comment:
<textarea name="comment"></textarea>
<input type="text" name="captcha_phrase" /><br />
<!-- IMAGEM DO CAPTCHA -->
<img src="captcha.php" />
</form>
</body>
</html>
Bem, até aqui agente consegue mostrar a imagem do captcha no formulario. Vamos fazer a validação para fechar o post. Lembre-se que, da forma que estamos fazendo, o action do formulário, não pode ser no mesmo arquivo do formulário.
<?php
if ($_POST['captcha_phrase'] != $_SESSION['captcha_phrase']) {
} else {
}
unset($_SESSION['captcha_phrase']);
?>
Bem, acho que terminamos... se alguem tiver mais alguma ideia para melhorar isso, comenta ae.
t+