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_contents, LOCK_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.