Credit image

¿Te gusta el diseño web? ¡Echa un vistazo a la documentación de LenguajeCSS.com!

htaccess: Bloqueando a la fuerza

Un tutorial acerca de como bloquear a la fuerza esas visitas de robots de spam, scrappers u otras visitas indeseables a nuestra página web.

El último día hablaba sobre las recomendaciones para robots y crawlers mediante el robots.txt. Este sistema es un conjunto de indicaciones para que los crawlers no se «pierdan» y sepan en todo momento por donde pueden y deben ir.

¿Qué es lo que ocurre? Que cualquier persona me puede indicar que debo y que no debo tocar en su casa, pero en todo momento yo tengo la opción de hacerlo, aunque no deba. De eso vamos a tratar en este artículo, ¿Que ocurre si llega un crawler «listillo» que pasa olímpicamente de las recomendaciones que le hemos hecho? Pues que lo echamos a patadas de nuestra casa... ;)

Existe un fichero en los servidores web Apache (la mayoría de los servidores), llamado .htaccess, en el que puedes incluir información de control para dictar al servidor que hacer con tus visitantes y otro tipo de acciones.

Lo primero que necesitamos es un sistema de estadísticas o mejor aún, acceso a nuestro fichero access.log, registro donde se guardan todos los accesos a nuestro servidor. En Dreamhost, el servidor donde tengo alojado mi blog (y uno de los más famosos), tiene acceso SSH/FTP y puedes ver sin ningún problema a estos registros.

Bien con un sistema de estadísticas, o con nuestro fichero access.log, nos interesa observar los accesos por petición (request), navegador o agente (user agent) o por ip. Desde una consola SSH podemos conseguir un listado de las IPs que más peticiones realizan:

tail -10000 access.log | awk '{print $1}' | sort | uniq -c |sort -n

Esta secuencia de comandos nos muestra las últimas 10.000 llamadas a nuestro servidor, agrupándolas por IPs y mostrando el número de peticiones realizado.

Esto nos servirá para tener una idea de que crawlers, robots o usuarios pueden estar sobrecargando nuestro servidor con demasiadas peticiones. Existe un programa bastante útil que yo utilizo para analizar los access.log, llamado Apache Log Viewer. La única y «minúscula» pega es que está en japonés.

  84 63.161.169.137
  85 crawl-66-249-67-236.googlebot.com
  91 81.177.8.166

Este no es un ejemplo real, pero imaginemos que esos son los resultados obtenidos. Tendríamos 84 peticiones de la IP que figura a su derecha. Si vamos a Inicio / Ejecutar / cmd y escribir nslookup IP podremos obtener el DNS inverso y saber a que compañía pertenece, o investigar un poco más con un analizador de logs o estadísticas y ver que accesos ha hecho.

¡Ojo! Que haga muchas peticiones no significa que sea un robot malvado. Puede que se trate de nuestro más fiel visitante o nuestro querido buscador de Google. Mucho cuidado con bloquear IPs sin pensarselo.

En mi caso resultó que la IP 81.177.8.166 realizaba bastantes peticiones, e investigando un poco más pude ver que eran a antiguos ficheros de un formulario que ya no existían. Probablemente un robot spam que sigue torpemente intentando enviar comentarios de SPAM, generando peticiones inútiles.

Si tenemos dudas la mejor opción es hacer un Whois y si nos parece que está realizando un ataque, enviar una queja al email de abuse del ISP que muestra en el whois.

Bloqueando por IPs


Si estamos completamente seguros de que la IP que hemos encontrado en nuestros logs nos está realizando ataques DoS o algún tipo de sobrecarga de peticiones, vamos a bloquearla. Para ello tenemos que editar el fichero .htaccess en la carpeta raíz de nuestro sitio vía SSH o FTP y escribir o modificar su contenido añadiendo:

Order allow, deny
Deny from 81.177.8.166
Allow from all

Y no solo bloquear IPs, sino también rangos de IPs mediante sus clases: Deny from 81.0.0.0/8. Esto también es aplicable a crawlers que hemos añadido en el robots.txt y vemos días o semanas después (ojo, a veces no leen el robots.txt instantáneamente) que no hacen caso. Ahora toca que hagan caso a la fuerza mostrando un código de error 403 (prohibido) en lugar de lo que esperaban.

Bloqueando con SetEnvIfNoCase


Se nos plantea otra dificultad. Los robots que acceden ahora nunca tienen la misma IP, siempre son totalmente diferentes y sin relación:

  • Bot 1: Su agente de usuario no varía, es Malvadobot/2.0.
  • Bot 2: No tiene nunca el mismo agente de usuario, ni IP, pero accede siempre al fichero /sendemail.php, que no existe.
  • Bot 3: Ninguno de los anteriores criterios es fijo, salvo que viene siempre (Referer) de la página http://www.spammers.com/.

¿Cómo los bloqueamos?

SetEnvIfNoCase User-Agent "Malvadobot/" spambot
SetEnvIfNoCase Request_URI "/sendemail.php$" spambot
SetEnvIfNoCase Referer "^http://www.spammers.com/" spambot
deny from env=spambot

Con este código estamos identificando los criterios de los tres bots anteriores para asignarles una variable llamada spambot si casa con los criterios, y que si es así, bloqueará.

Bloqueando con ModRewrite


Existe otra alternativa para bloquear, que necesita el módulo mod_rewrite, y aunque se utiliza para reescribir direcciones, nos puede venir bastante bien para bloquear. Lo he dejado para el final, puesto que creo que es la alternativa más costoso en términos de computación, con respecto a los métodos anteriores.

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^Malvadobot/.* [NC]
RewriteCond %{REQUEST_FILENAME} ^/sendemail.php$ [NC]
RewriteCond %{HTTP_REFERER} ^http://www.spammers.com/.* [NC]
RewriteRule .* - [F]

En primer lugar activamos el motor del ModRewrite, y usamos los tres casos anteriores como condiciones con el RewriteCond. En caso de ser afirmativa, reescribimos mostrando un error 403, o también podemos usar un error 410 (Eliminado permanentemente) escribiendo [G] en lugar de [F]. En la página de documentación de ModRewrite hay mucha información para profundizar.

Ahora ya sabemos como bloquear. Hay que usarlo con mucho cuidado para no bloquear a usuarios legítimos y perder visitas.

Escrito por Manz, el , en webmasters. Comentarios recibidos: 28.

28 comentarios de lectores
Inge
Inge
1

Manz, felicitaciones por los excelentes posts en tu blog, te sigo desde hace unos meses. Nuevamente gracias por estos posts, sigue con estos posts. Saludos desde Cuernavaca, México.

rubendomfer
rubendomfer
2

Muy útil el tutorial ;) Yo hasta ahora utilizaba la web: http://www.htaccesstools.com para modificarlos

Jake
Jake
3

Dos cosas: La primera: el mod_rewrite. ¡Qué herramienta tan maravillosa! La verdad es que al principio se resiste a ser aprendido pero luego es tan potente que ves la web desde otro punto de vista (ves el código y no la rubia). La segunda es algo que me ha llamado la atención de forma preocupante en un par de posts tuyos: los porcentajes. Los porcentajes o estadísticas que a veces comentas en tus posts, que normalmente no son el motivo principal del post sino que van dentro de párrafos, como el 90% de servidores aquí o el 75% de bloggers en otro post. Cada vez que leo uno de estos números no puedo evitar preguntarme si es una estimación tuya, un sustituto de las expresiones gran parte de o la mayoría de, o si sacas los números de encuestas publicadas sobre el tema. Y bueno, en cualquier caso creo que no estaría de más una aclaración, porque muchas personas luego se acuerdan de los números y dan esa información por válida sólo porque lo que pone en el mismo texto también lo es. De hecho, si miras esta estadística verás que el porcentaje de uso de Apache es mucho menor, la cosa está más repartida. Saludos

Manz
Manz
4

Efectivamente... Yo casi no puedo vivir sin mod_rewrite, se hace tan útil para todo... Con respecto a lo de los porcentajes, tienes razón. No es del todo correcto alguno de los números usados, mucho mejor usar cosas como (en su mayoría). Para los lectores, es mucho más intuitivo hacerse una idea de un porcentaje, pero claro, depende mucho de varios factores. Lo que me sorprende es que haya variado tanto el porcentaje de uso de Apache con respecto a Microsoft en los últimos meses.

Public Enemy
Public Enemy
5

Enhorabuena por esta última remesa de post Manz. Muy útiles y desde luego yo lo voy a intentar sacar partido. Vaya currada, sigue así.

May007
May007
6

Hola esta muy bueno tu blog, y veo que le sabes mucho a esto de bloquear y dar acceso a un sitio Web, me gustaría saber como hacerle para que a mi sitio Web solo algunas personas o PC puedan entra a ver el contenido, ya les e creado cuentas en no-ip.com pero no me esta resultando, pues le niega el acceso al sitio, la única forma para hacerlo funcionar es agregando las IP`s de las maquinas, pero como las IP`s son dinámicas las tengo que estar cambiando, mira este es mi .htaccess , no se si haya algo mal, tú que dices? order deny,allow deny from all allow from .org allow from pc1.frmex.net allow from pc2.frmex.net allow from pc3.sytes.net allow from pc4.no-ip.org allow from may007mx.sytes.net Para montar mi servidor estoy usando apache 2.2, Mysql 5.0 y PHP 5

Manz
Manz
7

Quizás sería mejor que en lugar de usar el "allow/deny from" lo protegieras con clave vía htaccess. Asi los usuaros permitidos solo tienen que poner una contraseña. Busca un poco sobre htpasswd, hay mucha documentación por la red. Saludos,

Pablo
Pablo
8

Hola, Veo que tienes muy buena nformacion, yo pense que sabia algod e informatica pero veo que me estoy quedando atras. Dime por favor es posible bloquear que mi sitio sea visualizado en mi pais, esto me seria muy util porque me sitio esta destiando solo a exportacions y las visitas locales solo me cuestan dinero. Saludos desde las altas tierras bolivianas

Informático
Informático
9

Muy útil esta información al igual que el resto del blog. Saludos paisano ;)

Avene
Avene
10

Muy interesante tu blog. Gracias por tus consejos.

martin
martin
11

Muy bueno tu post!!!

Javier Lorente
Javier Lorente
12

Hola. Llevo un rato leyendo tu blog y parece que te preocupa mucho la optimización en el uso de los recursos del servidor. Para los que tenemos un servidor dedicado, ¿no crees que es mejor meter todas estas directivas directamente en el httpd.conf y desactivar el Alloverride? Saludos

Manz
Manz
13

@Javier Lorente: Personalmente, yo sólo introduciría en el httpd.conf reglas muy generales que quieras que se apliquen a todo el sitio web e influyan en todo el sitio web. Por ejemplo, un bloqueo que solo ocurre en una carpeta /blog de tu página, se estaría evaluando y teniendo en cuenta siempre, aunque no se llegue a esa carpeta. Mi idea general es utilizar los .htaccess, que son un buen recurso.

edita
edita
14

me pongo muy molesta cuando entran a mi sistema los spyware existen salas de chat que utilizan este medio para spiar el sistema que usas.. y te bloquean para entrar a salas o te banean y distraen mientra entran a tu sistema.¿ como hago para que esto no suceda? como se bloquean

George el ermitan
George el ermitan
15

Y como puedo bloquer con el .htaccess solo el directoio raiz pero que no influya en los subdominios que es lo que me esta pasando al redireccionar las url diamicas a url amigables... Saludos

skate
skate
16

Hola, muy interesante tu post. El problema que yo tengo es que lleva un bot metido en mi web varios dias y no para de enviar peticiones. El problema es que la ip cambia, por lo que no puedo bloquearla. Mi web esta en 4 idiomas y va rastreando los 4. ¿Podrias decirme como podrias solucionar esto?

Apach_E
Apach_E
17

Muy bueno el post. Justo lo que estaba buscando. Gracias.

david
david
18

Hola, tengo un problema con una persona que publica en mi web, esta todo el dia haciendo publicidad de su web www . siempre de ...es el tema es usa un proxi y no le puedo bloquear por IP, me gustaria poder bloquear palabras en los anuncios. Un saludo y muchas gracias, muy util tu blog

  • 1
fogar
fogar
19

Me ha sido de gran ayuda para un proyecto nuevo. Gracias!

Alexis Advance
Alexis Advance
20

Amigo, gran información es la que has publicado. A pesar de que ahora no la necesito, la leí toda. Uno nunca sabe cuándo necesitará utilizar alguna herramienta, y en el mundo de la informática estar informado (sí: la redundancia es a propósito ;)) jamás está de más. ¡Saludos!

Harry N
Harry N
21

Muy útil esta información al igual que el resto del blog ;))) EXCELLENT

Huver
Huver
22

hola amigo tengo un problemita con windows vista, tratee de descargar google chrome y despues de ejecutarlo y en eso que trata de concectarse a internet, me paarecio un error que no puede conectarse, de igual modo con el norton, trato de conectarme a mi cuenta y no se puede, me puedes ayudar porfavor ^^

Miguel Bello
Miguel Bello
23

Tu línea del shell para analizar IPs combinando AWK es perfecta. Saludos desde México

Martin
Martin
24

Como es posible que tengo bloqueadas varias ip con el archivo htaccess y sin embargo sigo viendo en las estadistcias awstats que todos los dias entra el robot? Por jemplo este ip que es spammer 96.47.225.66 y otras similares. Las tengo hace mucho prohibidas en mi archivo htaccess y sigue entrando

Volcom
Volcom
25

Gracias por la informacion , me ha sido de gran ayuda de verdad!

fede
fede
26

hola manz, tengo un servidor apache y necesito bloquear el acceso a un determinado fichero , el codigo es simple pero no logro que funcione!!! ¿Alguna idea de cual puede ser el error? este es el codigo que use en mi .htaccess: Order allow,deny Deny from all Gracias, saludos:D

xperia92
xperia92
27

Gracias me servirá

JCL Consultor
JCL Consultor
28

Recibí un ataque parecido en mi sitio JCL Consultor y efectué el bloqueo a las IP entrantes en mi archivo httacces, realmente fue efectivo aplicar el deny from 54.x.x.x, pero no se si hay alguna solución con un plugin de wordpress que lo efectué directamente o si se puede denegar el acceso por un dominio ejemplo: deny from el-dominio.com Saludos

Publica tu opinión

Si lo deseas, puedes utilizar el siguiente formulario para publicar tu opinión o responder a alguna de las existentes:

Previsualización

Aquí se previsualizará su comentario. Revise que sea correcto antes de publicarlo.