El hotlinking (también conocido como inline linking y por otros varios sinónimos) es el uso de una imagen alojada en un sitio A para ser mostrada en un sitio B. Por ejemplo, yo podría en este blog incluir una imagen del sitio de Dataweb Hosting, pero en vez de descargarla y subirla a mi servidor, poner directamente el link a la imagen en el servidor de Dataweb, por ejemplo:
<img src="http://www.datawebhosting.com.ar/img/logo_dataweb_hosting.jpg">
Entonces, cuando alguien entre al blog, el browser automáticametne va a ir a buscar esa imagen al servidor de Dataweb. Esto es algo absolutamente “legal” y es de gran ayuda en muchos casos. De hecho, esto mismo se puede hacer con cualquier archivo que uno incluya en un sitio web (una imagen, un video, un script de Javascript, una hoja de estilos CSS, etc.). Esto nos permite, por ejemplo, incluir en nuestros sitios videos de YouTube, los scripts de publicidad de Google AdSense, etc.
Por supuesto, al incluir un recurso de esta forma, se genera tráfico en el servidor de orígen. En algunos casos puede ser un problema, porque si yo tengo alojado mi sitio en un servidor chico y una persona publica una imagen de mi servidor en un sitio muy concurrido, mi tráfico se puede incrementar a niveles que quizás no sea capaz de manejar. En ese momento el hotlinking resulta nocivo.
Afortunadamente, Apache tiene muchos features interesantes y jugando un poco con mod_rewrite podemos evitar el hotlinking. Para ello debemos tener en cuenta que los requests de estas imágenes van a llevar siempre un HTTP Referer que va a ser igual a la URL donde éstas están incluidas. En el ejemplo anterior, al servidor de Dataweb le llegaría un request del archivo logo_dataweb_hosting.jpg con un referer que podría ser “http://www.tail-f.com.ar/”. Entonces, en nuestro archivo .htaccess hacemos lo siguiente:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(.+\.)?mysite\.com/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
En este caso, cuando venga un request que tenga como referer una URL de un dominio diferente al mío (específicamente diferente de mi dominio principal y cualquier subdominio), que sea de un archivo con extensión jpeg, jpg, gif, bmp o png, se devolverá la imágen “nohotlink.jpg”.
Otra opción es bloquear el hotlinking por parte de dominios específicos. Por ejemplo:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?myspace\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?blogspot\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^http://(.+\.)?livejournal\.com/ [NC]
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
En este caso, similar al anterior, lo que se bloquean son todos los requests que vengan de myspace.com, blogspot.com y livejournal.com.
Para cerrar debo decir que no estoy muy de acuerdo con estos métodos por una serie de razones. En primer lugar, por una cuestión de principios, siempre prefiero compartir mis imágenes (así como espero que los demás las compartan conmigo) a prohibir su uso. En segundo lugar, y más importante, este método dista mucho de ser ideal. De hecho, aunque usándolo el hotlinking resulte inútil para la persona del otro sitio que quiera usar nuestras imágenes, no dejamos de transferir la imagen nohotlink.jpg. Con lo cual, aunque se pudiera reducir el tráfico (suponemos que nohotlink.jpg sería una imagen muy liviana), no se reduciría la cantidad de requests que de por sí pueden resultar muy pesados para el servidor.
Una opción más interesante, porque evita transferir una imágen, es devolver un código de error HTTP, por ejemplo 403 (Forbidden). Para ello, en el código anterior reemplazaríamos:
RewriteRule .*\.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]
por
RewriteRule .*\.(jpe?g|gif|bmp|png)$ - [F]
Sin embargo, me pareció un ejemplo interesante para publicar porque da más ideas sobre cómo usar mod_rewrite y puede aportar en la solución creativa de problemas similares.
Fuente: altlab.com

Excelente artículo. No sabes cuanto he estado buscando un tuto acerca de como modificar .htaccess en Apache para definir reglas anti-hotlinking.
En verdad te agradezco mucho tu tiempo y dedicación al tema.
Mil gracias
Me alegro que sea de ayuda!
Saludos
Muy bueno el articulo aunque a mi tampoco me gusta la idea, es cierto que aveces en un server personal puede ser un gran problema que tomen un imagen y la empiezen a bombardear de requests.
Aunque el nohotlink.jpg no cortara con las peticiones, el hecho de no mostrar lo que el usuario quiere la hace inservible asi que al fin y al cabo si reduce los requests..
Claro, tenés razón.
De todas formas, mientras pueda no aplicarlo sin que mi servidor perezca, no lo haré jeje.
Muy bueno el post, pero tengo una pregunta y no se si me puedes echar una mano.
Te cuento el caso, tengo un par de archivos con la extensión .inc que incluyen ciertas clases en php que no quiero se que muestren directamente al poner la url en el navegador, pero que si quiero que se permita el acceso desde una página php alojada en otro servidor. De echo solo se debería poder acceder desde esa página.
Para que te hagas una idea imaginemos que en el servidor A tengo esto:
lo que intento hacer es que este include remoto funcione, pero que sin embargo, si alguien teclea directmente en el navegador la dirección http://www.servidorb.com/miclase.inc, no muestre el contenido del archivo miclase.inc.
Gracias de antemano por tu tiempo.
Lo más fácil ahí es controlarlo desde PHP.
Muy burdamente podrías hacer:
< ?php
if (!defined('LOCAL_INCLUDE') && $_SERVER['REMOTE_ADDR'] != '1.2.3.4') {
die();
}
?>
Donde 1.2.3.4 sería la IP del servidor que sí puede acceder al include. Y LOCAL_INCLUDE sería una constante que deberías tener definida localmente para poder incluir el archivo en forma local.
Gracias por la respuesta, pero no creo que funcionase, piensa que lo que pretendo proteger es un archivo .inc, que no debe ejecutarse en el servidor donde está alojado (por eso le he puesto la extensión inc en lugar de la de php). Si no hay ejecución no hay forma de protegerlo vía php.
Ah, ok, entonces sí podés hacerlo con mod_rewrite con algo más o menos así:
RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^1\.2\.3\.4$
RewriteRule /miclase.inc /error.html [L]
Gracias elbarto!
Hoy mismo lo pruebo y te cuento que tal fue.
Saludos.
Gracias por tu ayuda elbarto,
Al final he optado por una solución relativamente simple que te dejo aquí por si a alguien más le sirve de cara a protejer sus proyectos PHP:
Dejo las clases en un directorio de la máquina A y en ese directorio creo un .htaccess con este contenido:
ErrorDocument 403 http://www.sitioredireccion.com
Order deny,allow
Deny from all
Allow from _dirección_ip_del_servidor_b
(Aquí tengo una pregunta más, ¿¿Se podría configurar el Allow from, para que solo admitiese peticiones de una determinada página web??)
Las clases guardadas en el servidor A se guardarán ofuscadas/codificadas para añadir un nivel de dificultad adicional.
El servidor B se alojarán los require con la siguiente forma:
require(“http://www.servidor_b.com/directorio_clases/clasex.inc”);
Evidentemente este método NO es ni mucho menos, un sistema infalible de protección, pero si puede servir para complicar un poco la vida a aquellos que quieran piratear el código PHP mediante la distribución del mismo en diferentes servidores. Si a esto le añadimos que las tablas de las bases de datos pueden estar en un tercer servidor entonces subiríamos un ‘escalón’ más en la capacidad de protección de nuestros proyectos PHP, frete a las copias malintencionadas que algunas empresas de hosting podrían llegar a hacer.
Una vez más gracias por tu ayuda elbarto