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:
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