Instalar APF (Advanced Policy Firewall) en sistema Unix

En esta entrada vamos a proteger nuestro sistema Unix con APF (Advanced Policy Firewall).

APF es un sistema de Firewall basado en IPtables, con la peculiaridad de que su manejo e instalación es extremadamente sencilla. Próximamente explicaremos también como instalar BFD, un detector de ataques de fuerza bruta, que unido a APF forman un excelente nivel de seguridad en el servidor, pues trabajan de forma conjunta.

Comenzamos con la instalación de APF:

cd /root/descargas (o la carpeta en la que guardes tus sources)
wget http://rfxnetworks.com/downloads/apf-current.tar.gz
tar -zxf apf-current.tar.gz
cd apf-0.*
./install.sh

Una vez instalado nos indicará las distintas rutas de ficheros de configuración y ejecutables:

Installation Details:
Install path: /etc/apf/
Config path: /etc/apf/conf.apf
Executable path: /usr/local/sbin/apf
AntiDos install path: /etc/apf/ad/
AntiDos config path: /etc/apf/ad/conf.antidos
DShield Client Parser: /etc/apf/extras/dshield/

Comenzamos a configurar APF, abirmos el fichero de configuración con nuestro editor favorito, estas son las opciones principales a configurar, recordad leer los comentarios en el fichero de configuración y en los README:

vi /etc/apf/conf.apf

Desactivamos/activamos el cron que desactiva el firewall cada 5 minutos, es útil activarlo mientras estemos de pruebas, pero aseguraos de dejarlo en 0 cuando el server entre en producción:

# Set firewall cronjob (devel mode)
# 1 = enabled / 0 = disabled
DEVEL_MODE=»1″

Interfaces de red que APF va a rastrear su tráfico, ponemos la interfaz que salga a Internet, en este caso es la eth1:

# Untrusted Network interface(s); all traffic on defined interface will be
# subject to all firewall rules. This should be your internet exposed
# interfaces. Only one interface is accepted for each value.
# NOTE: The interfacing structure is being worked towards support of MASQ/NAT
IFACE_IN=»eth1″
IFACE_OUT=»eth1″

Por otro lado, podemos configurar que ciertas interfaces no sean rastreadas por el firewall, pueden ser interfaces de tráfico local:

# Trusted Network interface(s); all traffic on defined interface(s) will by-pass
# ALL firewall rules, format is white space or comma seperated list.
IFACE_TRUSTED=»eth0″

Y para terminar la configuración básica, la parte más importante, la sección de puertos, configurable dependiendo de los puertos abiertos necesarios para cada servidor:

Puertos de entrada TCP permitidos:

# Common ingress (inbound) TCP ports
IG_TCP_CPORTS=»21,25,80,110,443,465″

Puertos de entrada UDP permitidos:

# Common ingress (inbound) UDP ports
IG_UDP_CPORTS=»»

Puertos de entrada ICMP permitidos:

# Common ICMP (inbound) types
# ‘internals/icmp.types’ for type definition; ‘all’ is wildcard for any
IG_ICMP_TYPES=»3,5,11″

Después están las mismas opciones, pero para salida, configurar según los requerimientos de cada uno. Y recordad revisar todas las demás opciones para sacar el mayor partido a este excelente firewall.

Otros dos ficheros importantes a tener en cuenta son :

/etc/apf/deny_host.rules
/etc/apf/allow_host.rules

En estos ficheros podemos incluir ips, rangos y reglas a las que denegar acceso (deny_host.rules) o permitir(allow_host.rules) al servidor. Finalmente arrancamos APF:

/usr/local/sbin/apf -s

Fuente: rm-rf.es

Como actualizar a WordPress 2.7

Ya está aquí la nueva versión 2.7 de WordPress, viene con bastantes cambios de apariencia y funcionalidad a nivel de dashboard, os dejo un vídeo en el que se pueden observar todas estas novedades. La actualización es tán sencilla como las anteriores, puedes descargarlo y encontrar la guía de actualización/instalación en este enlace.

Expresiones Regulares – Las Bases

Expresiones Regulares – Las Bases

Introducción

Todos los programadores de perl han usado las expresiones regulares en algun momento, ya sea para verificar si alguna variable tiene un valor deseado, o para sustituir una palabra por otra. Pero aún así son contados los programadores que REALMENTE entiendes en su máxima extensión est gran creación: las expresiones regulares.

Las expresiones regulares existen en todos los lenguajes de programación desde JAVA,c y C++ hasta el PHP,Phyton y Perl. En todos la sintaxis son muy similares exceptuando ciertos cambios en algunos caracteres.

En este tutorial vamos a ver un poco de las expresiones regulares y lo que podemos lograr con ellas, este es una breve introducción a este mundo.
Demilitador de las expresiones

Un delimitador es lo que marca el principio y el fin de una expresion regular. El delimitador que más comunmente se usa es la diagonal ‘/’:

m//;

Sin embargo este delimitador lo podemos cambiar por el que se nos pegue la gana, ya sea por una letra o algun otro símbolo:

#Delimitador !
m!expresion!;

#Delimitador =
m=expresion=;

#Delimitador –
m-expresion-;

El operador m//Este operador también conocido como de cotejo, se utiliza para localizar alguna expresión dentro de una cadena de texto o string. Si la expresión es verdadera entonces se regresará un 1.

La regla es sumamente sencilla, debes de usar el mismo delimitador para abrir y cerrar la expresión regular, y este debe de ser de un sólo caractér.
NOTA: A veces el uso de caracteres delimitadores como el + pueden hacer que tu código se difícil de leer.

Normalmente este operador es utilizado para verificar que nuestra variable tenga cierto valor. Por ejemplo:

my $string = «Mi frase no muy larga»;

if($string =~ m/frase/){
print «Se encontró la palabra: frase.\n»;
}

Al ver este pequeño pedazo de código verás un símbolo extraño «=~». Este símbolo le dice a perl que evalue la siguiente expresión regular a verdadero, lo que significa que si el operador regresa un valor de 1 o verdadero se imprimirá el texto dentro del «if».

Pero que pasa si quisieramos hacerlo al revés, si quisieramos checar que alguna expresión NO estuviera dentro de alguna cadena:

my $string = «Mi frase no muy larga»;

if($string !~ m/jugo/){
print «No se encontró la palabra: jugo.\n»;
}

Aquí vemos como debido a que NO se encontró la palabra «jugo» el código dentro del «if» es ejecutado.
El operador s///

Este operador que tambiés es conocido como operador de sustitución, es utilizado para sustituir alguna cadena o expresión por otra. Por ejemplo:

my $string = «Hoy es Lunes»;

$string =~ s/Lunes/Martes/;

Al correr la siguiente expresión el valor final de «$string» será de: «Hoy es Martes».

La sintáxis de este operador, es que primero va la cadena o expresión que queremos que sea sustituido seguido por lo que queremos sustituirlo con.

Otro ejemplo de esto es:
$string = «El nombre de mi perro es: (nombre)»;

$string =~ s/\(nombre\)/Rocky/;

Si corres esta expresión te imaginaras que el resultado va a ser: «El nombre de mi perro es: Rocky».
El operador tr///

También conocidmo como el operador de traducción nos sirve para cambiar carácteres individuales por otros. La diferencia que tienes con los otros operadores, es que este no lee variables dentro de la expresión.

my $string = «aparato»;

$string =~ tr/a/e/;

Al ejecutar este expresión el resultado va a ser: «eperete».
Opciones de los operadores

Si alguna ves has visto expresiones regulares anteriormente, quizá te habrás dado cuenta que al final de ellas luego hay letras. Estas letras son «opciones» que le indica a perl como interpretar la expresión.

Hay varias opciones que se pueden usar, pero como esto es sólo una introducción sólo voy a poner las más usuales:

Opcion: i Este operador le dice a perl que ignore el uso de mayúscula y minúsculas. Por ejemplo:

my $string = «Palabra»;

#La siguiente expresión da falso debido a que hay una mayúscula
print «Verdadero» if $string =~ m/palabra/;

#La siguiente expresión da verdadero debido a que le decimos a perl que no nos importan las mayúsculas
print «Verdadero» if $string =~ m/palabra/i;

Opción: g

Esta opción le dice a perl que repita la sustitución durante todas las ocurrencias de la cadena. Por ejemplo:

my $string = «Lunes y otro Lunes»;

#Solo hará el remplazo al primer Lunes
$string =~ s/Lunes/Martes/;

#Hará el remplazo al todos los Lunes
$string =~ s/Lunes/Martes/g;

Opción: m

Este opción le dice a perl que la cadena que se esta evaluando es de varias lineas. Para dar más velocidad al proceso, perl hace una optimización como si estuviera evaluando una sola linea. Así que si tu cadena tiene varios «\n», tienes que usar esta opcion para quitar esta optimización.
Meta-Secuencias

Dentro de nuestras expresiones podemos usar lo que se llaman «Meta-Secuencia», estos son caracteres que simbolizan cosas específicas y aquí esta una lista de las más usadas.

Meta: \b

Esta meta-secuencia se usa para marcar un fin de palabra. Por ejemplo:

$string = «Mi palabara es esta.»;

#Debido a que en esta expresión se usar el fin de palabra el resultado es verdadero por «es» y no por «esta».
print «OK» if $string =~ «\bes\b»;

Meta: \B

El contrario de la meta-secuencia anterior, esto simboliza un fin de no-palabra.

Meta: \d

Cualquier dígito (0-9). Por ejemplo:
my $string = «Numeros 12345»;

Cualquier espacio en blanco. Por ejemplo:
my $string = «Mis palabras»;

print «Hay números.» if $string =~ m/\d/;

Meta: \D

Simboliza cualquier no-digito.

Meta: \s

#Quitamos todos los espacios en blanco
$string =~ s/\s//g;

Meta: \S

Cualquier no-espacio.

Meta: \t

Cualquier tabulador.

Meta: \u

Cambia el siguiente carácter a mayúscula.

Meta: \U

Cambia los carácteres que siguen a mayúscula hasta encontrar un \E.

Meta: \l

Cambia el caracter que sigue por minúscula.

Meta: \L

Cambia los caracteres siguientes a minúsculas hasta encontrar un \E.

Meta: \w

Meta-secuencia para todos los caracteres de palabra, es decir todos los caracteres alfa-númericos y el guíon. Por ejemplo:
$string = ‘$%&·’;

print «No hay palabras» if $string !~ m/\w/;

Meta: \W

Todos los caracteres de no-palabra.
Notas Finales

Con este tutorial ya hechamos un vistazo muy amplio al mundo de las expresiones regulares, aunque aún faltan varios temas para poder manejar totalmente las expresiones regulares, pero ya será tema de otro tutorial.

mod_rewrite: Guía Básica para reescribir URLs

Hoy en día la posición en los buscadores es un factor importante en el éxito de un sitio web. También se sabe que a los buscadores no le atraen mucho los sitios dinámicos, es decir, aquellos que cambian su contenido dependiendo de diversos factores.

Por ejemplo, la mayoria de foros están en PHP por lo que los urls para navegar el foro son parecidos a esto:

http://tusitio.com/foro/viewforum.php?f=3

Y aunque los bots de los buscadores lo pueden leer e indexar en su base de datos, si ponen un penalti por ser un url dinámico. Para solucionar esto, si eres un visitante o un robot, el url que verás será:

http://tusitio.com/foro/forum-3.html

Si pruebas ambos urls verás que muestra el mismo contenido. Podrás pensar que son dos páginas distintas, pero no es así, el segundo url, el que simula una página estática, es convertido detrás de las cortinas para llamar a la página real. Así es, en mi servidor no existe un archivo forum-3.html.

En este artículo les voy a mostrar como lograr esto.

Una solución elegante

Quizá estarán pensando que todo esto es un producto de magia, pero realmente es bastante sencillo lograrlo y los resultados serán muy buenos, pues no solamente podrán dar urls estáticos a los buscadores mejorando su posición, sino que también podrán dar urls amigables a sus usuarios.

Para poder lograr esto es necesario tener lo siguiente:

* Un servidor Apache versión 1.2 o mejor.
* Acceso para editar los archivos de configuración .htaccess, y quizá de ser necesario el http.conf.

Si están acostumbrados a usar servidores Apache, lo más seguro es que en algún momento hayan escuchado acerca del módulo mod_rewrite de Apache. Normalmente este módulo viene por default en las distribuciones de Apache pero en sistemas *nix puede que haya sido compilado sin este módulo.

Para poder usar este módulo primero lo tenemos que activar. En caso de que no tengas el módulo activado tendrás que editar tu archivo http.conf y quitar el comentario de la línea que carga el módulo para que quede de la siguiente manera:

#LoadModule rewrite_module
modules/mod_rewrite.so
#AddModule mod_rewrite.c

Comprendiendo mod_rewrite

Es importante comprender lo que hace exactamente este módulo.

El mod_rewrite se ejecuta después de hacer un request en tu servidor y antes de ejecutar cualquier script. Lo que hace es que aplica un «filtro» configurado por uno sobres los urls y los rescribe detrás de las cortinas.

Por ejemplo, podrías tener un url inexistente como el siguiente:

http://www.tusitio.com/algo

Y entonces el mod_rewrite lo podría convertir a:

http://www.tusitio.com/cgi-bin/dir/aplicacion.cgi?categoria=algo

La conversión del url se hace por detrás por lo que el usuario no podrá ver nada de esto, sin embargo si verá el resultado que viene de la ejecución del url «real».

Es importante comprender que mod_rewrite NO puede ser usado para cambiar el URL que el usuario ve es la barra de Dirección de su navegador a menos que una redirección externa es invocada. Sin embargo una dirección externa expone finalmente el url dinámico, así que mod_rewrite hace una redirección interna.

También es importante comprender que mod_rewrite cambia la dirección del archivo y las variables del url pedido pero NO cambia en ningún momento el despliegue de las mismas.

Poniendo mod_rewrite en práctica

Muy bien, empecemos con lo bueno, para esto vamos a hacer un ejemplo práctico.

Digamos que tienes una tienda de ropa y que tus clientes pueden ver la ropa que tienes navegando por categoría y talla de la misma. Para esto tienes una aplicación que se llama de la siguiente manera:

http://tusitio.com/cgi-bin/aplicacion_ropa.cgi?tipo=playeras&sexo=femenino&talla=chica

No es para nada bonito el url, por lo que queremos que nuestros clientes puedan acceder de la siguiente manera:

http://tusitio.com/playeras/femenino/chica.htm

Como ves es más intuitivo y amigable.

Usando mod_rewrite no es necesario hacer ningún cambio en tu aplicación, ni siquiera es necesario que crees los directorios ‘playeras/’ ni ‘playeras/femenino’, tampoco es necesario que hagas un archivo que se llame chica.htm.

Lo que vamos a hacer es que cuando algún usuario haga un request de ‘http://tusitio.com/playeras/femenino/chica.htm’ usaremos el mod_rewrite para filtrar y convertir el url a ‘http://tusitio.com/cgi-bin/aplicacion_ropa.cgi?tipo=playeras&sexo=femenino&talla=chica’, pero todo esto detrás de las cortinas, usando la redirección interna como habíamos dicho.

Ya que estemos seguros que tenemos el mod_rewrite instalado y activo, vamos a crear un nuevo archivo de configuración .htaccess.

Dentro de nuestro .htaccess vamos a inicializar el módulo mod_rewrite:

RewriteEngine On

Ya que tenemos esto, tenemos que configurar las reglas o filtros que vamos a usar. Cada uno deberá de ir en una nueva línea y podemos tener tantos como nosotros queramos y necesitemos.

Entonces vamos a crear nuestro filtro que ser verá así:

RewriteRule ^playeras/femenino/chica.htm cgi-bin/aplicacion_ropa.cgi?tipo=playeras&sexo=femenino&talla=chica [L,NC]

Comprendamos nuestra línea del filtro. El filtro está conformado por 4 elementos, cada uno separado por un espacio en blanco.

El primer elemento es:

RewriteRule

Aquí indicamos que estamos creando una nueva regla o filtro para la máquina de mod_rewrite. El segundo elemento es:

^playeras/femenino/chica.htm

En este caso es el url que estamos buscando. Es importante que tengamos en cuenta que siempre debemos de usar los directorio relativos, es decir, no debemos de poner el dominio de nuestro sitio, el mod_rewrite lo pondrá por nosotros.

La tercera parte es el nuevo url al cual queremos redirigir, también la dirección debe de estar relativa, mod_rewrite pondrá por nosotros el dominio de nuestro sitio.

cgi-bin/aplicacion_ropa.cgi?tipo=playeras&sexo=femenino&talla=chica

NOTA: No podemos usar el mod_rewrite para hacer una redirección interna a un url que no se encuentre dentro de nuestro dominio.

La última parte es opcional y son flags que regulan el comportamiento del mod_rewrite.

[L,NC]

En las siguientes secciones veremos más detalles acerca de los flags, pero podemos decir que con los flags L y NC le decimos al mod_rewrite que sea la última regla que cheque si coincide y que no haga caso a las minúsculas y mayúsculas.

Más poder a nuestro mod_rewrite

El ejemplo anterior es de gran ayuda, vimos como podemos convertir un url dinámico en estático en cuestión de minutos, pero hay un pequeño problema.

Lo más seguro es que nuestra tienda de ropa no venda puras playeras chicas, ni tampoco puras de mujer, y lo más seguro es que venda más productos que puras playeras, debe de haber pantalones, chamarras, shorts, camisas, vestidos, etc, etc.

Hacer una nueva regla por cada producto y por cada tamaño será un verdadero dolor de cabeza, y aparte cada ves que queramos poner una nueva línea de productos en la tienda tendremos que modificar nuestro .htaccess.

Pues bueno, con mod_rewrite podemos evitar eso, pues aún no hemos visto la parte más poderosa.

En el último ejemplo hicimos un filtro bastante sencillo:

RewriteEngine On
RewriteRule ^playeras/femenino/chica.htm cgi-bin/aplicacion_ropa.cgi?tipo=playeras&sexo=femenino&talla=chica [L,NC]

Pero también quisiéramos que los siguientes urls lo redirija al lugar correcto:

http://tusitio.com/pantalones/masculino/32.htm
http://tusitio.com/vestidos/femenino/mediano.htm
http://tusitio.com/shorts/infantil/12.htm

Si vemos, todos los urls tiene una misma sintaxis, el primer directorio sería la línea de ropa (pantalones,vestidos,shorts,etc), el subdirectorio sería el departamento (masculino,femenino,infantil,etc) y el archivo html sería la talla (32.htm,mediano.html,12.htm).

mod_rewrite nos permite usar expresiones regulares dentro de nuestros filtros, de esta manera podemos realizar filtros más poderosos.

Las expresiones regulares nos brindan un set de reglas que podemos usar para comprobar valores arbitrarios como en este caso. Sabemos que el url vendrá en una misma sintaxis pero tendrá diferentes valores, usando las expresiones regulares podemos capturar y comprobar esos valores.

Veamos la expresión regular que usaríamos en este caso para hacer lo que queremos:

^([a-zA-Z]+)/([a-zA-Z]+)/([a-zA-Z0-9]+).htm$

Expliquemos un poco nuestra expresión.

El ^ incial denota inicio de línea, significa que solamente será válida la regla si se cumple iniciando la línea.

Los paréntesis ( ) los usamos para capturar el valor, en este caso así lo queremos pues después tendremos que usarlos para enviárselos a nuestro CGI de la aplicación.

Los [ ] los usamos para asignar un campo de caracteres. Los campos de caracteres los podemos usar cuando queremos checar que ciertos caracteres estén o no estén. En la primera parte que será de la línea de ropa, sabemos que solamente vendrán letras del alfabeto, por lo que solamente queremos de la a-z y de la A-Z, en minúsculas y mayúsculas. Lo mismo en la segunda parte, pero ya en la tercera parte si puede haber números por ejemplo en 32.htm, por lo que tenemos que poner también el 0-9.

El signo de + después del cierre del campo de carácter, significa que debe de haber por lo menos uno o más de los caracteres que queremos.

Luego tenemos la separación con las diagonales ‘/’ que están fuera de los paréntesis pues queremos capturar solamente ‘pantalones’ y no ‘pantalones/’.

Al final también dejamos el .htm fuera de los paréntesis pues no lo queremos usar, y terminamos con $ que simboliza final de línea.

Así ya tenemos nuestros valores capturados que ahora podremos usar en el url para llamar al CGI de nuestra aplicación:

cgi-bin/aplicacion_ropa.cgi?tipo=$1&sexo=$2&talla=$3

Vemos como los valores los sustituimos por $1, $2, $3 que a su vez serán sustituidos por mod_rewrite con los valores que capturamos en nuestros paréntesis.

Cada paréntesis captura en una nueva variable y lo hacen en orden, así que van tomando $1, $2, $3, $4.. así hasta lo que se necesite.

Así que finalmente nuestra regla se verá de la siguiente manera:

RewriteEngine On
RewriteRule ^([a-zA-Z]+)/([a-zA-Z]+)/([a-zA-Z0-9]+).htm$ cgi-bin/aplicacion_ropa.cgi?tipo=$1&sexo=$2&talla=$3 [L,NC]

Así si llamamos a los siguientes urls:

http://tusitio.com/pantalones/masculino/32.htm
http://tusitio.com/vestidos/femenino/mediano.htm
http://tusitio.com/shorts/infantil/12.htm

Serán redireccionados internamente a:

http://tusitio.com/cgi-bin/aplicacion_ropa.cgi?tipo=pantalones&sexo=masculino&talla=32
http://tusitio.com/cgi-bin/aplicacion_ropa.cgi?tipo=vestidos&sexo=femenino&talla=mediano
http://tusitio.com/cgi-bin/aplicacion_ropa.cgi?tipo=shorts&sexo=infantil&talla=12

Así de la nada, tenemos una lista infinita de páginas estáticas fáciles de navegar por nuestros usuarios.

Tomándole la medida a mod_rewrite

Usar mod_rewrite es sumamente sencillo, quizá lo más difícil podría ser aprender a usar las expresiones regulares y los flags que podemos usar para controlar el comportamiento del módulo.

Sin embargo ambas son muy intuitivas y con un poco de uso y de estar jugando y probando con ellas, les tomarás la práctica inmediatamente.

Dave Child hizo un PDF con un «acordeón» que enlista las expresiones regulares y flags que podemos usar en el mod_rewrite. Les recomiendo que descarguen el PDF con la lista y lo tengan a la mano en el momento de crear sus filtros:
http://www.ilovejackdaniels.com/mod_rewrite_cheat_sheet.pdf

Cuando hagas tus primeras pruebas con el mod_rewrite, ten cuidado y si puedes has las pruebas con un servidor Apache que no esté en vivo, pues si tienes algún error de sintaxis al momento de crear tus filtros, verás un error 500 en todo tu sitio, evitando que tus usuarios puedan acceder a él.

Manual básico de Apache mod_rewrite

Tal como dice en la documentación de PHP, el módulo mod_rewrite es la auténtica navaja suiza de la manipulación de URLs.
Esta librería nos permite hacer desde simples redirecciones entre páginas a complejas reescrituras de URLs de nuestros sitios web. Para su utilización es recomendable tener conocimientos básicos en expresiones regulares.

Redirección básica:

Imaginemos la siguiente situación. Hemos creado una página web llamada lista.html pero queremos que los visitantes que escriban listado.html o directorio.html vean igualmente la página lista.html. Se presentan dos alternativas:

a) La solución cutre. Crear las páginas directorio y listado y dentro de ellas hacer una redirección con Javascript al estilo location.href="lista.html".

b) La solución ideal. Hacer una redirección mediante mod_rewrite especificando unas sencillas instrucciones en el famoso archivo .htaccess que se debe guardar en la misma carpeta donde se aloja lista.html. El servidor Apache traducirá ‘listado’ y ‘directorio’ por ‘lista’ sin tener que crear dichas páginas y su correspondiente redirección.


RewriteEngine on
RewriteRule ^(listado|directorio).html$ lista.html [R]

Básicamente, la sintaxis es:
RewriteRule patron sustituto [opciones]

[opciones]
r -> Mensaje Forbiden 403.
L -> Last rule, si tiene exito no ejecutar las siguientes reglas.
R[=code] -> Redirección.
NC -> No case(no distingue mayúsculas de minúsculas).

Explicación:
– “^(listado|directorio)”: nombre de URL que empiece por listado o directorio.
– “.html$”: que termine en “.html”.

Pasar de dirección estática a dirección dinámica:


RewriteEngine on
RewriteRule ^colores/([0-9]+)/([0-9]+)/([0-9]+).php$ colores.php?red=$1&green=$2&blue=$3

Donde ([0-9]+)/ significa 1 o más caracteres numéricos seguido de una barra.

Con esta regla conseguiríamos pasar de una URL desagradable como:

colores.php?red=50&green=20&blue=100

a una URL mucho más elegante:

colores/50/20/100.php

Hotlinking:

O cómo evitar que nos roben contenidos y ancho de banda linkando directamente nuestros recursos desde otros sitios web.


RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?midominio.com/.*$ [NC]
RewriteRule \.(gif|jpg|png)$ - [F,L]

Explicación:
– El signo ‘!’ significa negación, con lo que decimos que si el REFERER es diferente de nuestro dominio no permitimos enlazar archivos gif, jpg o png.
– (www\.)? indica que puede o no haber ‘www.’ en el nombre de nuestro dominio.
– El signo ‘-’ hará que no redirija a la vez que [F] hará que se muestre un mensaje de error. Normalmente se redirige a otra imagen de advertencia de que se está haciendo hotlinking, pero eso también nos hace perder ancho de banda.
– HTTP_REERER es una variable del servidor que nos dice el valor de la URL que solicita el recurso de nuestro servidor.