Ver Mensaje Individual
  #11 (permalink)  
Antiguo 09/10/2006, 12:30
finikini
 
Fecha de Ingreso: abril-2005
Mensajes: 100
Antigüedad: 19 años
Puntos: 0
tienes razon dachux, ya lo corregi ;)
aqui pogo el codigo de la nueva version, para el que lo quiera usar y mas explicadito

Código PHP:
///////////////////////////////////////////////////////////////////////////
///                                                                        ///
///        SISTEMA DE LOGIN de usuarios                                    ///        
///        + bloqueo de cuentas ( evitando sacar pass por fuerza bruta )    ///
///                                                                        ///
///        by leven ( tambien conocido por finikini XD )                    ///
///                                                                        ///
///////////////////////////////////////////////////////////////////////////

session_start(); // Se destruye cualquier
session_unset(); // session anterior antes de
session_destroy(); // comenzar con el scrip. Esto es opcional

if($_POST){ /// Se comrpueba si $_POST tiene algun valor
    /// Valores enviados por POST ///////////////////////////////////////
    
$nick $_POST['nick']; // pasamos $_POST['nick'] a $nick
    
$pass md5($_POST['pass']); // pasamos $_POST['pass'] a $pass codificado en MD5 que es como estan guardadas la pass en la BD. 
    /////////////////////////////////////////////////////////////////////
    
unset($_POST); /// Se destruye el array $_POST que ya no lo necesitamos
    /////////////////////////////////////////////////////////////////////
    
if(eregi("^[-_A-Z0-9]{3,20}$",$nick)){ // Se comprueba si el nick es valido. ( Valido: entre 3 y 20 caracteres que sean '-', '_', de la 'A' a la 'Z' y 0 al 9 )
        /// SQL ////////////////////////////////////////////////////////////////////    
        
include("sql.php"); // Conexion a la BD.
        /// Buscamos el registro en la BD que conincida con $nick. Solo buscamos un registro, por eso LIMIT 1
        
$resp mysql_query("SELECT id_usuario,nick,pass,intentos FROM usuarios WHERE nick='$nick' LIMIT 1",$conexion);
        
////////////////////////////////////////////////////////////////////////////
        
if(mysql_num_rows($resp) == 1){ /// Se comprueba si dio un resultado
            /// Si da un resultado es que existe tal usuario ...
            
$row mysql_fetch_assoc($resp); /// ... guardamos los valores del registro en la variable $row
            
if($row['intentos'] < 5){ /// Ahora comprobamos si tiene menos de 5 intentos fallidos de conexion.
                /// En el caso de tener menos de 5 intentos, se comprueba si la contraseña es correcta
                
if($pass == $row['pass']){
                    
/// Si la contraseña es correcta ...
                    
session_start(); /// Se inicia la session
                    
$_SESSION['id_usuario'] = $row['id_usuario']; /// Variable de session que contiene la ID del usuario, ideal para autorizar a zonas restringidas
                    
$_SESSION['usuario'] = $row['nick']; /// Variable de session que contiene el nombre del usuario
                    
                    /// Ahora actualizamos el registro del usuario, con la fecha de la ultima conexion y la ultima ip,
                    /// ademas sumamos en +1 las conexiones que lleva el usuario en total desde su resgitro y ponemos los intentos fallidos a 0
                    
$fecha time(); // fecha en formato timestamp.
                    
$ip "xxx.xxx.xxx.xxx"/// Ip del usuario, esto en si no vale de nada es un hueco para poner
                                             /// una funcion que obtenga la ip mas adelante cuando haga la funcion, pero mientras tengo que usar un IP
                    /// SQL ///////////////////////////////////////////////////////////
                    
mysql_query("UPDATE usuarios SET uconexion_fecha='$fecha', uconexion_ip='$ip' , conexiones=conexiones+1, intentos=0 WHERE id_usuario='$row[id_usuario]' LIMIT 1",$conexion);
                    
///////////////////////////////////////////////////////////////////
                    
header("Location: ../index.php"); /// una vez logueado redirigimos al usuario al index de la pagina o a su panel de control.
                
                
} else {
                    
/// Si la contraseña es incorrecta le sumamamos a los intentos +1 
                    /// SQL ///////////////////////////////////////////////////////////
                    
mysql_query("UPDATE usuarios SET intentos=intentos+1 WHERE id_usuario='$row[id_usuario]' LIMIT 1",$conexion);
                    
///////////////////////////////////////////////////////////////////
                    
echo "Cotraseña incorrecta.";
                }
            } else { echo 
"Cuenta bloqueada ..."; } /// Salida para cuando supere los intentos de conexion fallidos
        
} else { echo "No existe tal usuario."; } /// Salida para cuendo no encuentre ningun usuario en la bd con el $nick enviado
    
} else { echo "nick no valido"; } /// Salida para cuendo el nick introducido en el formulario no sea valido
} else { header("Location: ../index.php"); } /// Salida para cuando no se envie nada por $_POST, osea que se acceda al script directamente sin usar el formulario. 
En las salidas se pueden usar header para redirigir a otra pagina, yo personalemte uso 'header' en vez de 'echo' porque uso un sistema de errores, solo tengo que enviar por $_GET[] el numero del error.

Cuando la cuenta se bloquea, se puede redirigir a un formulario, para luego enviarle un correo al usuario para que reactive la cuenta.
Aunque yo uso un sistema de verificacion por imagen, actualizando los intentos en 4 para darle un nuevo intento ( solo uno :) )

Para restringir zonas o areas de una pagina, solo basta con usar
ejemplo:

if($_SESSION['id_usuario']){ -> codigo de la zona restringida <- } else { echo "no tienes permiso"; }

Tambien puedes usar niveles de usuario, para ello tienes que crear un campo en la tabla que guarde el nivel y darle niveles a los usuarios,
luego guardar el nivel en una session por ejemplo: $_SESSION['nivel'] = $row['nivel']; y comprobarlo de esta manera:

if($_SESSION['id_usuario'] and $_SESSION['nivel'] == 'administrador'){ -> codigo de la zona restringida <- } else { echo "zona restringida"; }

otro ejemplo:
if($_SESSION['id_usuario'] and $_SESSION['nivel'] > 2 ){ -> codigo de la zona restringida <- } else { echo "zona restringida"; }