Cómo restringir
el acceso a páginas web
Algunos usuarios, después de crear sus páginas web, no saben cómo hacer para
restringir el acceso a alguna de ellas. A menudo desearían proteger documentos
de su web, de manera que sólo sean accesibles para personas autorizadas, bien
porque hayan pagado para ello o bien porque hayan seguido un proceso de
registro, pero carecen de permisos en el servidor o conocimientos para hacerlo.
En este artículo se da respuesta a esta necesidad, presentándose diversas
tecnologías Web para proteger páginas de forma sencilla.
1. Introducción
Por medio del control de acceso se limita quién puede acceder a qué datos
dentro de un servidor. La primera etapa de un control de acceso correcto
consiste en identificar a la persona que desea acceder a un recurso
determinado. Esta identificación se conoce como autenticación. Existen muchas
técnicas para asegurarse de la identidad de un usuario: su dirección IP o
nombre de máquina desde la que se conecta, un nombre y contraseña, un
certificado digital personal, una llave hardware, etc. Por desgracia, son
muchos los creadores de páginas web que no disponen de privilegios en el
servidor para utilizar estas técnicas sofisticadas de autenticación, por lo que
deben buscar caminos alternativos que, sin ser tan seguros, les permitan al
menos proteger mínimamente su trabajo. En este artículo se explican desde un
punto de vista práctico varias formas de restringir el acceso a ciertas páginas
por medio de Java, CGI, ASP y JavaScript, todas ellas al alcance de cualquier
creador de páginas web, útiles en diversas plataformas, Unix o NT, utilizando
en todos los casos herramientas gratuitas y de fácil obtención.
2. La clave está en el nombre
Cuando no se puede acceder a la configuración del servidor para implantar
técnicas de control de acceso robusto, no queda más remedio que basarse en el
secreto del nombre del fichero o ficheros que se desea proteger. Por nombre se
entiende el camino o URL completo que localiza al fichero en el servidor Web:
máquina, directorio y nombre del documento. Por lo tanto, bastará con mantener
en secreto cualquier elemento de ese camino completo para asegurar una
protección relativa del fichero. Así pues, la parte del nombre que permanezca
secreta constituirá la clave de acceso.
La parte del nombre que permanezca secreta constituirá la clave de acceso
Por supuesto, este tipo de protección basada en el cliente, no en el servidor,
no puede considerarse como un método verdaderamente seguro y nunca se deberá
utilizar para proteger documentos críticos de una organización o compañía. No
obstante, para proteger de la mirada de fisgones casuales ciertas áreas o
ficheros en páginas personales o en un pequeño sitio web, estos métodos ofrecen
unos resultados excelentes.
La forma más inmediata de restringir el acceso a un fichero de un web consiste
en dejarlo en algún directorio, sin enlazarlo desde ninguna otra página de ese
web ni de ningún otro.
Supóngase que el documento cuyo acceso se desea restringir se llama
secretitos.doc y se encuentra albergado en la máquina www.confidencial.es. Si no se
dispone de ningún enlace al mismo desde ninguna otra página, basta con
almacenarlo simplemente en el directorio raíz, de manera que su URL sea: www.confidencial.es/secretitos.doc.
para que sólo la persona que conozca a priori su nombre y localización pueda
recuperarlo. Para ello, claro está, es condición indispensable impedir el
listado de directorios, como se describe en la sección 7.1. Por consiguiente,
bastaría con proporcionar el nombre y camino del fichero a los usuarios a los
que se quiere garantizar el acceso para que sólo ellos fueran capaces de
recuperarlo. Obviamente, el fichero protegido se puede depositar en cualquier
otro subdirectorio.
Con el fin de proporcionar una interfaz más profesional y flexible, será
necesario escribir una pequeña aplicación en algún lenguaje como Java o
JavaScript o bien en CGI o ASP, por citar algunas posibles tecnologías. Los
requisitos que se impondrán a esta aplicación son que presente una ventana en
la que se solicite un nombre de usuario y una contraseña, o por lo menos una
contraseña, para acceder a los contenidos restringidos. También se le puede
exigir opcionalmente que se almacenen esos datos, de manera que el usuario no
tenga que introducirlos cada vez que consulta el documento protegido.
En las secciones siguientes, se verá cómo estos requisitos toman cuerpo,
utilizando para ello diversas tecnologías Web actuales.
3. Control de acceso en JavaScript
JavaScript es un lenguaje de programación desarrollado por Netscape Corporation
para permitir la ejecución de código dentro de las páginas en HTML. Microsoft
posee su propia versión, llamada Jscript. Gracias a los programas (llamados
guiones) escritos en este lenguaje, se pueden conseguir interesantes efectos en
las páginas web, comprobar la entrada de formularios, abrir y cerrar ventanas,
cambiar dinámicamente el aspecto y los contenidos de una página, y mucho más.
Basándose en la técnica de utilizar como clave de acceso el propio nombre del
fichero (o parte del mismo), existen muchas formas de proteger el acceso a las
páginas, que se traducirán en diferentes formas de esconder la clave dentro del
código en JavaScript. Aquí aparece la primera limitación inherente a los
métodos que utilizan este lenguaje, y es que el código original en JavaScript
se puede examinar sin más que editar el código fuente de la página web en la
cual está embebido. Por este motivo, no puede declararse la palabra clave
dentro del propio código, ya que quedaría visible para todo aquel que se
molestase en examinar el código fuente.
El método más sofisticado y seguro en JavaScript consiste en presentar una
ventana de petición de clave, clave que se corresponderá con el nombre del
fichero. En general, existirán por lo menos dos documentos:
• La página de entrada, en la que aparece el enlace a la página protegida.
• La página destino que se quiere proteger y cuyo nombre constituye la clave.
El código fuente en HTML de la página de entrada será algo como:
<SCRIPT language=“JavaScript”>
<!--
function protector() {
var clave = prompt(“Introduce la clave:”, ””); // pide la contraseña
var url = clave + “.html”; // crea un URL a partir de la contraseña
this.location.href = url; // esta es la línea más importante, que conduce al
documento protegido si la contraseña es correcta
}
// -->
</SCRIPT>
Por su parte, el enlace a la página pro- tegida pasará a tener el siguiente
aspecto:
Aquí encontrarás los <A HREF=“java-script: protector()”>documentos
secretos</A>.
Ahora bien, si se desea proteger muchas páginas, este esquema resulta
inadecuado, ya que el usuario se sentiría agobiado por la gran cantidad de
contraseñas que debería recordar (tantas como páginas protegidas). Para muchas
páginas protegidas, se vuelve más cómodo y eficiente proteger todos los
archivos de un directorio con una única clave, que consistirá en el nombre del
directorio donde se alojan. Ahora, el nombre del fichero es conocido, pero no
su localización. Así, el nuevo código en JavaScript quedaría como:
var url = clave + “/nombrefichero.html”;
De esta forma, para cambiar la clave de acceso a varios ficheros
simultáneamente no será necesario cambiarles el nombre a todos (no hay que
olvidar que la clave de acceso es el propio nombre del fichero), sino que
bastará con moverlos a todos a otro directorio distinto, cuyo nombre pasará a
ser la nueva clave. Es fácil observar que este esquema gana en eficacia si la
clave se ve comprometida, por ejemplo, porque alguien haya enlazado
directamente alguna de las páginas protegidas (v. sección 7.2).
La ventaja de este método reside en que se puede utilizar en cualquier tipo de
plataforma, Unix o NT, sin necesidad de poseer privilegios especiales en el
servidor. Por supuesto, funcionará correctamente en cualquier navegador que
soporte JavaScript y que no haya deshabi- litado su ejecución. No es necesario ningún
fichero adicional a la página HTML, ya que el código va embebido en la propia
página, por lo que su simplicidad es máxima. Además, cualquier editor de texto
sirve para escribir el programa y se visualiza en el propio navegador, por lo
que no se requiere software de desarrollo adicional. Se pueden encontrar el
código completo y páginas de demostración de los ejemplos de control de acceso
en JavaScript en www.iec.csic.es/criptonomicon/acceso/javascript.html.
4. Control de acceso en Java
Java es otro lenguaje completo de programación, desarrollado por Sun
Mi-crosystems. Lo que hace tan popular a Java es su capacidad de ejecutarse en
cualquier tipo de plataforma una vez compilado en bytecodes, lo que lo hace
especialmente indicado para su despliegue en Internet, donde coexisten todo
tipo de sistemas operativos y máquinas. Las applets son pequeños programas
escritos en Java que aparecen embebidos en las páginas web, como aparecen los
gráficos o el texto, pero con la capacidad de ejecutar acciones muy complejas,
como animar imágenes, establecer conexiones de red, presentar menús y cuadros
de diálogo para luego emprender acciones, etc.
En Java se puede elaborar un método de protección similar a lo explicado para
JavaScript, aunque mucho más sofisticado. Igualmente, se solicita la palabra
clave, que se corresponderá con el nombre del fichero que se desea proteger,
pero en esta ocasión a través de una applet de Ja- va actuando como filtro. El
código de la applet comprobará en primer lugar si existe esa página web
(correspondiente a la clave introducida por el usuario), para pasar después, en
caso afirmativo, a abrirla en la misma ventana desde la que se lanzó la applet,
en una nueva ventana o en un marco o frame.
En el siguiente cuadro se muestra un fragmento de código en Java que permite
controlar el acceso a una página. Básicamente, se repiten los pasos descritos
para JavaScript:
1. Leer la palabra clave introducida por el usuario.
2. Intentar abrir la página correspondiente al URL construido a partir de la
clave.
3. Si el URL no se corresponde con una página existente, se devolverá un
mensaje de error; en caso contrario, se transportará al usuario a la página
protegida.
void surfto()
{
if (t_password.getText().length()>0) {
try {
URL surftoURL = new URL ( root + t_password.getText( ) + ".html" );
t_password.setText("");
if ( !check_if_URL(surftoURL.toString())) {
surfto_error();
}
else {
getAppletContext().showDocument( surftoURL, "_self" );
}
}
catch (MalformedURLException e) { surfto_error();
}
catch (SecurityException e)
surfto_error();
}
catch (IOException e)
surfto_error();
}
}
}
El código completo con las funciones empleadas y la página de demostración se
pueden obtener en www.iec.csic.es/criptonomicon/acceso/java.html.
No hay que olvidar, como se discute en la sección 7.3, que no conviene incluir
la clave dentro del código, ya que es muy fácil obtenerlo a partir de los
ficheros compilados de clase, aunque a simple vista no lo parezca.
La riqueza del lenguaje Java permite crear interfaces de usuario muy
sofisticados.
Además, mediante una applet de Java se pueden gestionar otras características
del control de acceso, como registro de intentos de acceso fallidos, bases de
datos con nombres y claves de acceso para proteger distintas páginas de forma
flexible, etc.
Este tipo de protección resulta adecuado para aquellos que no dispongan más que
de la posibilidad de incluir páginas en HTML y ficheros del tipo .class
(utilizados para almacenar el código objeto de applets de Java), algo
generalmente consentido por todos los administradores Web.
La ventaja de este método es que se puede utilizar en cualquier tipo de
plataforma, Unix o NT, sin necesidad de poseer privilegios especiales en el
servidor. Por supuesto, funcionarán correctamente en cualquier navegador que
soporte Java y que no haya deshabilitado su ejecución.
Las herramientas para programar en Java, depurar código y visualizarlo se
pueden obtener gratuitamente del sitio Web de sus creadores en java.sun.com.
5. Control de acceso en ASP
Las Páginas Activas de Servidor (Active Server Pages) o ASP para abreviar,
representan el paradigma de la filosofía de Microsoft en su estrategia para
Internet. A diferencia de otros productos de Microsoft, como los controles
ActiveX o los guiones en VisualBasic (VBScript), las aplicaciones ASP se
procesan y ejecutan en el servidor y no en el cliente, siendo en este sentido
parecidas a las aplicaciones CGI, pero integrando otros servicios y
aplicaciones Microsoft, todo ello utilizando el lenguaje Visual Basic como
aglutinante.
El control de acceso mediante ASP (Active Server Pages) resulta especialmente
útil cuando se desea acceder a servicios como consultas a bases de datos,
búsquedas en catálogos o directorios de empresas u otro tipo de páginas
generadas al vuelo, es decir, páginas para las que no existe a priori un URL
asignado, ya que su contenido dependerá de la solicitud del usuario.
En el siguiente listado se muestra un ejemplo escrito en VBScript (dialecto de
Visual Basic, conceptualmente similar a JavaScript):
'Comprobar si el usuario es válido
usuario=Session(“usuario”)
Rechazado=False
'Si usuario está vacío es que todavía el usuario no ha intentado acceder (o lo
intentó sin éxito)
If IsEmpty(usuario) Or IsNull(usuario) Or usuario=”” Then
Intentado=False
'En ese caso, se le presenta la pantalla de autenticación
URL=Request.ServerVariables(“QUERY_STRING”)
If IsEmpty(URL) Or URL=”” Then
URL=”” ’por si acaso
Else
URL=”?” & URL
End If
URL=Request.ServerVariables(“SCRIPT_NAME”) & URL
’buscar la información de autenticación enviada a través del formulario
’se usa el método POST para no dejar rastro en el cache ni en los proxies
nombre=Request.Form(“nombre”)
clave=Request.Form(“clave”)
usuario=nombre&clave
If IsEmpty(usuario) Or IsNull(usuario) Or usuario=”” Then
Rechazado=True
Else
’Comprueba los datos del usuario
If nombre = “gon” And clave = “alv” Then
’Almacena la combinación usuario en una variable de Session
’Esto permite que en el futuro no necesite autenticarse de nuevo
Session(“usuario”)=usuario
Rechazado=False
Else
Intentado=True
Rechazado=True
End If
End If
End If
If Rechazado Then
If Intentado Then
Titulo=“La identificación ha fallado”
Else
Titulo=“Identifíquese, por favor”
End If
%>
<!--webbot bot=“Include” U-Include=“login.htm” TAG=“BODY” -->
</font><%
Response.End 'Terminar el procesamiento antes de pasar a la página protegida
End If
'...si no ha fallado la autenticación, aquí viene la página protegida
%>
Este texto (o acceso a base de datos o lo que sea) sólo se verá si el usuario
se ha autenticado con éxito.
Como se deduce del examen del código, la página anterior se genera al vuelo.
Primero se comprueba si el usuario ya se ha autenticado (información del objeto
Session). En caso afirmativo, se pasa directamente a presentar el contenido a
proteger: desde una página web convencional, con texto, gráficos, etc., o mejor
aún, algún tipo de servicio, como consulta a base de datos. En caso negativo,
se le presenta un página para que se autentique, a la que se le pasa
información dinámicamente. Cuando el usuario rellene el formulario con sus
datos y pulse el botón de enviar, se repetirá este proceso. A continuación se
muestra el fichero en HTML que debe incluirse en el código anterior, con el fin
de presentar la página de autenticación, en la que se solicita el nombre de
usuario y la clave de acceso:
<h1><%=Titulo%></h1>
<p>Va a acceder a un servicio restringido para el que es necesario que se
identifique</p>
<form action=“<%=URL%>” method=“POST”>
<table border=“0” width=“100%”>
<tr>
<td width=“15%”>Nombre de
usuario:</td>
<td width=“50%”><input type=“text” name = “nombre”
size=“12”></td>
</tr>
<tr>
<td width=“15%”>Clave de acceso:</td>
<td width=“50%”><input type=“password” name=“clave”
size=“12”></td>
</tr>
</table>
<p><input type=“submit” value=
“Entrar”> </p>
</form>
Listado 4. Página de autenticación en HTML (login.htm).
El código VBScript (lo que se encuentra entre los signos <% y %>) no
quedará al descubierto si se intenta ver el código fuente de la página, ya que
a diferencia de lo que ocurre con Java o JavaScript, en ASP el código se
ejecuta en el propio servidor y no en el cliente (ver sección 7.3). En
cualquier caso, incluso acceder directamente a la página login.htm resulta
inútil, ya que no ofrece ninguna pista acerca de qué hay dentro de la página
ASP a la que da acceso.
Para mayor comodidad, en vez de almacenar la información del usuario en una variable
de sesión, que desapare- ce entre sesiones consecutivas al cerrar el navegador,
se podría guardar en una cookie, de manera que estuviera accesible la próxima
vez que se visitase esa página, sin necesidad de pasar de nuevo por todo el
proceso de autenticación. No obstante, este enfoque presenta algunos
inconvenientes, como se describe en la sec. 7.4.
Este esquema presenta importantes ventajas frente a los dos métodos anteriores.
En primer lugar, la página protegi- da no puede enlazarse desde otras páginas
ni accederse directamente soslayando el proceso de autenticación (v. sec. 7.2).
Por otra parte, permite proteger no ya páginas, sino servicios, como una
consulta a una base de datos o búsquedas en un sitio Web.
Las páginas ASP se pueden escribir con cualquier editor de texto convencional,
aunque como contrapartida, es necesario que el administrador permita alojar en
el servidor páginas ASP, a lo cual muchos administradores pondrán pegas. Por
otro lado, esta tecnología sólo funciona en servidores Internet Information
Server de Microsoft y normalmente requerirá la instalación de las extensiones
de FrontPage.
Se pueden ver ejemplos completos de aplicaciones en ASP, con y sin cookies, en www.iec.csic.es/criptonomicon/acceso/asp.html.
6. Control de acceso en CGI
La interfaz de pasarela común (Common Gateway Interface, CGI) es un protocolo
genérico que permite extender drásticamente las capacidades de HTTP.
Los programas en CGI añaden funcionalidad al servidor Web, ya que le permiten
ejecutar cualquier programa, desde consultas a bases de datos, hasta envío de
correo y generación automática de páginas web.
En este caso, la técnica utilizada en su forma más simple consiste en servirse
de un guión o programa en CGI como filtro entre el usuario y la página que se
desea proteger, con el fin de evitar accesos no deseados. Esta aplicación CGI
debe alojarse en el directorio cgi-bin del servidor u otro directorio que el
administrador proporcione a tal efecto.
Como en los casos previamente analizados, se trata de leer una clave
introducida por el usuario y garantizar el acceso sólo si la clave es correcta.
En este caso, dado que el código fuente no se encuentra disponible para los
usuarios, bien porque el programa se compila, o bien porque, aunque siendo
interpretado, el servidor no permite su listado, resulta posible embeber la
clave dentro del código fuente, como se hace en el ejemplo. No obstante, en un
caso real, conviene hacerlo de forma cifrada. Una vez verificada la clave,
simplemente se transporta al usuario a la página de error si aquélla es
incorrecta, o a la página protegida, si fuera correcta. A continuación se
muestra un sencillo programa en C que serviría para restringir el acceso a una
página.
#define CLAVE “reservado”
#define URL_CORRECTO “http://www.iec.csic.es/criptonomicon”
#define URL_INCORRECTO “http://www.iec.csic.es/criptonomicon/ac-
ceso/error.html”
int main()
{
llist entries;
node * item;
read_cgi_input(&entries);
item = entries.head;
if ( strstr( item->entry.value, CLAVE ) != NULL )
printf( “Location: %s\n\n”, URL_CO- RRECTO );
else
printf( “Location: %s\n\n”, URL_IN- CORRECTO );
}
Ahora bien, puede resultar tedioso tener que introducir el nombre y la clave
cada vez que se quiere acceder a páginas protegidas en el sitio web. Para
evitar esta repetición, una posible solución consiste en pedir el nombre y la
clave una sola vez y almacenarlos en una cookie, de manera que a partir de ese
momento cada vez que se acceda a un servicio protegido, se compruebe la
información de autenticación leyendo la cookie. En la sección 7.4 se describen
los problemas que plantea este enfoque.
Por otro lado, dado que con CGI se pueden generar páginas al vuelo, al igual
que se hacía en ASP, se presentan interesantes posibilidades para soslayar el
problema del bookmarking (v. sección 7.2). Por ejemplo, supóngase que se desea
ofrecer una colección de fotos a aquellos que hayan pagado por verlas. Si las
fotos no se acceden directamente a través de un URL, sino por medio de un CGI,
se evita así que nadie pueda enlazarlas directamente. Si se combina esta
capacidad con el almacenamiento de la información de autenticación en una
cookie, se consigue que no sea necesario autenticarse para cada imagen descargada.
En el siguiente fragmento de código se muestra cómo se puede llevar a la
práctica esta forma de servir imágenes.
#define IMAGES /home/users/gonzalo/images/
// Se leen las cookies para ver si se le permite al usuario ver la imagen
num_cookies = parse_cookies( &cookies );
if ( num_cookies > 0 ) {
item = cookies.head;
while ( item != NULL ) {
if ( strstr( item->entry.name, “usuario” ) != NULL ) {
if ( strstr( item->entry.value, CLAVE ) )
autenticado = 1;
break;
}
item = item->next;
}
}
// Si la cookie contenía el nombre y clave correctos, se le deja acceder a la
foto
if ( autenticado ) {
// Se crea el URL completo del fichero que se quiere leer
strcpy( fichero, IMAGES );
strncat( fichero, sURL, 100 );
// Se intenta abrir el fichero
if ( ( f = fopen( fichero, “rb” ) ) == NULL ) {
printf ("Content-type: text/html\n\n");
printf( “Error, no se encontró el fichero <b>%s</b>", sURL );
return 1;
}
// Finalmente lo enviamos al cliente
envia_foto( f );
}
else
printf( “Location: %s\n\n”, URL_IN-CORRECTO );
En esta ocasión, los enlaces para saltar a una imagen pasarán a tener la
siguiente forma:
/cgi-bin/filtro.exe?nombredeimagen
Donde filtro.exe es el nombre del programa en CGI y nombredeimagen es el nombre
del fichero de la imagen que se desea ver. Obsérvese que no se incluye el
camino completo de la imagen, sino sólo el nombre de fichero. Es importante
notar que los ficheros con las imágenes pueden encontrarse en cualquier
posición del árbol de directorios del servidor, no necesariamente en el área de
documentos del servidor Web. En el código de ejemplo, la constante IMAGES
define la posición dentro de la estructura de directorios donde se encuentran
almacenadas las imágenes, no siendo accesible a través de la Web. De esta
forma, se consigue aislar completamente el lugar físico donde se guardan las
imágenes del área del servidor Web. En estas circunstancias, resulta
completamente imposible enlazar directamente a las imágenes, sin pasar antes
por el proceso de autenticación. Por supuesto, este método de servir ficheros
puede aplicarse no sólo a imágenes, sino también a otros documentos en formato
digital, resultando especialmente indicado para aquellos que deseen proteger
imágenes (jpg, gif, bmp, tiff), textos (html, txt), otros documentos (word,
pdf, ghostscript), sonido (wav, au, aiff, realaudio), animaciones (mpeg, avi,
quicktime), con la ventaja de que resultan imposible de enlazar directamente
desde otras páginas web (problema de los tres métodos anteriores), ya que el
objeto a proteger no se encuentra físicamente en el área de documentos del
sitio web.
Si se aprovechan completamente las posibilidades que ofrece la programación en
CGI, se pueden desarrollar esquemas de protección muy complejos, con ficheros
de control de acceso (ACF) que sirvan para especificar tanto autenticación de
usuario como control de acceso por dominios. Sin embargo, su complejidad los
sitúa fuera del alcance de este artículo. Los lenguajes más frecuentemente
utilizados para escribir aplicaciones en CGI son Perl y C/C++, que pueden encontrarse
gratuitamente en una gran variedad de plataformas.
El inconveniente que presentan es que, dado que una aplicación en CGI mal
diseñada podría permitir acceso total o parcial al servidor, muchos
administradores se muestran reacios a permitir a los usuarios que escriban sus
propios CGI para su inclusión en el sitio web. De hecho, muchos se negarán o no
ofrecerán esta posibilidad, por lo que se deberá recurrir en ese caso a alguno
de los métodos anteriormente descritos (v. secs. 3 y 4), que no dependen del
servidor.
Se pueden ver ejemplos completos de aplicaciones en CGI, con y sin cookies, así
como de protección de documentos, en www.iec.csic.es/criptonomicon/acceso/cgi.html.
7. Limitaciones
A continuación se discuten las limitaciones presentadas por estos métodos,
apuntando asimismo posibles soluciones para superarlas.
7.1 Listado de directorios
Aunque el listado de directorios puede ser conveniente, representa una amenaza para
la seguridad. Si en la ventana de URL se introduce el nombre de un directorio y
está habilitado el listado (browsing), aparecerán listados los contenidos de
ese directorio, con sus carpetas y ficheros. En estas circunstancias, algunos
de estos esquemas de protección resultarían inútiles, ya que se podría ver el
nombre de los ficheros (o lo que es lo mismo, las claves).
Solución: en la configuración del servidor está disponible la posibilidad de
deshabilitar el listado de directorios, así como la presentación por defecto de
un fichero cuando se solicite el nombre del directorio. Este fichero suele
llamarse in- dex.html o default.htm y si no está presente, aparecerá una página
de error en vez de listarse el contenido del fichero.
7.2 Bookmarking
Una vez que un usuario ha accedido a la página protegida, es decir, una vez que
conoce su URL, nada impide que lo guarde en su lista de marcadores y acceda a
él en el futuro sin pasar antes por el proceso de autenticación. Es más, podría
desde una página web propia poner un enlace a la página o fichero protegido en
cuestión, de manera que cualquier usuario podría acceder a él sin autenticarse
antes.
Solución: cambiar frecuentemente la clave/nombre del fichero a proteger, de
manera que no se pueda acceder directamente a la página sin pasar antes por el
proceso de autenticación (al menos no por mucho tiempo).
En ASP no existe este problema, siempre que el proceso de autenticación se
embeba en la misma página que se desea proteger.
7.3 Listado del código fuente
No hay que perder de vista el hecho de que en Java el proceso de compilación no
oculta completamente el código fuente del programa, ya que el fichero objeto
contiene mucha información, hasta el punto de que puede decompilarse sin
problemas usando alguna de las muchas herramientas que existen a tal fin. Por
consiguiente, no hay que olvidar que el usuario firmemente determinado será
capaz de obtener el código fuente, por lo que no conviene dejar en él material
sensible ni claves en claro.
En el caso de C/C++, aunque el programa está compilado y enlazado, si se
examina el ejecutable con un editor hexadecimal, se podrán leer las cadenas de
texto, por lo que no conviene dejar las claves en claro. Ahora bien, salvo que
el servidor esté deficientemente configurado, nadie podrá hacerse con los
ejecutables.
Solución: se pueden utilizar ofuscadores de código, que dificultan la labor de
decompilación, en el caso de Java. En el caso de C/C++, se puede cifrar la
clave dentro del programa ejecutable.
7.4 Cookies
El problema más importante que plantean las cookies es que la información de
nombre y clave quedan guardados en el disco duro, de manera que cualquier
persona que disponga de acceso físico al mismo será capaz de leerla y, en
consecuencia, entrar a ese servicio.
Por otro lado, no todos los navegadores soportan cookies, o bien su aceptación
está desactivada en muchos de ellos debido al halo de misterio y riesgo que las
rodea (puede verse www.iec.csic.es/criptonomicon/cookies para una completa discusión
sobre las cookies).
Solución: respecto al acceso físico a la cookie, lo más conveniente es que el
usuario proteja celosamente sus archivos sensibles cuando no los esté
utilizando, incluyendo el archivo de cookies. En el caso de la autenticación,
la información guardada en la cookie de nombre y contraseña puede ser
interceptada en tránsito, por lo que otra solución consistirá en utilizar un
canal seguro mediante SSL.
Un camino alternativo de protección de la información de autenticación
contenida en la cookie consiste en incorporar en la cookie la dirección IP del
host del usuario y una sello de tiempo que especifique el período durante el
cual la información de autenticación es válida. De esta forma, dicha cookie
sólo sería válida para el usuario trabajando desde ese host. Con el fin de
evitar la falsificación de estos datos, se puede incorporar en la cookie una
información sólo conocida por el servidor y se calcula el hash de todo el
conjunto. Este hash se concatena con los contenidos
anteriores antes de enviarla al navegador. Ahora, cuando el servidor reciba
esta cookie, puede comprobar su autenticidad calculando el hash de la
información de la cookie más ese secreto que sólo él conoce.
Autenticacion = dirección IP + fecha de caducidad + nombre de usuario + clave
de acceso valor de la cookie = autenticación + hash (secreto + autenticación)
En cuanto a los usuarios que desactivan la navegación con cookies, se les debe
avisar del propósito de estas cookies para que no desconfíen de ellas y las
habiliten mientras na-vegan por las páginas protegidas. Los pro- gramas de
filtrado de cookies son otra solución aceptable, ya que permiten la aceptación
selectiva de cookies, a diferencia de las opciones presentadas por los navega-
dores, que se reducen a todo o nada. En cualquier caso, el uso de cookies es
más una conveniencia que una necesidad, por lo que si un usuario no puede o no
quiere aceptar cookies, los métodos que las utilizan no dejarían de funcionar.
Simplemente se verían obligados a autenticarse para cada documento protegido
que quisieran visualizar.
7.5 Referer logs
Otro problema asociado es la aparición de la página secreta en el registro de
referencias de algún servidor remoto. Si desde la página secreta se enlaza a
alguna otra página fuera del propio sitio web, en los log del servidor de la
máquina a la que se referencia aparecerá registrada rutinariamente la página de
la que se provino. En el caso peor, el creador de la página enlazada ha podido
incluir una página de estadísticas de acceso que resulte accesible por
cualquier visitante a su web, de manera que el URL de la página expuesta
quedaría a la vista de todos aquellos que se pasasen por la página de
estadísticas del sitio referenciado.
Solución: nunca se debe enlazar páginas externas desde una página protegida por
estos métodos. Se puede crear una página de enlaces desde la cual ya sí que se
puede referenciar otras páginas sin correr este riesgo. La página protegida
nunca enlazará al exterior, sino a esa página de enlaces.
Gonzalo Alvarez. [01/01/2000
]