gentoo linux, java, software libre y otras hierbas
sep, 06 2008 - 12:01 am

[Tutorial] Evitar hotlinking y sacarle provecho

Muchos sitios que copian nuestro contenido, bien sea de manera automática o manual, cargan además las imagenes que tenemos alojadas en nuestro servidor, lo cual nos roba el ancho de banda que estamos pagando. La idea de esta pequeña guía es enseñarte cómo evitar que te hagan hotlinking, e ir un poco más allá. El hotlinking es una práctica detestable, aunque reconozco que yo mismo lo hice en mis tiempos de ignorancia suprema

La técnica que utilizaremos consiste en editar el archivo .htaccess que tenemos en la raiz de nuestro servidor. Para los que no saben qué es .htaccess, me permito citar una definición:

es un archivo de configuración en un servidor Web, y contiene comandos en el lenguaje del servidor que le indican cómo debe comportarse en ciertas situaciones. Alguno de los usos más comunes de un archivo htaccess son la restricción del acceso a determinados archivos o carpetas en Internet (o en una intranet) mediante el uso de contraseñas. Adicionamente, los htaccess se usan para redirigir usuarios automáticamente, para bloquear o permitir el acceso al servidor a ciertas direcciones de IP, y para llamar páginas de error customizadas en lugar de las páginas de error 404 standard del servidor. Los servidores Web Apache, y otros servidores que cumplimentan las normas del NCSA pueden usar htaccess.

Además, es ampliamente utilizado por los bloggers, aún cuando no se den cuenta, puesto que es la manera en que WordPress hace que las URL puedan ser del tipo http://ejemplo.com/url-muy-satanica, en vez de http://ejemplo.com/?p=666. De eso ya había creado un pequeño artículo, que no esta demás nombrar.

Entonces, la idea de este artículo es configurar nuestro servidor a través del .htacces para que realice algunas de las siguientes acciones:

No cargar imágenes alojadas en nuestro servidor en otras páginas

Vamos a tomar como ejemplo mi .htaccess, que de seguro será similar o igual al tuyo, si usas WordPress. El archivo en cuestión es el siguiente:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

Si deseamos que ninguna de nuestras imágenes puedan ser cargadas desde otro servidor, simplemente debemos añadir algunas líneas dejando el archivo en el siguiente estado:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://tuweb.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://tuweb.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.tuweb.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.tuweb.com/.*$ [NC]
RewriteRule .*\.(gif|jpg|jpeg|png|bmp)$ - [F,NC,L]
</IfModule>

Donde debes cambiar tuweb, por el nombre de dominio de tu site o blog. Pero nada mejor que entender lo que significan estas extrañas líneas:

  • Las líneas del tipo RewriteCond %{HTTP_REFERER} !^http://tuweb.com$ [NC] básicamente le dicen al servidor que para una petición que no (NO = !) proceda de las URLs indicadas, debe crear una regla…
  • … la regla es RewriteRule .*\.(gif|jpg|jpeg|png|bmp)$ – [F,NC,L], y lo que hace es prohibir (F) la carga de cualquier tipo de imagen (gif|jpg|jpeg|png|bmp), ignorar la diferencia entre mayúsculas y minúsculas (NC) de tal manera que sea igual una petición http://ejemplo.com/imagen.jPg que http://ejemplo.com/imagen.jPG, y por último la L indica que esa será la última regla en ejecutarse en caso de que se cumplan las condiciones.

Solo permitir que algunos sitios carguen nuestras imágenes

Para este caso, la idea es crear una lista blanca de los sitios que pueden cargar nuestras imágenes. Esto es útil, por ejemplo, para permitir a los lectores que nos sigan por medio del feed cargar las imágenes en Google Reader, NetVibes, etc.

Siguiendo con el ejemplo anterior nuestro .htaccess ahora deberá lucir de la siguiente manera:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://tuweb.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://tuweb.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.tuweb.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.tuweb.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.google.com/reader/view/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.google.com/reader/m/view/.*$ [NC]
RewriteRule .*\.(gif|jpg|jpeg|png|bmp)$ - [F,NC,L]
</IfModule>

Como ves, lo único que cambia es que añadimos las URL de los sitios permitidos, debajo del nuestro.

Cargar una imagen diferente

Lo típico a hacer aquí, es cargar una imagen que tenga nuestro logo y URL, de tal manera que los lectores del blog que nos hace hotlinking, se vean obligados a entrar a nuestro sitio si quieren ver nuestra imagen.

En este caso, lo que cambia es la última línea (RewriteRule), que es donde ordenamos al servidor a hacer una redirección:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://casidiablo.net$ [NC]
RewriteCond %{HTTP_REFERER} !^http://casidiablo.net/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.casidiablo.net$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.casidiablo.net/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.google.com/reader/view/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.google.com/reader/m/view/.*$ [NC]
RewriteRule .*\.(gif|jpg|jpeg|png|bmp)$ http://casidiablo.net/hotlink.png [R,NC,L]
</IfModule>

El único flag por explicar, teniendo en cuenta que ya explique el resto en el primer ejemplo, es R: redirecciona la petición a la URL indicada. Con esto cuando alguien intente poner la imagen en su Web, el resultado será el siguiente:

hotlinking frustrado

Cargar la misma imagen pero modificada (distorsionada, en blanco y negro, o con una marca de agua)

Este es mi método favorito, aunque requiere algo de programación en PHP. Puesto que el lector de la web que nos hace hotlinking no tiene la culpa, la idea es que hagamos algo más profesional: mostrar la imagen pero con modificaciones. Así, si nos robaran ésta imagen (de 103.95 KB), el navegador mostraría esto (una imagen de 9.01 KB):

hotlinking frustrado

Lo que se hizo fue lo siguiente:

  • Transformar la imagen JPG, lo cual hace que el ancho de banda utilizado sea menor
  • Reducir el tamaño la imagen, lo cual hace que el ancho de banda utilizado sea menor
  • Poner la imagen en blanco y negro, lo cual hace que el ancho de banda utilizado sea menor
  • Poner una marca de agua, para hacerle saber al lector a donde debe dirigirse
  • Mostrar un preview de la imagen original

Para lograr esto, debemos tener las librerías GD para PHP instaladas en el servidor (la mayoría los trae por defecto). Si deseas aprender a hacerlo, continúa leyendo la siguiente página…

Páginas de esta entrada: 1 2

39 Comentarios | deja el tuyo

4 enlaces entrantes

35 Comentarios en “[Tutorial] Evitar hotlinking y sacarle provecho”

  1. S@mutops dice:

    Excelente y muy útil. A ver si consigo poner en práctica algo de esto ;)

  2. Zarpele dice:

    Muy bueno, felicitaciones.. En estos momentos estoy mudando mi blog a un host con wordpress y el host no es de lo mejorcitos y voy a limitar el ancho, otra opcion valida es alojar las imagenes en un host gratuito o en esos que te dan el link…

    Tambien me gusto la onda tipo sarcasmica en los ejemplos…

    JAJAJ Saludos…

  3. Tomáz dice:

    huy viejo, apenas ahora me vengo a dar cuenta que por mucho tiempo he sido un put0 hotlinker… la verdad no sabía que tomar las imágenes de otra página era tan perjudicial, muchas gracias por hacerme caer en cuenta.
    Reciba un saludo hotlinker desde Don Blog Pérez.

  4. jotahacker dice:

    Muy interesante y util. Te felicito por el post – manual. Pienso ponerlo en marcha…

    Ahora una peticion. Aver si se puede hacer lo mismo pero con links de descarga, etc.

    Un saludo!

  5. Cristian dice:

    Tomáz, put0 hotlinker, no lo vuelvas a hacer XD A no ser que sea una página del gobierno o la policía, con eso les robamos unos céntimos de los millones que nos roban a nosotros.

    @Zarpele: por lo general uso servidores de imagenes solo para post que no son muy importantes. Pero para tutoriales,, y cosas especiales, es mejor usar el servidor propio; uno nunca sabe cuánto tiempo van a estar disponibles los servidores externos ;)

    Un saludo!

  6. Neri dice:

    Yo creo que no es mala idea, pero es demasiado complicado para el usuario con poca experiencia (que apenas sabe lo que es htaccess y php), aunque al que le roban ancho de banda seguramente es porque esta llegando a bastantes personas y porque sabe lo que es todo eso..o al menos una idea.
    Como dije, no es mala idea, pero es algo complicada ;)
    pd: al código en php le agregaría el formato png :)
    Saludos!

  7. DaniFP dice:

    La opción de transformar la imagen JPG no me parece muy buena, pues gasta proceso y no asegura que vaya a conseguir un tamaño menor. ¡Es más, con PNG muchas veces ocupa menos incluso teniendo mejor calidad de imagen!
    Lo que sí produce ahorro es el reducir la resolución, los colores, etc, pero no el hecho de convertirlo simplemente a JPG.

    Saludos

  8. Cristian dice:

    La verdad estaba pensando en hacer un plugin para WordPress, de tal manera que fuera más fácil para el usuario… pero no tengo mucho tiempo.

    Vamos a ver si le dedico un par de días, pero no estoy seguro de poder :P

    Un saludo!

  9. Jose D dice:

    Una pasada, la verdad es que lo probaremos sin lugar a dudas xD

  10. julian dice:

    Me gustaria poner en practica esto, pero me preocupa a la ghora de los lectores en feed, actualmente hay muchas opciones de lectores y no quisiera perder a algunos por no poner ese lector en la lista, de todas formas sera util mas adelante

  11. Cristian dice:

    @Julian: tienes razón, pero la mayoría usa Google Reader o NetVibes (98%), y en caso contrario (ya me ha pasado) serán los usuarios quienes te avisen.

    Un saludo!

  12. julian dice:

    Pues en mi caso Google reader es solo el 13%
    aqui una imagen de feedburner http://farm4.static.flickr.com/3073/2851369650_1b67806907_o.png

  13. Cristian dice:

    Wow, que diferentes somos :D En fin, ahí tienes información valiosa de qué sitios añadir y cuales no.

¡Déjanos tu comentario!