P.: ¿Cómo implementar un sistema de acceso con clave seguro y vistoso?
Y que además registre cuándo entran los usuarios, su IP, cómo localizar dónde se ubica la IP, mostrar un mensaje personalizado de bienvenida para el usuario, registrando accesos maliciosos o erróneos, y además felicitar al usuario si es su cumpleaños... todo esto y mucho más en ....
R: Utiliza una base de datos con tres tablas, una para guardar los accesos "buenos" otra para los "malos" (intentos o errores de los usuarios) y otra para ir poniendo los usuarios. (Descripción de la base de datos en notas, al final).
Además, incluye la función "
zorionak" (Felicidades en euskera) para lanzar un pop-up si es el cumpleaños del usuario. ("
urtebete" [cumpleaños] es el campo de la tabla usuarios donde va la fecha dd/mm sin año, claro), usando una cadena u otra "
zorion" ó "
nozorion". Esto es muy vistoso y agradecido por los usuarios.
(Seguir el
verde oscuro para este asunto)
Combina todo esto con
www.ip2location.com/free.asp que permite ver la localización (90% exacto) de la IP, y tendrás una página de acceso muy guay y bien controlada.
(restringido a 20 consultas por día por IP)
[Ver notas al final] [acceso.asp]:
<%if request.form("usuario")="" then
response.redirect "entrada.htm"
%>
<%else
'eliminamos las posibles comillas de la entrada
'para evitar la introducción de sentencias SQL
usuario=replace(request.form("usuario"),"'","")
password=replace(request.form("password"),"'","")
com=chr(34)
Var_IP = Request.ServerVariables("HTTP_X_FORWARDED_FOR")
if Var_IP = "" then
Var_IP = Request.ServerVariables("REMOTE_ADDR")
end if
Var_IP2 = Request.ServerVariables("REMOTE_HOST")
IF Var_IP2 = "" then
Var_IP2 = Request.ServerVariables("REMOTE_ADDR")
end if
zorion="<script language=JavaScript>function zorionak(){window.open('zorionak.htm','','top=100, left=100,width=415,height=294,scrollbars=No,locati on=No,menubar=No,resizable=no,status=No,directorie s=No,toolbar=No,copyhistory=No')}</script><body onload='zorionak()' bgcolor='#CCFFFF'>"
nozorion="<body bgcolor='#CCFFFF'>"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../data/TABLA.mdb"))
set rs = CreateObject("ADODB.Recordset")
sqltxt="Select * from usuarios where usuario='"&usuario&"' and password= '"&password&"'"
'response.write sqltxt
rs.Open sqltxt, conn
if not rs.eof then
' nos ha devuelto un registro, ahora miraremos si es valido
' con ello evitamos el ataque típico SQL
if rs("usuario")=usuario and rs("password")=password then
' si el usuario esta en la base de datos y la password coincide
session("autorizacion")=1
Insertar = "INSERT INTO TablaAccesos (ID_Usuario, Fecha_Acceso, IP, IP2) VALUES ('"&usuario&"', '"&Now()&"', '"&Var_IP&"', '"&Var_IP2&"')"
Conn.Execute(Insertar)
IF RS("URTEBETE")=date() then
Response.write "<html>..<head>
" & zorion & "<table ...>
Bienvenido: " & rs("nombre") & "</font>...</html>"
else
Response.write "<html>..<head>
" & nozorion & "<table ...>
Bienvenido: " & rs("nombre") & "</font>...</html>"
end if
end if
else
Insertar = "INSERT INTO BadAccesos (Bad_usuario, Bad_fecha, Bad_clave, Bad_IP, Bad_IP2) VALUES ('"&usuario&"', '"&Now()&"', '"&password&"', '"&Var_IP&"', '"&Var_IP2&"')"
Conn.Execute(Insertar)
session("autorizacion")=-1
end if
rs.close
set rs=nothing
conn.close
set conn=nothing
if session("autorizacion")=-1 or session("autorizacion")="" then
' no hemos encontrado el registro
' eso indica que el usuario y/o la password son erroneos
response.redirect "entrada.htm"
end if
end if%>
NOTAS: [entrada.htm]:
<html>
...
<form method="POST" action="acceso.asp">
...
<input type="text" name="usuario" size="20"></td>
...
<input type="password" name="password" size="20">
...
<input type="submit" value="Aceptar" name="B1">
...
</form>
...
</html>
[BASE DE DATOS]:
TABLA.mdb
---->usuarios (tabla) [Aquí es donde vas poniendo los usuario a mano]
-------->usuario (campo)
-------->password (campo)
-------->nombre (campo)
---->TablaAccesos (tabla)
-------->ID_Usuario (campo)
-------->Fecha_Acceso (campo)
-------->IP (campo)
---->BadAccesos (tabla)
-------->Bad_usuario (campo)
-------->Bad_fecha (campo)
-------->Bad_clave (campo)
-------->Bad_IP (campo)
Yo guardo una copia de esta base de datos en el disco duro, donde voy copiando los accesos y badaccesos y dejo la "original" vacía y la vuelvo a subir, para evitar que se vaya "inflando" y ralentice el asunto. Para ello, también es aconsejable, antes de guardar, en access: Herramientas -> Utilidades de la Base de Datos -> Compactar y Reparar Base de datos. Esto evita que access guarde información "fantasma" y reajusta el tamaño al mínimo justo y necesario.
[A TENER EN CUENTA]:
El response.write genera el código de la página restringida. Ten en cuenta que dentro de ese código no puedes usar comillas dobles ["], pero sí simple ['] y también el código ASCII de la comilla, que es chr(34) y lo tienes que poner así:
Response.write "...código html hasta la comilla
" & chr(34) & "código html después de la comilla..."
Verás que yo lo he definido como "com", para abreviar, y poner sólo " & com & "
Además, recuerdo que en el response.write no se pueden hacer saltos de línea, hay que poner el código todo seguido.
[zorionak.htm]:
una paginita con algo vistoso, hombre, no seas rancio
, pero ten en cuenta los tamaños y posición con que se abre, que los marco en la variable "zorion", y pon los que te vengan bien a tí.
p.s.: ¿esto es una FAQ o un manual?