A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

A praga dos spammeiros

Sex

27

Fev

2009


16:01

(5 votos, média 5.00 de 5) 


Avaliando o plugin

Feliz da vida com o meu achado, instalei, configurei e ativei o plugin. Aí, fiquei esperando que alguma coisa acontecesse. Me dei ao trabalho de instalar o componente JSecure, do mesmo autor, porque percebi que o plugin e o componente podiam trabalhar juntos, ou seja, o plugin jogava os IPs bichados nas tabelas do JSecure.

Depois de uns 15 minutos, onde os arquivos de log mostravam intensa atividade dos malignos de plantão, nada aconteceu. Absolutamente NADA! Resolvi explorar o que estava acontecendo criando um log adicional que me mostrasse a atividade do plugin. Antes da linha 102, um pouco antes de explodir as respostas positivas, adicionei o seguinte:

... $txt = $adrs . ' ' . $responce . chr(10); $handle = fopen('/www/meusite/logs/teste', 'a'); fwrite( $handle, $txt ); fclose( $handle ); // Explodir $responce $responce = explode( '.', $responce);

No meu arquivinho de log chamado teste (não esqueça de colocar o seu num diretório acima do diretório raiz do site e com permissão para escrita) apareceram uma porção de IPs. Aliás, apareceram TODOS os IPs! Desabilitei rapidamente este log de teste e novamente botei a cabeça para funcionar: se todos os IPs estavam sendo logados, então para que servia a consulta ao cache? Fui verificar exatamente isto smile

O diretório /www/meusite/joomla/cache estava vazio, ou seja, o cache não estava funcionando. Como não havia habilitado o cache globalmente no Joomla (nas configurações globais da área administrativa), o plugin não podia "cachear".

Brilhante constatação: se o cache não está funcionando, $responce sempre vai estar vazia. Neste caso, entramos sempre no if da linha 85.

$responce = $cache->get($adrs); if(!$responce){ // Query $ip = implode ( '.', array_reverse( explode( '.', $adrs ) ) ); $query = $key . '.' . $ip .'.dnsbl.httpbl.org'; $responce = gethostbyname( $query );

Isto significava que, para todas as requisições de todos os IPs clientes estavam sendo feitas consultas ao dnsbl.httpbl.org sobrecarregando meu servidor e o banco de dados dnsbl. Para que o plugin fizesse cache, evitando consultas desnecessárias independentemente da configuração global, adicionei o seguinte na linha 83:

// Pegar o cache $cache =& JFactory::getCache('httpBL', 'output'); $cache->setCaching( 1 );

O resultado foi imediato. Verificando novamente o diretório /www/meusite/joomla/cache constatei que um novo diretório havia sido criado, o /www.meusite/joomla/cache/httpBL e que alguns arquivos já podiam ser analisados. Uns mostravam '0.0.0.0', outros mostravam coisas menos desejáveis como '127.5.32.4' - cujo significado você já conhece: última atividade há 5 dias, nível de perigo 32 e se trata de um Spammer de comentário (4).

Tudo muito bem, tudo muito bom, mas o que fazer para bloquear estes intrusos se o diabo do JSecure não queria funcionar (nenhum IP aparecia no componente)? Desisti do JSecure e resolvi partir para a luta.

Existem componentes e plugins para o Joomla que interceptam IPs, comparam os endereços com uma lista negra que precisamos criar e, caso o IP se encontre na lista, apresentam uma página dizendo que o endereço foi bloqueado. Não serviriam aos meus propósitos por que a caça aos IPs precisava continuar a ser feita e, pior do que isto, o mesmo IP poderia continuar a fazer quantas requisições quisesse e seria logado toda vez que viesse chatear novamente.

Como no começo desta história toda eu estava caçando IPs para colocá-los no iptables, por que não deixar o plugin fazer o serviço? Uma vez no iptables, qualquer nova requisição seria bloqueada e o log nem seria acionado. Para isto, bastava fazer uma chamada shell_exec via PHP para acionar o iptables para que ele colocasse o IP infrator no firewall e tudo estaria resolvido. Foi o que fiz:

// E aqui vamos nós if ( $responce[1] < $age && $responce[2] > $threat && ($responce[3] & $block > 0)){ shell_exec("sudo /usr/sbin/iptables -A INPUT -s $adrs -j DROP"); ...

Foi mais uma idéia e tanto, só que não funcionou. O que estava faltando era entender um pouco mais das permissões de usuários.

Informações adicionais