<-
Apache > Servidor HTTP > Documentación > Versión 2.5 > Rewrite

Uso de mod_rewrite para control de acceso

Idiomas disponibles:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn 

Este documento complementa la mod_rewrite documentación de referencia. Describe cómo puede usar mod_rewrite para controlar el acceso a varios recursos, y otras técnicas relacionadas. Esto incluye muchos ejemplos de usos comunes de mod_rewrite, incluyendo descripciones detalladas de cómo funciona cada uno.

Tenga en cuenta que muchos de estos ejemplos no funcionarán sin cambios en su configuración particular del servidor, por lo que es importante que los entienda, en lugar de simplemente copiar y pegar los ejemplos en su configuración.

Consulte también

top

Prohibir el "Hotlinking" de imágenes

Descripción:

La siguiente técnica prohíbe la práctica de que otros sitios incluyan sus imágenes en línea en sus páginas. Esta práctica se conoce a menudo como "hotlinking", y resulta en que su ancho de banda se use para servir contenido del sitio de otra persona.

Solución:

Esta técnica se basa en el valor de la variable HTTP_REFERER, que es opcional. Como tal, es posible que algunas personas eviten esta limitación. Sin embargo, la mayoría de los usuarios experimentarán la solicitud fallida, lo que debería, con el tiempo, resultar en que la imagen sea eliminada del otro sitio.

Hay varias formas en las que puede manejar esta situación.

En este primer ejemplo, simplemente denegamos la solicitud, si no se originó desde una página en nuestro sitio. Para el propósito de este ejemplo, asumimos que nuestro sitio es www.example.com.

RewriteCond "%{HTTP_REFERER}"  "!^$"
RewriteCond "%{HTTP_REFERER}"  "!www.example.com" [NC]
RewriteRule "\.(gif|jpg|png)$" "-"                [F,NC]

En este segundo ejemplo, en lugar de denegar la solicitud, mostramos una imagen alternativa en su lugar.

RewriteCond "%{HTTP_REFERER}"  "!^$"
RewriteCond "%{HTTP_REFERER}"  "!www.example.com"      [NC]
RewriteRule "\.(gif|jpg|png)$" "/images/go-away.png"   [R,NC]

En el tercer ejemplo, redirigimos la solicitud a una imagen en algún otro sitio.

RewriteCond "%{HTTP_REFERER}"  "!^$"
RewriteCond "%{HTTP_REFERER}"  "!www.example.com"                    [NC]
RewriteRule "\.(gif|jpg|png)$" "http://other.example.com/image.gif"  [R,NC]

De estas técnicas, las dos últimas tienden a ser las más efectivas para lograr que la gente deje de hacer hotlinking de sus imágenes, porque simplemente no verán la imagen que esperaban ver.

Discusión:

Si todo lo que desea hacer es denegar el acceso al recurso, en lugar de redirigir esa solicitud a otro lugar, esto se puede lograr sin el uso de mod_rewrite:

SetEnvIf Referer example\.com localreferer
<FilesMatch "\.(jpg|png|gif)$">
    Require env localreferer
</FilesMatch>
top

Bloqueo de Robots

Descripción:

En esta receta, discutimos cómo bloquear solicitudes persistentes de un robot o agente de usuario en particular.

El estándar para exclusión de robots define un archivo, /robots.txt que especifica aquellas partes de su sitio web donde desea excluir robots. Sin embargo, algunos robots no respetan estos archivos.

Tenga en cuenta que hay métodos para lograr esto que no usan mod_rewrite. Tenga en cuenta también que cualquier técnica que dependa de la cadena USER_AGENT del cliente puede ser evitada muy fácilmente, ya que esa cadena puede cambiarse.

Solución:

Usamos un conjunto de reglas que especifica el directorio a ser protegido, y el USER_AGENT del cliente que identifica al robot malicioso o persistente.

En este ejemplo, estamos bloqueando un robot llamado NameOfBadRobot de una ubicación /secret/files. También puede especificar un rango de direcciones IP, si está intentando bloquear ese agente de usuario solo desde la fuente particular.

RewriteCond "%{HTTP_USER_AGENT}"   "^NameOfBadRobot"
RewriteCond "%{REMOTE_ADDR}"       "=123\.45\.67\.[8-9]"
RewriteRule "^/secret/files/"      "-"                   [F]
Discusión:

En lugar de usar mod_rewrite para esto, puede lograr el mismo resultado usando medios alternativos, como se ilustra aquí:

SetEnvIfNoCase User-Agent ^NameOfBadRobot goaway
<Location "/secret/files">
    <RequireAll>
        Require all granted
        Require not env goaway
    </RequireAll>
</Location>

Como se indicó anteriormente, esta técnica es trivial de evadir, simplemente modificando la cabecera de solicitud USER_AGENT. Si está experimentando un ataque sostenido, debería considerar bloquearlo a un nivel superior, como en su firewall.

top

Denegación de Hosts en una Lista de Rechazo

Descripción:

Deseamos mantener una lista de hosts, similar a hosts.deny, y hacer que esos hosts sean bloqueados del acceso a nuestro servidor.

Solución:
RewriteEngine on
RewriteMap    hosts-deny  "txt:/path/to/hosts.deny"
RewriteCond   "${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}" "!=NOT-FOUND" [OR]
RewriteCond   "${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}" "!=NOT-FOUND"
RewriteRule   "^"                                      "-"           [F]

##
## hosts.deny
##
## ¡ATENCIÓN! Esto es un mapa, no una lista, incluso cuando lo tratamos como tal.
## mod_rewrite lo analiza buscando pares clave/valor, así que al menos un
## valor ficticio "-" debe estar presente para cada entrada.
##

193.102.180.41 -
bsdti1.sdm.de -
192.76.162.40 -

Discusión:

La segunda RewriteCond asume que tiene HostNameLookups activado, de modo que las direcciones IP de los clientes sean resueltas. Si ese no es el caso, debería eliminar la segunda RewriteCond, y eliminar la bandera [OR] de la primera RewriteCond.

top

Deflector basado en Referer

Descripción:

Redirigir solicitudes basadas en el Referer del cual provino la solicitud, con diferentes destinos por Referer.

Solución:

El siguiente conjunto de reglas usa un archivo de mapa para asociar cada Referer con un destino de redirección.

RewriteMap  deflector "txt:/path/to/deflector.map"

RewriteCond "%{HTTP_REFERER}"              !=""
RewriteCond "${deflector:%{HTTP_REFERER}}" =-
RewriteRule "^"                            "%{HTTP_REFERER}" [R,L]

RewriteCond "%{HTTP_REFERER}"              !=""
RewriteCond "${deflector:%{HTTP_REFERER}|NOT-FOUND}" "!=NOT-FOUND"
RewriteRule "^"                            "${deflector:%{HTTP_REFERER}}" [R,L]

El archivo de mapa lista los destinos de redirección para cada referer, o, si simplemente deseamos redirigir de vuelta a donde vinieron, se coloca un "-" en el mapa:

##
##  deflector.map
##

http://badguys.example.com/bad/index.html    -
http://badguys.example.com/bad/index2.html   -
http://badguys.example.com/bad/index3.html   http://somewhere.example.com/

Idiomas disponibles:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn