X

Como evitar el hotlinking en cualquier página web con .htaccess y php

Desde los tiempos más remotos la copia o plagio es algo que se viene dando hasta nuestros días. Una evolución de copiar contenido es aprovecharse de los recursos de otros para así no tener que invertir nosotros en esos recursos, en este caso hablamos de hotlinking que vamos a ver qué es y como evitarlo poniendo una marca de agua a nuestras imágenes cuando se carguen desde fuera de nuestro sitio.

No hay nada de malo en intentar proteger lo que es nuestro, por eso vamos a ver como defendernos ante este método de robo de ancho de banda. El hotlinking es simplemente incluir contenidos de otra web como pueden ser imágenes o vídeos directamente de la web de un tercero, es decir, que toda la carga y ancho de banda de ese contenido recaiga sobre quien lo hospeda y nosotros nos llevemos el mérito de tener ese contenido publicado. Esto es lo que se hace normalmente en sitios como youtube, facebook, etc, pero sus posibilidades son diferentes a las de los usuarios normales.

Para evitar el hotlinking, o al menos para llevarnos el reconocimiento de que esa imágen está siendo cargada desde nuestro sitio, y que el usuario pueda tenerlo claro, podemos poner un pequeño script en php que incluya una marca de agua con nuestro dominio o logo únicamente cuando las imágenes se cargan desde un sitio que no es el nuestro.

Para esto vamos a necesitar varias cosas y en este tutorial lo haremos sobre apache:

  • Apache 2
  • GD Library
  • PhP

Si tenemos estas tres cosas podemos proceder con el tuto (prácticamente en todos los hostings está, si no es el caso puedes solicitarlo a quien te presta los servicios de internet ya que el gd es una instalación simple).

Como protegernos contra el hotlinking con php y apache (htaccess)

Lo primero que haremos será crear un logotipo en formato png, un logo que queramos introducir en nuestras imágenes y que deberíamos adaptar al tamaño medio de estas, ya que si son muy grandes y el logotipo es muy pequeño no se va a ver. Podeis usar un png-24 con transparencia para que quede mejor integrado con la imágen principal.

Una vez tengamos el logo le damos nombre por ejemplo logo.png y lo dejaremos en la raíz de nuestro sitio. Ahora nos crearemos un archivo php, por ejemplo htlink.php en la raíz de nuestro sitio también y le pondremos el siguiente contenido dentro

<?php
$src = $_GET['src'];

header('Content-type: image/jpeg');

 $watermark = imagecreatefrompng('logo.png');

$watermark_width = imagesx($watermark);
$watermark_height = imagesy($watermark);
$image = imagecreatetruecolor($watermark_width, $watermark_height);
if(eregi('.gif',$src)) {
$image = imagecreatefromgif($src);
}
elseif(eregi('.jpeg',$src)||eregi('.jpg',$src)) {
$image = imagecreatefromjpeg($src);
}
elseif(eregi('.png',$src)) {
$image = imagecreatefrompng($src);
}
else {
exit("La imagen no es JPG, GIF o PNG");
}
$size = getimagesize($src);
$dest_x = $size[0] - $watermark_width - 0;
$dest_y = $size[1] - $watermark_height - 0;
imagecolortransparent($watermark,imagecolorat($watermark,0,0));
imagecopyresampled($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, $watermark_width, $watermark_height);

imagejpeg($image);
imagedestroy($image);
imagedestroy($watermark);

Por último tendremos que modificar el archivo .htaccess, y dependiendo de nuestra página y de si le estamos dando uso tendremos que poner estas reglas en una parte u otra. Principalmente habrá dos formas, la primera en caso de que no tengamos nada en el .htaccess tendremos que poner el siguiente contenido:

Options +FollowSymLinks
RewriteEngine on

RewriteBase /

RewriteCond %{REQUEST_FILENAME} .*jpg$ [NC]
RewriteCond %{HTTP_REFERER} !vichaunter.org [NC]
RewriteRule (.*) htlink.php?src=$1

por supuesto cambiamos vichaunter.org por la dirección de nuestra página. El segundo método es en caso de que tengamos algún rewrite ya creado, como por ejemplo el de wordpress. Entonces deberíamos colocarlo justo después del RewriteBase / únicamente esto:

RewriteCond %{REQUEST_FILENAME} .*jpg$ [NC]
RewriteCond %{HTTP_REFERER} !vichaunter.org [NC]
RewriteRule (.*) htlink.php?src=$1

Si queremos podemos cambiar la extensión jpg por cualquiera en la que queramos poner marcas de agua.

Una vez hecho esto si accedemos desde cualquier parte que no sea nuestra página a una imágen directamente (o la incluímos en una web de otro dominio) veremos como abajo a la derecha aparecerá nuestro logo o marca de agua para decir a los usuarios de donde están sacando la imágen.

Lo bueno de este método es que da igual qué plataforma utilizes, wordpress, joomla, drupal, etc ya que al ser independiente es compatible con cualquier página.

¿Lo has usado en tu web?

VicHaunter:
    Categorías: Ayuda

Ver comentarios (6)

  • Gracias Vic!
    Bueno, no era exactamente a lo que me refería.
    Me refiero a controlarlo en el servidor, no en el cliente, por si otro server, no un cliente, quiere llamar a este .php

    • Bueno, me has dado una posible solución, y es permitir que el script de php sólo se ejecute para la IP de mi server :) Supongo que valdrá también para controlar nombre de dominios

      • Puede ser, pero ojo con eso, ya que si pones que solo se puedan abrir las páginas desde tu servidor y accede cualquier usuario con el navegador será denegado también.

    • De lado servidor no te va a ser posible, desgraciadamente lo único que podrías hacer sería coger las ips de los servidores que no quieres que puedan cargarlos y denegar su acceso en htaccess.

      No puedes denegar todas las que no sean propias por que los usuarios también conectan desde ips.

      A lo sumo si detectas que algún listo te hace hotlinking lo vas añadiendo a una regla en el htaccess. Para averiguarlo yo haría un archivo en php (por ej redirect.php), que recogiera la ip del referrer. Entonces con lo de la redirección javascript en el iframe los mandas a través del redirect, y te guardaría de qué página viene ese usuario. Luego simplemente sacas la ip de esa página y la bloqueas en htaccess.

      Es un poco engorroso pero sería una forma fácil de encontrar qué sitios te hacen hotlinking. Se me ocurre que también podrías mirar si en los logs de apache o el servidor web que uses queda registrado el acceso desde iframe, y si es así filtrar las ips que lo han hecho de vez en cuando y banearlas.

  • Gracias por el artículo !
    Tengo una duda tonta, se puede evitar el hotlinking de unapágina web html? Para que no te la carguen en un frame, o por ejemplo evitar que cargen un archivo .php desde otro server que no sea el tuyo?

    • Buenas, en un principio se puede hacer aunque depende un poco de si el navegador tiene javascript o respeta los cabeceros.

      Lo primero que puedes hacer es incluir este código javascript en la página:

      if(top!=self){
      top.location.replace(document.location);
      alert("La página ha sido cargada de forma fraudulenta por un tercero. Para evitar una brecha de seguridad elimina el frame dándole a OK .")
      }

      Debería recargar la página sin el iframe cuando le das a ok.

      Por otro lado puedes añadir la etiqueta header

      Lo que hace es denegar la carga cuando se hace mediante un frame, por lo general todos los navegadores que soportan html5 siguen estas reglas.

Artículo relacionado
Los comentarios de Disqus están cargando....

Como todos, usamos cookies.