← Tutoriais

[PHP] Bloquear IP's Indesejadas Automaticamente (Blacklist)

Lida 2086 vezes

Offline

=IceBurn= 
Membro
Mensagens 897 Gostos 3
Feedback +3

Troféus totais: 32
Trófeus: (Ver todos)
Windows User Level 6 Linux User Mobile User Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5

Olá a todos!

Já faz um tempinho que não coloco nenhum tutorial no +T, assim hoje resolvi criar uma pequena classe em PHP para colocar aqui.

Todos nós, regra geral, queremos muito tráfego nos nossos sites, é sinal que o nosso site é popular.

Tendo muito tráfego, temos muitos visitantes, certo? Errado!!

Geralmente poucas pessoas se preocupam a sério com este assunto, até que realmente um dos seus sites comece a ficar entupido com tráfego! Nesses casos a situação piora quando temos um certo limite de tráfego mensal.

Hoje trago-vos uma classe que vai ajudar quem está alojado em servidores partilhados a resolver casos de excesso de tráfego abusivo, nomeadamente bots maliciosos que correm os nossos sites em busca de endereços de email ou com o intuito de praticar SPAM.

Basicamente vamos buscar uma listagem de IP's abusadoras e criar regras de bloqueio no htaccess. Podem facilmente colocar um cron job diário a fazer esta actualização automaticamente.

A classe está comentada, pelo que não vou adiantar muito mais. Se alguém tive dúvidas é favor coloca-las aqui no tópico.




<?php

/**
 * HtaccessBlacklist
 * 
 * @author Joao Romao (=IceBurn=) www.portugalparanormal.com
 * @copyright 2009
 * @access public
 */
class HtaccessBlacklist {
    
    
// URL da listagem de IP's abusivas
    
public $blacklist_url  'http://infiltrated.net/blacklisted';
    
    
// Localizacao do nosso htaccess
    
public $htaccess './.htaccess';
    
    
// Nao mexer!!
    
private $delimiter '### HTACCESS BLACKLIST CLASS BY =IceBurn= ###';
    
    
    
/**
     * HtaccessBlacklist::__construct()
     * 
     * Obtem os dados no htaccess se existir
     * @return void
     */
    
public function __construct() {
        
        
set_time_limit(120);
        
        
ignore_user_abort(true);
        
        
$this->htaccess_contents file_exists($this->htaccess) ? file_get_contents($this->htaccess) : '';
        
    }
    
    
    
/**
     * HtaccessBlacklist::get_blacklist_ips()
     * 
     * Le o ficheiro com a listagem e retorna apenas os IP's
     * @return array
     */
    
public function get_blacklist_ips() {
        
        
$bd file_get_contents('http://infiltrated.net/blacklisted'
        or die(
'ERRO: Nao foi possivel ligar a ' $this->blacklist_url);
        
        
preg_match_all("/([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\n/"$bd$array);

        return 
$array[1];
        
    }
    
    
    
/**
     * HtaccessBlacklist::htaccess_lines()
     * 
     * Gera as regras de bloqueio para cada IP obtida.
     * @param mixed $ips
     * @return string
     */
    
public function htaccess_lines($ips) {
    
        
$ret  $this->delimiter;
        
$ret .= "\norder allow,deny\ndeny from " implode("\ndeny from "$ips) . "\nallow from all\n";
        
$ret .= $this->delimiter;
        
        return 
$ret;
        
    }
    
    
    
/**
     * HtaccessBlacklist::update_htaccess()
     * 
     * Escreve a actualizacao no htaccess
     * @return bool
     */
    
public function update_htaccess() {
        
        
$ips $this->get_blacklist_ips();
        
        if(!empty(
$ips)) {
            
            if(
strpos($this->htaccess_contents$this->delimiter) !== false) {
                
                
$this->htaccess_contents ereg_replace('('.$this->delimiter.')(.*)?('.$this->delimiter.')'
                                                         
$this->htaccess_lines($ips),
                                                         
$this->htaccess_contents);
                
            } else {
              
                
$this->htaccess_contents trim($this->htaccess_contents."\n".$this->htaccess_lines($ips));
                                                                       
            }
            
          
          return 
file_put_contents($this->htaccess$this->htaccess_contentsLOCK_EX) ? true false;
          
        
        }

      return 
false;   
    }
    
    
    
/**
     * HtaccessBlacklist::__destruct()
     * 
     * @return void
     */
    
public function __destruct() {
        
        
ignore_user_abort(false);
    
    }
    
// Fim da Classe HtaccessBlacklist
?>




Exemplo de utilização:

<?php

// Incluimos o ficheiro com a classe, partindo do principio que o nome do ficheiro e HtaccessBlacklist.php (Obvio!!!)
require('./HtaccessBlacklist.php');


$bl = new HtaccessBlacklist();

echo (
$bl->update_htaccess() === true) ? 'A Blacklist foi actualizada com sucesso!' 'ERRO: Nao foi possivel actualizar a Blacklist!';
?>




E pronto, é só isto! :)

Testado em Linux (CentOS) com Apache2 e PHP a trabalhar como módulo do Apache (suPHP).

Desculpem a falta dos acentos no código porque senão não iriam perceber muito bem as palavras, mas isso já são situações que me ultrapassam.

NOTA: Em caso de servidor dedicado a precisar de uma segurança mais profunda podem entrar em contacto comigo por MP para se proceder ao orçamento. Este tutorial é óptimo para casos pontuais e isolados, mas para servidores inteiros existem métodos muito mais indicados.