Pra quem já conhece o framework PHP Code Igniter, esta dica pode ser interessante e muito útil. Vamos ver como usar um plugin no Code Igniter, particularmente o plugin Captcha, que são aquelas imagens de segurança em formulários.
O wiki do CI (CodeIgniter) mostra o plugin e uma possÃvel implementação neste link: http://codeigniter.com/wiki/captcha/
Vou mostrar aqui como fazer este plugin funcionar, e de quebra explicar alguns pontos importantes para que você possa fazer as adaptações necessárias ao seu projeto.
Os plugins podem estar em dois diretórios:
system -> plugins
system -> application -> plugins
O code igniter irá procurar primeiro na pasta “system->application->plugins” e se não encontrar irá procurar no diretório “system->plugins“. E como saber que pasta utilizar? Fácil. Se você tiver um plugin que deve e/ou pode ser usado por vários sistemas, então utilize a pasta “system->plugins“. Agora se é um plugin muito especÃfico para determinado projeto e que não terá utilidade para outros projetos, deixe dentro da pasta “system->application->plugins“. Isso não é regra, e sim uma recomendação.
O plugin do Captcha já vem com a instalação do Code Igniter, você não precisa baixar nem instalar, apenas utilizar.
E para utilizar você precisar preparar o terreno. Ou seja, verificar alguns pontos importantes para o bom funcionamento deste plugin.
Primeiro, você precisa criar uma tabela na sua base de dados que irá armazenar os diversos captchas gerados. Para futuras consultas e comparações. A não ser que você decida fazer isso utilizando a sessão do usuário.
CREATE TABLE captcha (
captcha_id bigint(13) unsigned NOT NULL auto_increment,
captcha_time int(10) unsigned NOT NULL,
ip_address varchar(16) default '0' NOT NULL,
word varchar(20) NOT NULL,
PRIMARY KEY (captcha_id),
KEY (word)
)
Veja que a tabela irá armazenar informações como, a palavra captcha gerado, o ip do usuário e o tempo de expiração do captcha. Sim, o captcha expira, assim não precisa se preocupar com o tamanho da tabela, pois ela será limpa a cada consulta.
Segundo ponto importante para o funcionamento do plugin é habilitar a biblioteca GD. Veja isso no seu arquivo php.ini na pasta de instalação do seu php.
Terceiro ponto importante, você deve criar uma pasta na sua aplicação para armazenar as imagens geradas dinâmicamente pelo captcha. Dê o nome que quizer, mas lembre-se de deixar a pasta com permissão de escrita.
Feito isso vamos utilizar o plugin.
No seu controller, que irá chamar sua view que contem o formulário, você deve gerar a imagem do seu captcha. Pra isso vamos importar o plugin, vou mostrar como fiz, existem várias formas de importar plugins. Depois vamos configurar o captcha e chamar o método do plugin que irá gerar a imagem. Salvamos as informações no banco de dados e enviamos para sua view as informações. Simples assim, veja como fica no seu controller:
function index() {
//chama plugin de captcha - seguranca de formulario
$this->load->plugins('captcha');
//configura o captcha
$expiration = time()-300; //Duas horas em milisegundos
$this->db->query("DELETE FROM captcha WHERE captcha_time < ".$expiration); //limpa o banco
$vals = array(
//'word' => 'Random word',
'img_path' => './system/application/public/img/uploads/',
'img_url' => base_url().'/uploads/',
//'font_path' => './system/fonts/texb.ttf',
'img_width' => '200',
'img_height' => '50',
'expiration' => '3600'
);
$cap = create_captcha( $vals );
$data['image'] = $cap['image']; //imagem q vai pra tela
$datac = array(
'captcha_id' => '',
'captcha_time' => $cap['time'],
'ip_address' => $this->input->ip_address(),
'word' => $cap['word']
);
$query = $this->db->insert_string( 'captcha', $datac );
$this->db->query( $query );
$this->load->view( 'welcome_view', $data );
}
O código não é difÃcil de ler, então vou explicar apenas alguns pontos interessantes.
A linha comentada: ‘word’ => ‘Random word’,
Você pode querer informar a palavra que o captcha irá gerar na imagem, neste caso informe neste campo “word“. Se não informar ele irá gerar uma imagem com palavras e números aleatórios, de 8 caracteres.
A linha: ‘img_path’ => ‘./system/application/public/img/uploads/’,
Neste caso eu criei o diretório “public/img/uploads” para armazenar as imagens geradas pelo captcha. Mas você pode criar o diretório na raiz do sistema e colocar apenas “./imagens” se desejar.
Outra linha comentada é: ‘font_path’ => ‘./system/fonts/texb.ttf’,
Se você deixar comentado ele irá usar a fonte padrão, ou você pode especificar o tipo de fonte, apenas não esqueça de colocar a fonte no diretório.
Acredito que o restante do código esteja bem fácil de entender, afinal ele apenas coloca a imagem em uma variável que vai para a tela e salva as informações no banco de dados.
Se não salvar, verifique se criou a tabela conforme descrito acima, e se seu arquivo conf -> database.php está configurado corretamente para acessar a tabela.
No seu arquivo “welcome_view.php” que você chamou para exibir o formulário, para exibir a imagem do captcha basta apenas informar a variável valorizada no controller.
<html>
<body>
<h1>formulario com captcha</h1>
<form method="POST" action="<?=site_url('verifica_captcha')?>">
<?=$image?> <br>
<input type="text" name="txt_captcha" id="txt_captcha" value="">
<input type="submit" value="enviar">
</form>
</body>
</html>
Dessa forma quando for clicado em “enviar” ele irá chamar seu controller “verifica_captcha” enviando os dados digitados no formulário. Vejamos como fica:
function index() {
$captcha = $this->input->post("txt_captcha");
$ip = $this->input->ip_address();
$tempo = time()-600;
$sql = "SELECT COUNT(*) AS count FROM captcha WHERE word = ? AND ip_address = ? AND captcha_time > ?";
$binds = array( $captcha, $ip, $tempo );
$query = $this->db->query( $sql, $binds );
$row = $query->row();
if ( $row->count == 0 ) {
//$this->validation->set_message('_captcha_check', 'Codigo de controle nao e valido');
echo 'captcha incorreto';
} else {
echo 'captcha verificado com sucesso';
}
}
Veja que no código acima é recuperado os dados do formulário, o ip e o tempo de expiração, para poder fazer a consulta no banco. Se encontrar algum resultado na tabela então o captcha foi digitado corretamente. Aqui no exemplo eu apenas conclui com um “echo” de mensagem, mas você com certeza irá utilizar de outra forma, chamando uma nova página de sucesso ou retornando a mesma página com alguma mensagem de erro.
E esta feito, a primeira vez pode dar trabalho, pois é preciso preparar o terreno, mas depois fica mais fácil, veja que em 3 etapas o processo está concluido. Basta apenas criar, mostrar e recuperar para validar.
Sucesso!
Loading...
Estou começando agora com o CI e fico muito feliz de ter ótimos tutoriais como este disponÃveis.
Parabens pelo post e pelo blog! ^^
rapaz achei legal, bastante explicativo seu código, mas eu vi um errinho de lógica aÃ.
Com vc gravando na tabela, o que aconteceria se 2 usuários fossem verificar o captcha ao mesmo tempo? ou se um estivesse no form, e outro em seguida entrasse no form. Então os dados do primeiro q estariam no banco seriam deletados…
Eu acho que por session é mais seguro. ^^
valew vinicius!
dae anderson, testou o exemplo acima na situacao q vc citou?
bom, antes de colocar no ar eu fiz uns testes semelhantes, pq tb me preocupo com a logica e segurança alem do contexto do exemplo, q eh o de mostrar como usar o captcha. e o exemplo funciona bem, sem bug nenhum.
isso pq o banco nao armazena apenas o captcha, ele armazena tb o IP a quem pertence o captcha, como vc pode ver no exemplo acima. isso garante q o q vc citou nao va acontecer.
blz?! mas session eh sempre uma opcao valida tb!
valew!! sucesso!
Aew MarioSAM, realmente eu vi aqui que esse exemplo funciona bem, acontece de um usuário apagar o captcha do outro apenas se o outro entrar na página do form e esperar 3600 segundos (1 hora) pra enviar os dados… caso contrário nao da nao.
Mas legal o tuto, deu uma help pro pessoal q nao saca ingles ^^
Abração…
blz anderson,
vale lembrar que depois de 3600 segundos o captcha nao eh deletado por acidente, eh proposital.
isso eh para limpar a base de dados, pra evitar sobrecarga de dados.
vc pode configurar para q isso aconteça a cada 5 minutos ou a cada 24 horas.
mas acho q 1 hora eh mais q suficiente pro usuario entrar com os dados no formulario! hehe
uma visao tupiniquim dos exemplos em ingles eh sempre uma mao na roda neh!
abs