Añadiendo marcas de agua al vuelo para evitar hotlinking

A partir de una entrada que aparecía esta mañana en Tu Receta, he pasado el día intentando mejorar el sistema. Ellos proponen que cuando alguien enlace directamente a una foto de tu sitio, cambiar la url mediante mod_rewrite hacía otra imagen para que en el sitio sólo pueda mostrar una imagen con algún mensaje o similar, pero no las imágenes originales. Recordé que mi amigo Migue había pasado por eso y lo resolvió, así que empece a investigar para ver cómo podría solucionarlo.

Requerimientos:

  1. Tener activado mod_rewrite en nuestro servidor
  2. PHP5-GD para trabajar con imágenes
  3. Una imagen que será la marca de agua

Lo primero que hacemos es añadir a nuestro .htaccess las nuevas reglas para mod_rewrite que son las básicamente las mismas que en Tu Receta pero cambiamos la RewriteRule así:

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.muspells.net/.*$      [NC]
RewriteCond %{HTTP_REFERER} !^http://www.muspells.net$      [NC]
RewriteRule ^(.*)\.(gif|jpg|png)$ image_script.php?image=$1\.$2   [R]

Cambiamos la regla de reescritura para que apunte a un script de PHP donde editaremos al vuelo la imagen para devolverla al REFERER con una marca de agua.

Hemos llamado al script image_script y lo hemos colocado en la raíz de documentos,

<?php

// En WordPress por ejemplo las imagenes se guardan en directorios,
// necesitamos el PATH completo a la imagen.
$URI = $_GET['image'];
$URI_PARSER = explode ('/', $URI);
$image = "/path/to/DocumentRoot/".$URI_PARSER[count($URI_PARSER) - 1];

switch (TRUE) {
   case stristr($image,'jpg'):
      $photoImage = ImageCreateFromJpeg("$image");
      break;
   case stristr($image,'gif'):
      $photoImage = ImageCreateFromGIF("$image");
      break;
   case stristr($image,'png'):
      $photoImage = ImageCreateFromPNG("$image");
      break;
}

ImageAlphaBlending($photoImage, true); 

// Añadimos aquí el fichero de marca de agua.
$logoImage = ImageCreateFromPNG("watermark.png"); 
$logoW = ImageSX($logoImage); 
$logoH = ImageSY($logoImage); 

// Los 1's representan el margen con el margen superior izquierdo
ImageCopy($photoImage, $logoImage, 1, 1, 0, 0, $logoW, $logoH); 

ImagePNG($photoImage); // output to browser 

ImageDestroy($photoImage); 
ImageDestroy($logoImage); 
?>

El script colocará la imagen watermark.png en la esquina superior izquierda.

Cuando accedemos a alguna imagen de nuestro sitio de forma legítima la veremos así:

gnu

GNU

Mientras que si accedemos enlazando directamente la veremos así:

gnu

Fuentes:

  1. Tu Receta: Evitar Hot-linking con .htaccess
  2. El script
This entry was posted in Apache, PHP and tagged , , , , . Bookmark the permalink.

4 Responses to Añadiendo marcas de agua al vuelo para evitar hotlinking

  1. nordri says:

    Muchas gracias Migue!!

  2. David says:

    Muy buena idea! Me ha gustado mucho el post.

  3. nordri says:

    Gracias David, venía inspirado por tu entrada!

    Un saludo.

Comments are closed.