Medidas anti-hotlinking con excepciones

Autor: Armonth | El sábado 07 de abril del 2012 @ 18:10.

En el pasado he escrito algunas cosas sobre el hotlinking, como afecta negativamente al rendimiento del sitio, como pueden hacerse ataques CSRF, etcétera. Pero ahora que he separado el contenido "media" (imágenes, PDFs, etcétera) del web (HTML) en un subdominio http://static.sigt.net pues lo puedo filtrar más fácilmente sin "cagarla".

Pero, en el caso de las imágenes especialmente, nos puede interesar que se puedan ver en otros sitios. Así que a esas medidas hay que aplicar algunas excepciones.

El código, al final, queda así:

# --------- General SET options --------
Options -Indexes


# --------- Caching header tags --------
<FilesMatch "\.(ico|gif|jpg|png|css|js|gz)$">
Header set Cache-Control "max-age=604800, public"
</FilesMatch>

FileETag None
Header unset ETag


# --------- Disable Hotlinking ---------
#  except Google Reader and other sites
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?sigt\.net(/.*)*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://static\.sigt\.net(/.*)*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://planetwebdev\.net(/.*)*$ [NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://www\.google\.(com|es)/reader/(m/)?view/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://(www\.|images\.)?google\.(com|es)/.*$ [NC]
RewriteRule \.(jpg|jpeg|gif|bmp|png)$ nohotlink.gif [L]
</IfModule>

El código, aparte de las oportunas cabeceras para la cache del navegador, es a grandes rasgos que si el HTTP_REFERER (desde donde carga la imagen) no es una de la lista en lugar de eso carga la imagen nohotlink.gif:

Hotlink Filte

Las excepciones actualmente son:

  • !^$.
  • SigT y static.sigt.net (obvios).
  • El Planet Webdev.
  • Google Reader (.com/.es).
  • Google Imagenes (.com/.es).

Actualmente no se pueden hacer excepciones para clientes de escritorio vía HTTP_REFERER, quizás se podría apañar por HTTP_USER_AGENT pero cada pequeña variación de user-agent tendría que ser una excepción nueva, lo cual lo hace inmantenible.

Pero la gracia es la primera excepción: !^$. Si no se envía HTTP_REFERER se considera un sitio permitido. Esto significa que para los que tengan problemas para leer desde otras fuentes (os estoy mirando a vosotros, lectores RSS desde escritorio/móvil APP) solamente tienen que desactivar el REFERER (enviar un referer en blanco).

Una búsqueda rápida en Google por Disable HTTP_REFERRER os pondrá en el camino correcto.

Para usuarios de Firefox podéis usar RefControl lo instalais y añadis de excepción que el sitio desde donde leeis los RSS (Google Reader u otro) no envie REFERER y arreglado... no sólo para SigT si no para otros sitios (muchos añaden esta excepción).

De todas formas, la mayoría de gente me lee vía RSS (y ahí predomina Google Reader), directamente en la web o en el Planet Webdev. Si usáis algún otro lector de RSS online siempre podéis darme un toque para añadirlo a la lista de permitidos.

Relacionados

Comentarios