> Manuales > Taller de ASP

Es un script ASP, bastante seguro, que crea una cookie para evitar descargas desde otros servidores.

Existen servidores de hosting como Geocities, Fortunecity, entre otros, que no permiten la descarga externa de archivos. Es decir que si un usuario intenta descargar un archivo hospedado en Geocities cuyo enlace se encuentra en i(España), por ejemplo, no podrá hacerlo.

Pero ¿Qué sucede si nuestro servidor no restringe esta posibilidad? Y sí. Obvio. Podríamos sugerirle que lo hiciera. Pero mientras tanto ... ¿Qué podemos hacer?

 

Existe una solución aproximada si trabajamos con ASP, cookies e incluso puede mejorarse si a esto le agregamos el uso de JavaScript.

Hay que tener en cuenta, que esta "solución aproximada" no es del todo segura. Si nos encontramos con un WebRobaMaster medianamente astuto (y sino lo es, con ganas de trabajar demasiado), podría llegar a "burlar" dicha seguridad (aunque no es del todo frecuente).

 

El secreto está en crear una cookie en el ordenador del usuario y leerla para la descarga del archivo.

 

Vamos a explicar esto un poco mejor y con ejemplos.

Lo primero que debemos hacer, es crear una base de datos con nuestros archivos. Además que esto nos ayuda a tener un sitio más profesional y de fácil actualización, nos ayudará para proteger nuestros archivos.

Esta base de datos, deberá contener la url exacta de cada archivo.

 

Veamos un ejemplo de una posible base de datos:

 

En este ejemplo, tenemos una tabla a la que llamamos kar que incluirá la base de datos de todos los archivos *.kar (karaoke) para descargar en nuestro sitio.

Los campos:

id > campo autonumérico: genera u número único para cada archivo

titulo > será el título de la canción

artista > el artista o compositor de la obra

url > la ruta completa del archivo

 

Imaginamos entonces que esta tabla tiene X cantidad de registros. Supongamos que dos de ellos contengan los siguientes datos:

 

id 12

titulo 50 martillazos

artista Claudia Puyó

url KAR74/c_puyo/50_martillazos.kar

 

id 13

titulo Desert Song

artista Def Leppard

url KAR74/def_leppard/desert_song.kar

 

Pues bien. Lo primero que debemos hacer es crear una página ASP en la que se muestre el listado de los archivos. Hasta aquí, todo debe hacerse normalmente. Lo que nos interesa a nosotros es la URL que indicaremos para la descarga.

Supongamos que la página donde se muestra el listado de archivos se llama muestra_archivos.asp

En ella, debemos hacer que como url de descarga, figure otra página ASP, que será la que verifique las cookies que crearemos en  muestra_archivos.asp  y redireccione automáticamente al archivo. Esta página que comprobará dichos valores, la llamaremos comprueba.asp.

Entonces, volviendo a muestra_archivos.asp colocaremos el enlace de descarga de "50 martillazos de Claudia Puyó", de esta forma:

 

<a href="comprueba.asp?id=12">

donde 12 será el ID correspondiente al archivo. Por ejemplo <%=RS("id")%>

 

Nos quedará algo como esto:

50 Martillazos (Claudia Puyó) Bajar

Desert Song (Def Leppard) Bajar

 

Bien. El segundo paso entonces, será crear una cookie en la página muestra_archivos.asp. Una forma sencilla de hacerlo (aunque como dije al principio, puede descubrirse con un poco de astucia), puede ser esta:

Creamos una cookie con un valor absoluto:

<% response.cookies("Nombre_de_la_cookie")="valor de la cookie" %>

<% response.cookies("Nombre_de_la_cookie").Expires=Date+1 %>

 

Donde Nombre_de_la_cookie será ArchKar y valor autorizado. El código entonces quedará así:

 

<% response.cookies("ArchKar")="autorizado" %>

<% response.cookies("ArchKar").Expires=Date+1 %>

 

Nótese que este código debe ir al comienzo de la página muestra_archivos.asp.

Esto, provocará que si el usuario ingresa a nuestra página muestra_archivos.asp se le creará esta cookie. Pero, si jamás ingresa, obviamente, la cookie no se creará.

 

Pasemos entonces a la página de descarga del archivo, comprueba.asp.

Esta página tendrá como primer función, comprobar si la cookie ArchKar existe y si su valor es autorizado.

<% ArchKar = request.cookies("ArchKar")

if ArchKar = "autorizado" then

ArchKar = true

end if

%>

Este código nos está diciendo que si ArchKar tiene como valor autorizado, ArchKar será igual a true (verdadero).

 

El siguiente paso, será establecer que sucede si ArchKar es distinto a true. Es decir, si ArchKar no tiene valor "autorizado" o su valor es nulo o directamente no existe.

<%

if ArchKar <> true then

response.redirect "error.htm"

%>

Si ArchKar es distinto que true, enviar al usuario a la página error.htm (esta página puede contener un mensaje del tipo "El archivo no puede ser descargado desde un servidor externo").

 

Ahora solo bastará indicar que hacer si el valor de ArchKar es igual a true. Lo que haremos, será descargar el archivo automáticamente.

<%

else

idkar = request.querystring("id")

 

'abrimos la base de datos y creamos el recordset y hacemos la consulta

sqltxt="select * from kar where id="&idkar
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("archivos.mdb"))

set rs=createobject("ADODB.Recordset")

rs.open sqltxt,conn

url = rs("url")

response.redirect url

rs.close

end if

%>

Entonces, si ArchKar no es distinto a true (es decir, que es igual a true), redireccionamos al usuario hacia el archivo en cuestión.

 

Síntesis del proyecto:

  1. Base de datos

    1. Tabla: kar

    2. Campos requeridos

      • id autonumérico (clave única)

      • url texto > ruta completa de la descarga del archivo

    3. Campos adicionales: serán los referentes a las distintas características del archivo y variarán según las necesidades de cada caso.

       

  2. mostrar_archivos.asp

    Página en la cual se muestra el listado de archivos y se crean las cookies

    1. Código Creación de cookies

      <% response.cookies("ArchKar")="autorizado" %>

      <% response.cookies("ArchKar").Expires=Date+1 %>

    2. Enlace de descarga

      <a href="comprueba.asp?id=<%=rs("id")%>">

       

  3. comprueba.asp

    <%

    ArchKar = request.cookies("ArchKar")

    if ArchKar = "autorizado" then

    ArchKar = true

    end if

    if ArchKar <> true then

    response.redirect "error.htm"

    else

    idkar = request.querystring("id")

    sqltxt="select * from kar where id="&idkar
    Set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("archivos.mdb"))

    set rs=createobject("ADODB.Recordset")

    rs.open sqltxt,conn

    url = rs("url")

    response.redirect url

    rs.close

    end if

    %>

Consejos finales:

Mucho puede mejorarse esta rutina. Desde buscar asignar a la cookie valores difíciles de entender ("autorizado" es facil de entender para quien examine la cookie en su ordenador, pero si tal le asignamos un valor tipo "gafdsrs2454dfhgyr", no le dirá mucho a quien lo lea y seguramente no sepa de que se trate). Aún mas puede mejorarse, si el nombre de la cookie, estuviese destinado a distraer la atención, por ejemplo, si la cookie se llamara en ves de ArchKar, publicidad ¿Quien podría imaginarse el verdadero objetivo para el cual fue creada?

Y si aún, queremos evitar que un WebRobaMaster, se tome el trabajo de "hormiga" de parar el explorador cada vez que desde nuestro sitio, sea redireccionando al archivo, para poder copiar (en caso de descargas lentas) la dirección url verdadera del archivo, lo que podemos hacer es agregar un script al primer enlace de descarga, indicando que éste se abra en una ventana sin la barra de direcciones y sin la barra de estado.

Son muchas las posibilidades de mejorar la seguridad de esta rutina y sobre todo la de nuestro sitio.

 

Por experiencia propia, puedo asegurar que más de 10.000 archivos de mi sitio, quedaron protegidos de descargas externas, gracias a este método.

Eugenia Bahit

Analista Programadora LAMP y Scrum Coach

Manual