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...