Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

lucaswxp

[Resolvido] Catpcha - Anti-boot/span etc..

Recommended Posts

Hoje ensinarei, ou pelo menos tentarei =] a criar um sistema de captcha =D

Caso você não saiba, captcha (Completely Automated Public Turing test to tell Computers and Humans Apart) são aquelas letrinhas e numero que você deve digitar se 'apoiando' em uma imagem para efetuar alguma ação, como por exemplo: postar um comentario, se cadastrar num forum, se logar etc... etc.. etc.. xD

O que faremos será este: http://lucaswxp.22web.net/captcha/index.php

O codigo está com comentarios que irá lhe guiar...

 

OBS: Caso você queira mudar o fundo é só alterar o array $c['pathBG'] no arquivo captcha.class.php, seria legal construir uns fundos randomicos =D, bom isso fica com você :P

 

captcha.class.php

<?php
/*
 * Script desenvolvido por Lucas Pelegrino
 * Contato: lucas_wxp@hotmail.com
 * Não conhece alguma função? http://php.net/
*/
class Captcha{
	// config
	public $c = array (
	'pathABSOLUTO' => NULL,
	'pathBG' => 'bgs/bg1.gif',
	'pathTEMPS' => 'temps_img/',
	'pathREG' => 'reg/reg.php',
	'pathFONT' => 'font/font1.ttf',
	'tempoEXPIRACAO' => 60,
	'tempoTOTAL' => NULL,
	'pathABSOLUTO' => NULL,
	'nomeIMG' => NULL
	);
	public $erro = NULL;
	public function geraImagem (){
	$this->c['tempoTOTAL'] = time() + $this->c['tempoEXPIRACAO'];
	// Criamos a imagem com a qual iremos trabalhar
	$imagem = imageCreateFromGif ($this->c['pathBG']);
	// Criamos o codigo que será inserido na img
	$string = md5(uniqid(rand()));
	// Cortamos ele para 4 caracteres
	$string = substr($string , 0 , 4);
	// o nome do arquivo que será gravado na pasta temps_img
	$nomeIMG = substr(sha1($string),0,15);
	// Caminho absoluto onde a img será gravada
	$this->c['pathABSOLUTO'] = $this->c['pathTEMPS'] . $nomeIMG . ".gif";
	// Iniciamos um sessão e gravamos o $code que aparecerá na img
	$this->c['nomeIMG'] = $nomeIMG;
	// Iniciamos uma seção com o codigo que será mostrado na tela para futura validação
	$_SESSION['string'] = $string;
	// Cor do texto
	$preto = imageColorAllocate($imagem , 0 , 0, 0);
	// Escrevemos a $string na img
	imagettftext($imagem,25,0,9,26,$preto,$this->c['pathFONT'],$string);
	// Gravamos a img
	imagegif($imagem,$this->c['pathABSOLUTO']);
	// Removemos o espaço alocado
	imagedestroy($imagem);
	}
	public function renova(){
		// Aqui transforamos o arquivo que ficará armazenado o tempo em array
		$dataPHP = file ($this->c['pathREG']);
		// Contamos o numero de array
		$countFile = count($dataPHP);
			// Realizamos um loop
			for ($i=0;$i<=$countFile;$i++){
				// Se $i for igual à 0 ou o ultimo elemento do array, 'pula' para o proximo loop
				// Isso porque o array com chave 0 é um codigo PHP que nao nos será util aqui, eo o ultimo é uma quebra de linha
				if ($i == 0 || $i == $countFile) {continue;}
				// Quebramos uma linha para poder tratar nome de tempo
					$data = str_replace ('
','',explode('|' , $dataPHP[$i]));
				// Se o tempo do arquivo for menor que o tempo atual deleta-o da pasta temps_img e retira a linha do arquivo $pathArquivo
				if ($data[1] < time()){
					unset($dataPHP[$i]);
					unlink($this->c['pathTEMPS'] . $data[0] . '.gif');
					}
				
			}
				// Montamos o novo arquivo com as linhas ja alteradas
	file_put_contents($this->c['pathREG'] , $dataPHP);
	}
	
	public function registra(){
		// Registramos um novo arquivo
		$dataPHP = fopen($this->c['pathREG'] , 'a');
		fwrite($dataPHP , $this->c['nomeIMG'] . '|' . $this->c['tempoTOTAL'] . '
');
		fclose($dataPHP);
	}
	
	public function checa(){
		// Checamos se digitou corretamente
		$string = $_POST['string'];
		if ($string != $_SESSION['string']){
			$this->erro = "O texto digitado não confere com a imagem! Tente novamente.";
		}
		else
			$this->erro = "Parabens, você digitou o texto corretamente!";
	}
}
?>

Neste arquivo ficará armazenado o nome e tempo que a imagem irá expirar:

reg/reg.php

<?php exit ?>

index.php

<?php
include "captcha.class.php";
$captcha = new Captcha();
session_start();
if (isset($_GET['checar']) && $_GET['checar'] == 1){
	$captcha->checa();
}
	$captcha->geraImagem();
	$captcha->renova();
	$captcha->registra();

?>
<!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=iso-8859-1" />
<title>Captcha</title>
</head>
<div style="text-align: center">
<img src="<?php echo $captcha->c['pathABSOLUTO'] ?>" style="border: 2px solid #000;">
	<form action="index.php?checar=1" method="post" />
	<input type="text" name="string" maxlength="4" style="width: 80px;text-align: center;" /><br />
	<input type="submit" value="Checar" />
	</form>
	<?php echo $captcha->erro ?>
</div>
<body>
</body>
</html>

Prontinho, como você pode ver é bem simples, só usamos três arquivo =O, as outras pastas como temps_imgs (ficará armazenado as imagens temporarias), font (ficará armazenado a font que usaremos), e bgs (ficará armazenado o fundo que usaremos) só precisão ser alterado algo caso você queira personalizar o sisteminha...

Bom, é isso ai, flws o/

 

PS: titulo errado... correto: anti-"SPAM" nao span, arruma ae modera =D

 

DOWMLOAD DO SCRIPT [AQUI]

Compartilhar este post


Link para o post
Compartilhar em outros sites

esses erros tem aver com o q ?

 

Warning: imagecreatefromgif(bgs/bg1.gif) [function.imagecreatefromgif]: failed to open stream: No such file or directory in C:\Arquivos de programas\EasyPHP 3.0\www\laboratorio\captcha\captcha.class.php on line 24

 

Warning: imagecolorallocate(): supplied argument is not a valid Image resource in C:\Arquivos de programas\EasyPHP 3.0\www\laboratorio\captcha\captcha.class.php on line 38

 

Warning: imagettftext() expects parameter 1 to be resource, boolean given in C:\Arquivos de programas\EasyPHP 3.0\www\laboratorio\captcha\captcha.class.php on line 40

 

Warning: imagegif(): supplied argument is not a valid Image resource in C:\Arquivos de programas\EasyPHP 3.0\www\laboratorio\captcha\captcha.class.php on line 42

 

Warning: imagedestroy(): supplied argument is not a valid Image resource in C:\Arquivos de programas\EasyPHP 3.0\www\laboratorio\captcha\captcha.class.php on line 44

 

Warning: file(reg/reg.php) [function.file]: failed to open stream: No such file or directory in C:\Arquivos de programas\EasyPHP 3.0\www\laboratorio\captcha\captcha.class.php on line 48

 

Warning: file_put_contents(reg/reg.php) [function.file-put-contents]: failed to open stream: No such file or directory in C:\Arquivos de programas\EasyPHP 3.0\www\laboratorio\captcha\captcha.class.php on line 67

 

Warning: fopen(reg/reg.php) [function.fopen]: failed to open stream: No such file or directory in C:\Arquivos de programas\EasyPHP 3.0\www\laboratorio\captcha\captcha.class.php on line 72

 

Warning: fwrite(): supplied argument is not a valid stream resource in C:\Arquivos de programas\EasyPHP 3.0\www\laboratorio\captcha\captcha.class.php on line 74

 

Warning: fclose(): supplied argument is not a valid stream resource in C:\Arquivos de programas\EasyPHP 3.0\www\laboratorio\captcha\captcha.class.php on line 75

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.