User Rating: 



/ 0
Details
- Details
-
Category: PHP
-
Published on Wednesday, 08 June 2011 22:02
-
Written by Bruno Vinícius Camacho
-
Hits: 3823
Acredito que todos já tivemos problemas com spams sendo enviados através do formulário de contato em nosso site.
Bom, aqui vai tutorial para ajudar a reduzir esse tipo de problema. Bom, chega de enrolação e vamos aos passos.
-
Crie a seguinte estrutura:
-
Digite o seguinte código no arquivo captcha.php:
"captcha.php"
<?php
session_start();
$string = '';
for ($i = 0; $i < 5; $i++) {
$string .= chr(rand(97, 122));
}
$_SESSION['cod_rand'] = $string;
$dir = 'fontes/';
$imagem = imagecreatetruecolor(170, 60);
$preto = imagecolorallocate($image, 0, 0, 0);
$cor = imagecolorallocate($image, 0, 255, 0); // verde
$branco = imagecolorallocate($image, 255, 255, 255);
imagefilledrectangle($image,0,0,399,99,$branco);
imagettftext ($image, 30, 0, 10, 40, $cor, $dir."arial.ttf", $_SESSION['cod_rand']);
header("Content-type: image/png");
imagepng($imagem);
?>
Agora vamos entender o código acima. Primeiro eu iniciei uma sessão, criei uma variavel vazia e através da função for gerei 5 caracteres para colocar na variavel e criei uma variavel de sessão contendo esses 5 caracteres. Veja abaixo:
Show/Hidden php code
session_start(); // inicia a sessao
$string = ''; // variavel vazia
for ($i = 0; $i < 5; $i++) { //enquanto a variavel $i for menor que 5, $i+1
$string .= chr(rand(97, 122)); //caracteres que sao colocados na variavel string de forma aleatoria, atraves do codigo ascii (97 a 122, letras minusculas)
}
$_SESSION['cod_rand'] = $string; //criei uma variavel de sessao chamada cod_rand que terá o valor da variavel $string
Na segunda parte do código, define em qual pasta está armazenada a fonte e gerei a imagem. Veja abaixo:
Show/Hidden php code
$dir = 'fontes/'; // diretorio onde está a fonte a ser utilizada
$imagem = imagecreatetruecolor(170, 60); //cria uma imagem com o tamanho de 170 x 60 (L x A)
$preto = imagecolorallocate($imagem, 0, 0, 0);
$cor = imagecolorallocate($imagem, 0, 255, 0); // verde
$branco = imagecolorallocate($imagem, 255, 255, 255);
imagefilledrectangle($imagem,0,0,200,100,$branco); //preencho o fundo do retagulo (imagem) de branco
imagettftext ($imagem, 30, 0, 10, 40, $cor, $dir."arial.ttf", $_SESSION['cod_rand']); // gero o texto da imagem na cor verde com a fonte arial.
header("Content-type: image/png");
imagepng($imagem); //gero a imagem em png
Por usar comandos pouco utilizados, muitos acham que é dificil, mas na verdade nao é. Como podem ver, é um código até simples. Mas o código acima apenas gera a imagem e mais nada. Precisamos do formulário de contato, colocar o captcha gerado nele e fazer a validação. Vamos lá. Abra o arquivo contato.php e digite o seguinte código:
Show/Hidden php code

session_start();
if(isset($_POST['submit'])) { // se o formulário já tiver sido enviado
if(!empty($_POST['nome']) && !empty($_POST['email']) && !empty($_POST['mensagem']) && !empty($_POST['captcha'])) { //se os campos não estiverem vazios
if($_POST['captcha'] == $_SESSION['cod_rand']) { // se o digitado no campo captcha for igual a variavel de sessao cod_rand
$aceito = "Obrigado por entrar em contato.";
$nome = $_POST['nome'];
$email = $_POST['email'];
mail("destino@seusite.com.br","Assunto",$_POST['mensagem'],"From: $nome<$email>");
} else { // caso o digitado no campo captcha seja diferente da variavel de sessao cod_rand
$erro = "O código de verificação está incorreto.";
}
} else { // caso algum campo não esteja preenchido
mail("destino@seusite.com.br","Assunto",$_POST['mensagem'],"From: $nome<$email>");
$erro = "Preencha todos os campos do formulário.";
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Contato</title>
<style type="text/css">
form {
margin:0;
padding:0;
}
input {
padding:2px;
width:200px;
}
textarea {
padding:2px;
width:200px;
height:100px;
}
.button {
width:60px;
}
p {
margin:0 0 5px 0;
padding:0;
}
.error {
color:#FF0000;
margin:0 0 10px 0;
}
.accept {
color:#339966;
margin:0 0 10px 0;
}
</style>
</head>
<body>
<?php if(!empty($erro)) echo '<div class="error">'.$erro.'</div>'; ?>
<?php if(!empty($aceito)) echo '<div class="accept">'.$aceito.'</div>'; ?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<p><input type="text" name="nome" /> Nome</p>
<p><input type="text" name="email" /> Email</p>
<p><textarea name="mensagem"></textarea></p>
<img src="/captcha.php"/>
<p><input type="text" name="captcha" /> Digite o código ao lado</p>
<p><input type="submit" name="submit" value="Enviar" class="button" /></p>
</form>
</body>
</html>
Embora o formulário não envie nada por email, basta implementar essa função e o formulário estará pronto para uso. Tutorial sobre envio de email: aqui, aqui e aqui.
Até a próxima.