Como bloquear um IP com .htaccess?
O ficheiro .htaccess é uma das ferramentas mais poderosas disponíveis para administradores de sites em servidores Apache. Permite controlar com precisão o acesso ao seu site sem tocar na configuração principal do servidor. Entre os seus usos mais comuns: bloquear endereços IP indesejados — bots maliciosos, scrapers, atacantes ou simplesmente visitantes cujo acesso pretende restringir. Aqui estão todos os métodos disponíveis, do mais simples ao mais avançado.
Pré-requisitos: ativar mod_authz_host
As diretivas de controlo de acesso por IP no .htaccess requerem que o módulo Apache mod_authz_host esteja ativado no servidor. Este é o caso predefinido em praticamente todos os ambientes de alojamento partilhado e servidores Apache modernos. Se gerir o seu próprio servidor, verifique com:
apache2ctl -M | grep authzTenha também em atenção que a sintaxe difere ligeiramente entre o Apache 2.2 e o Apache 2.4 (a versão atual). Ambas as sintaxes são apresentadas abaixo.
Bloquear um único IP
Este é o caso mais simples. Adicione estas linhas no ficheiro .htaccess na raiz do seu site:
Apache 2.4 (sintaxe atual):
<RequireAll>
Require all granted
Require not ip 123.456.789.0
</RequireAll>Apache 2.2 (sintaxe antiga):
Order Allow,Deny
Allow from all
Deny from 123.456.789.0Substitua 123.456.789.0 pelo endereço IP que pretende bloquear. O visitante receberá um erro 403 Forbidden.
Bloquear vários IPs simultaneamente
Pode adicionar tantos endereços quantos necessitar, listando-os na mesma linha ou em linhas separadas:
Apache 2.4:
<RequireAll>
Require all granted
Require not ip 123.456.789.0
Require not ip 98.76.54.32
Require not ip 11.22.33.44
</RequireAll>Apache 2.2:
Order Allow,Deny
Allow from all
Deny from 123.456.789.0 98.76.54.32 11.22.33.44Bloquear um intervalo de IPs (sub-rede)
Se precisar de bloquear um bloco inteiro de endereços — por exemplo todos os IPs de um fornecedor de internet ou de um datacenter — pode usar a notação CIDR ou o prefixo de sub-rede:
Por prefixo (todos os IPs que começam com 123.456.789):
<RequireAll>
Require all granted
Require not ip 123.456.789
</RequireAll>Por notação CIDR (bloco /24, ou seja, 256 endereços):
<RequireAll>
Require all granted
Require not ip 123.456.789.0/24
</RequireAll>Outros exemplos de máscaras comuns:
- /32 — um único IP
- /24 — 256 endereços (ex.: de 123.456.789.0 a 123.456.789.255)
- /16 — 65 536 endereços (ex.: de 123.456.0.0 a 123.456.255.255)
- /8 — 16 milhões de endereços (ex.: de 123.0.0.0 a 123.255.255.255)
Bloquear um IP num diretório específico
Se pretender bloquear o acesso de um IP apenas a um subdiretório do seu site (por exemplo a sua área de administração), coloque um ficheiro .htaccess nesse diretório específico com a regra de bloqueio:
<RequireAll>
Require all granted
Require not ip 123.456.789.0
</RequireAll>Bom saber: pode também usar os blocos <Directory>, <Files> ou <Location> diretamente no ficheiro httpd.conf ou apache2.conf para um controlo ainda mais preciso — por exemplo bloquear um IP apenas num ficheiro específico. Esta abordagem é mais eficiente do que o .htaccess porque não requer que o Apache leia o ficheiro em cada pedido.
Lista branca: autorizar apenas determinados IPs
A operação inversa também é possível: permitir o acesso apenas a um ou vários IPs específicos e bloquear tudo o resto. Isto é particularmente útil para proteger uma interface de administração:
Apache 2.4:
Require ip 123.456.789.0
Require ip 98.76.54.32Apache 2.2:
Order Deny,Allow
Deny from all
Allow from 123.456.789.0
Allow from 98.76.54.32Qualquer IP não listado receberá um erro 403. Tenha em conta que se o seu IP for dinâmico (muda a cada ligação), esta abordagem pode bloqueá-lo — prefira então uma lista branca por intervalo de sub-rede.
Redirecionar um IP bloqueado em vez de devolver um 403
Em vez de apresentar um erro 403 bruto, pode redirecionar os IPs bloqueados para outra página — uma página de erro personalizada ou mesmo outro URL:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^123.456.789.0$
RewriteRule ^ /acesso-negado.html [R=302,L]Note o escape dos pontos com . na condição RewriteCond — os pontos têm um significado especial em expressões regulares (correspondem a qualquer carácter), pelo que devem ser escapados para corresponderem apenas a um ponto literal.
Bloquear por User-Agent em vez de por IP
Alguns bots maliciosos ou scrapers mudam regularmente de IP mas mantêm o mesmo User-Agent. Neste caso, bloquear por User-Agent é mais eficaz:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^(BadBot|EvilScraper|MaliciousSpider) [NC]
RewriteRule .* - [F,L]O flag [F] devolve um erro 403, [NC] torna a comparação insensível a maiúsculas/minúsculas. Pode adicionar tantos User-Agents quantos necessitar, separando-os com |.
| Caso de uso | Método recomendado | Sintaxe chave |
|---|---|---|
| Bloquear um único IP | Require not ip | Require not ip 1.2.3.4 |
| Bloquear vários IPs | Require not ip (múltiplo) | Require not ip 1.2.3.4 (repetido) |
| Bloquear um intervalo /24 | Notação CIDR | Require not ip 1.2.3.0/24 |
| Lista branca de IPs específicos | Lista branca | Require ip 1.2.3.4 |
| Redirecionar em vez de bloquear | RewriteRule | RewriteCond %{REMOTE_ADDR} |
| Bloquear por User-Agent | RewriteRule + HTTP_USER_AGENT | RewriteCond %{HTTP_USER_AGENT} |
Bom saber: as alterações feitas ao ficheiro .htaccess são imediatamente consideradas pelo Apache, sem necessidade de reiniciar o servidor. No entanto, um ficheiro .htaccess malformado pode tornar o seu site completamente inacessível com um erro 500. Teste sempre as suas alterações num ambiente de desenvolvimento ou faça uma cópia de segurança do ficheiro original antes de qualquer modificação em produção. Se o seu site devolver um erro 500 após a modificação, restaure imediatamente a versão anterior do ficheiro.
Nicolas,