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:
- Tener activado mod_rewrite en nuestro servidor
- PHP5-GD para trabajar con imágenes
- 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í:
Mientras que si accedemos enlazando directamente la veremos así:
Fuentes:
Muy interesante 🙂
Muchas gracias Migue!!
Muy buena idea! Me ha gustado mucho el post.
Gracias David, venía inspirado por tu entrada!
Un saludo.