Cómo evitar el Hotlinking y aprovecharnos de ello
Los webmasters sufren a menudo lo que se denomina Hotlinking, es decir, otras páginas usan archivos (por ejemplo imágenes) alojados en su servidor directamente, haciendo que se consuma su ancho de banda. Lo correcto sería que la persona que quiera usar una imágen en tu web se la descargara a su disco duro y la subiera posteriormente por FTP a su propia página, haciendo así que el ancho de banda gastado sea el propio y no el ajeno.
En varios blogs se pueden encontrar soluciones a este problema, un tanto radicales bajo mi punto de vista, que hacen que cuando un blog te enlace directamente una imágen esta sea sustituida por otra en tiempo de ejecución, o incluso que no se muestre nada, ahorrando así todo el ancho de banda.
Sin embargo si nos paramos a pensar un poco, lo que nos gustaría no es que nadie nos hiciera hotlinking de las imágenes, sino que ese blog acreditara en alguna parte que la imagen está extraída de nuestro blog. Como no podemos obligar al propietario del mismo a que nos enlace o nos nombre en algún sitio acerca de donde ha sido obtenida la imagen, vamos a aprovecharnos para incluir la URL de nuestro blog en la imagen enlazada, para ello haremos uso de los archivos .htaccess de Apache y de la librería GD de PHP. Lógicamente no queremos que las imágenes que incluyamos en nuestro blog tengan incrustada la URL del mismo.
La idea es simple, cuando un blog nos enlace una imágen directamente la petición GET llegará al servidor con un campo HTTP_REFERER que no corresponderá con la URL de nuestro blog, en ese momento se invocará un script PHP al cual le pasamos la ruta de la imagen solicitada. Este script PHP se encargá en tiempo real de abrir la imagen, incrustarle la URL de nuestro blog y mostrarla.
Este es un ejemplo de una imagen enlazada directamente por nuestro blog:

Este es un ejemplo de como se mostraría la misma imagen si alguien nos hiciera Hotlinking:

Para conseguir incluir este sistema en cualquier página web es necesario usar Apache, con soporte de archivos .htaccess y tener instalada la librería GD en PHP.
Paso 1: Editar el archivo .htaccess e incluir lo siguiente sustituyendo tudominio.com por tu dominio.
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?tudominio\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{REQUEST_URI} .*\.(jpe?g|gif|bmp|png)$
RewriteRule ^(.*)$ /nohotlink.php?i=$1 [L]
Paso 2: Crear un archivo en el directorio raiz de la web denominado nohotlink.php e incluir el siguiente contenido, sustituyendo www.tudominio.com por tu dominio
<?php
function imagecreatefromfile($path, $user_functions = false)
{
$info = @getimagesize($path);if(!$info)
{
return false;
}$functions = array(
IMAGETYPE_GIF => ‘imagecreatefromgif’,
IMAGETYPE_JPEG => ‘imagecreatefromjpeg’,
IMAGETYPE_PNG => ‘imagecreatefrompng’,
IMAGETYPE_WBMP => ‘imagecreatefromwbmp’,
IMAGETYPE_XBM => ‘imagecreatefromwxbm’,
);if($user_functions)
{
$functions[IMAGETYPE_BMP] = ‘imagecreatefrombmp’;
}if(!$functions[$info[2]])
{
return false;
}if(!function_exists($functions[$info[2]]))
{
return false;
}return $functions[$info[2]]($path);
}header(“Content-type: image/png”);
$im = imagecreatefromfile($_GET['i']);
$width = imagesx($im);
$height = imagesy($im);
putenv(‘GDFONTPATH=’ . realpath(‘.’));
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
$orange = imagecolorallocate($im, 220, 210, 60);
$tamano = 10;
$texto = “www.tudominio.com“;
$tb = imagettfbbox($tamano, 0, “arial”, $texto);
$altura = $tb[3] – $tb[5];
imagefilledrectangle ($im , 0 , $height-$altura-2 , $width , $height, $black);
$x = ceil(($width – $tb[2]) / 2);
imagettftext($im, $tamano, 0, $x, $height-4, $orange, “arial”, $texto);
imagepng($im);
imagedestroy($im);?>
Paso 3: Descargar en el directorio raiz de vuestra web la fuente arial.ttf, la podeis obtener desde aqui.
Y listo, ya tendríamos todo en funcionamiento. Podemos hacer una prueba de si el sistema funciona usando el siguiente comando desde wget:
wget http://www.tudominio.com/alguna_imagen.jpg –referer=http://www.otrodominio.com
Hola, en el paso numero uno pones que hay que escribir http://www.tudominio.com pero en la line de comando pone
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?tudominio\.com/ [NC]
Tomando como ejemplo ww.google.com, quedari asi?
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?google\.com/ [NC]
Perfecto. Sólo una contra, y grande, si temías por el consumo en tu servidor de ‘bandwitch’ derivado de estas prácticas (el hotlinking), con esta solución no sólo no se arregla, si no que empeora, se consume más ancho de banda y se aumenta mucho la carga del servidor (php generando imagenes por doquier en los sitios que te enlazan) Si te enlaza una web grande y dependiendo del servidor que tengas, lo más probable es que te tumbe la página en cuestión de minutos.
Aun así, buen aporte
Consume muchos recursos del server hacer eso?
#1 Si, si pones RewriteCond %{HTTP_REFERER} !^http://(.+\.)?tudominio\.com/ [NC] te cubre tanto los enlaces a tu blog con las www como los enlaces sin las www, pero esto depende de la política que hayas adoptado, si redireccionas o no el dominio sin www al dominio con www.
Bueno, por lo que ha dicho Aleix mientras yo escribía ya veo que si consume recursos.
#2 Efectivamente, es lo malo que tiene esta técnica que te gasta más CPU y ancho de banda. Lo de que te enlace una web grande sería una ventaja porque probablemente llegarían más visitas a tu blog al final.
Una solución para que no llegase a gastar tanta CPU (pero a costa de usar espacio en disco duro) es la de usar una especie de caché, es decir, que la primera vez que enlazan una de tus imágenes se genere al vuelo y se almacene con un nombre, como nombreoriginal-cache.jpg, así sucesivas veces puedas devolver esa imagen cacheada con la URL de tu blog en vez de volver a cachearla. Esto habría que incorporarlo en el script PHP.
no me funciona, simplemente desaparecieron las imagenes en el otro servidor, y creo que Aleix tiene un poco de razon, cada carga generaria mas consumo al tener que ejecutar el script
En términos de ancho de banda se consume lo mismo que si no tuvieras nada, en términos de CPU en el servidor no creo que suponga un gran aumento sinceramente.
Daniel, lo que tendrias que recomendarme es que plugin utilizas para los comentarios. XD
Pues ningún plugin en especial, uso el wordpress normal y corriente, la última versión 2.6.5
@Daniel Vigueras
te lo digo por la forma en que aparecen los comentarios, el reply y el quote, o viene integrado en el theme?
@repacheco81
Viene integrado en el theme
Lo cierto es que si que consume bastante más CPU pero eso se soluciona fácilmente con una cache, seguirá teniendo más consumo que un hotlinking normal pero será casi nulo (es más con el .htaccess se puede evitar el paso del php si hay imagen cacheada).
También puedes generar las imágenes con tu URL offline, de forma que no necesites incrustarla para cada petición, no?
Así solucionas el problema del consumo de CPU, aunque a costa de tener dos copias de *todas* tus imágenes sobre las que quieras aplicar la técnica descrita.
@Pablo Si, o una manera híbrida, si no existe se genera, y si existe se lee directamente.
No me funciona! Descarga la foto igual y donde la muestra, la muestra igual…
@pepito Lo que te puede estar pasando es que estés viendo la versión cacheada en tu navegador de la imagen.
Prueba a refrescar la web usando Control + F5, de esta forma el navegador ignorará la caché.
Existe un problema mayor que el de la CPU: la propiedad “referer” es fácilmente falsificable.
Efectivamente, la falsificación de la cabecera HTTP Referer es trivial . Sin embargo el hecho de falsificar esta cabecera implica que expresamente has empleado un método para ello, método que no puedes automatizar cuando cualquier otra persona visita una página web con su navegador, ya que al cargar las imágenes envía automáticamente la cabecera Referer correcta.