En el artículo de ayer expliqué cómo implementar una lista negra de dominios para evitar el hotlinking. Pido disculpas por no explicar detalladamente de qué se trata esto del "hotlinking", pero no tengo ganas de explicarlo y existe una entrada en Wikipedia que lo explica claramente. Ya expuse mi opinión acerca de por qué no es conveniente utilizar una lista blanca. Pero para reforzar la idea, está el caso de las redes sociales descentralizadas (por ejemplo Diaspora*). Las redes sociales descentralizadas no poseen un único dominio, sino cientos (o miles). Esto hace que sea imposible determinar ni predecir desde qué dominios se hará hotlinking "válido". Válido porque no queremos impedir el hotlinking desde redes sociales, para lograr que nuestros artículos se vean de forma correcta (la imagen de nuestro sitio artículo que agregan las redes sociales al momento de compartir un link).

Ahora bien, implementar una lista negra es simple, lo difícil es determinar quiénes son los ladrones que nos están robando (además de contenido) ancho de banda. Para ello, sólo se puede recurrir a los logs de acceso del servidor Web.

Tanto Apache como Nginx utilizan por defecto el formato de log CLF (Common Log Format). En este formato, una entrada de log luce como sigue:

192.168.100.101 - - [22/Aug/2015:11:06:10 -0400] "GET /linuxito.com/media/jui/js/jquery.min.js HTTP/1.1" 404 2389 "http://www.linuxito.com/seguridad/271-como-obtener-la-clave-de-producto-de-windows-8" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36"

Tal como se observa, el referer (URL desde donde se originó la petición actual) es el segundo elemento entre comillas dobles. Por ende, es posible separar la línea en columnas delimitadas por comillas dobles, y quedarse con la cuarta columna (cut -d'"' -f4). Con esto nos quedamos sólo con los referers. Luego es posible "destripar" las URLs en columnas delimitadas por el caracter '/', y quedarse sólo con la tercer columna (cut -d'/' -f3). De esta forma se obtienen todos los dominios, que luego hay que ordenar (sort) y eliminar repetidos (uniq), junto con alguna otra magia para descartar peticiones sin referer (grep -v '\-$') o peticiones desde nuestro dominio (grep -v "linuxito.com").

Si el archivo de log a revisar es access.log y nuestro dominio "linuxito.com", el comando a ejecutar es el siguiente:

cat access.log | grep ".png \|.jpg \|.gif \|.jpeg " | cut -d'"' -f4 | grep -v '\-$' | cut -d'/' -f3 | grep -v "linuxito.com" | sort | uniq

Este comando obtiene un listado en orden alfabético de todos los dominios desde donde se cargan imágenes con extensión .png, .jpg, .gif y .jpeg que se encuentran alojadas en nuestro servidor.

Ejemplo:

root@linuxito:/usr/local/nginx/logs# cat access.log | grep ".png \|.jpg \|.gif \|.jpeg " | cut -d'"' -f4 | grep -v '\-$' | cut -d'/' -f3 | grep -v "linuxito.com" | sort | uniq
bay173.mail.live.com
berlinspora.de
bit.ly
blog.cbtis88.edu.mx
blog.zoller.lu
br.images.search.yahoo.com
campus.uladech.edu.pe
cn.bing.com
co.images.search.yahoo.com
comunidad.dragonjar.org
connect.facebook.net
cronostech.no-ip.org
cse.google.com
ct.moreover.com
diasp.de
diasp.eu
diasporabrazil.org
diasporabr.com.br
diaspora.com.ar
diaspora.openhosting.com
digg.com
disqus.com
duckduckgo.com
ediska.ga
ediska.gq
es.images.search.yahoo.com
es-mg42.mail.yahoo.com
espora.com.es
feedly.com
feedreader.com
flipboard.com
fr.circlecount.com
friendica.mamalibre.com.ar
gaia.ddns.net
gnulibre.com
goo.gl
hubzilla.nl
idoru.pl
image.baidu.com
images.google.fr
images.search.yahoo.com
iPadOS
jenaspora.de
joindiaspora.com
kodras.cf
linuxito.disqus.com
localhost
londor.be
m.27bn.com
m.facebook.com
monocle.duckduckgo.com
m.taringa.net
no info
noys-tecnologia.blogspot.cl
noys-tecnologia.blogspot.de
ow.ly
pic.sogou.com
platform.linkedin.com
plus.google.com
plus.url.google.com
pod.asap-soft.com
pod.babillage.org
poddery.com
pod.diaspora.software
pod.disroot.org
pod.orkz.net
podricing.pw
profesdeciencies.net
readability.com
reader.gotmalk.org
rebelmouse.com
reparacionmac.es
rss.ighome.com
s3.feedly.com
sechat.org
slack.com
snt153.mail.live.com
taringa.net
tavacinthe.wp.lc
t.co
therealtalk.org
translate.googleusercontent.com
tweetedtimes.com
webcache.googleusercontent.com
wk3.org
www.augure.com
www.bing.com
www.blogger.com
www.bloglovin.com
www.circlecount.com
www.comunidadhosting.com
www.facebook.com
www.flexamail.com
www.framabag.org
www.g2khosting.com
www.genteguada.es
www.google.cl
www.google.com
www.google.com.ar
www.google.com.bo
www.google.com.co
www.google.com.cu
www.google.com.do
www.google.com.ec
www.google.com.gt
www.google.com.mx
www.google.com.ni
www.google.com.pe
www.google.com.py
www.google.com.sv
www.google.com.uy
www.google.co.uk
www.google.co.ve
www.google.cz
www.google.es
www.google.fr
www.google.hn
www.google.it
www.google.sk
www.guadalinex.org
www.hxddc.com
www.inoreader.com
www.instapaper.com
www.joindiaspora.com
www.nuzzel.com
www.srvtracker.com
www.symbaloo.com
www.taringa.net
z.linux-users.ru

Más allá de que eliminé muchos dominios de este listado, para preservar la identidad de los ladrones de ancho de banda (excepto Taringa! que me roba contenido, tráfico y ancho de banda, se pueden ir bien a la mierda), es claro que la mayoría del hotlinking es válido. Es decir, el acceso a las imágenes desde sitios externos proviene desde redes sociales, buscadores y lectores RSS. Sitios para los cuales no deseamos evitar el hotlinking para no perjudicar la experiencia de navegación de sus usuarios (potenciales visitantes a nuestro sitio). Es claro que una lista blanca sería muchísimo más extensa que una lista negra, sin contar el mencionado problema de las redes sociales descentralizadas. Sólo basta con ejecutar regularmente este comando e identificar posibles nuevos ladrones de ancho de banda (y contenido, pero ese es otro caso) para ir agregando a la lista negra.

Cabe destacar una vez más que este comando sirve tanto para logs de Apache como Nginx.

Para cerrar el artículo les dejo un ejemplo de hotlinking de imágenes de mi sitio desde Taringa! (sitio que se encuentra en mi lista negra, como puede verse en la captura):

Me copia/pega el contenido sin atribución, lo cual es directamente un robo. Vean el título "Fuente:" el cual está en blanco, cuando debería rezar algo como:

    Este trabajo es liberado bajo la licencia Atribución-CompartirIgual 4.0 Internacional (CC BY-SA 4.0). Todas las marcas registradas son propiedad de sus respectivos dueños.

Junto con un enlace al artículo original.

En fin, qué esperar de un burro más que una patada...


Tal vez pueda interesarte


Compartí este artículo