Ver Mensaje Individual
  #1  
Antiguo 03-01-2010
hibero hibero is offline
Miembro
 
Registrado: nov 2003
Posts: 104
Reputación: 21
hibero Va por buen camino
validar usuarios de forma correcta

pretendo que los usuarios se validen antes de entrar a mi sitio web. Los pares usuario/contraseña estarán almacenados en un tabla llamada usuarios dentro de una base de datos MySQL.

Código SQL [-]
  Create table usuarios(
     usuario varchar(20) not null primary key,
     passwd varchar(20) not null,
  );

tendré 3 ficheros

login.php : contendrá el formulario html donde se introducirá el usuario y la contraseña. Al hacer clic sobre el boton se enviará el formulario utilizando POST al script php autenticacion

Código PHP:
<form action="autenticacion.php" method="POST">
   
usuario:<input name="usuario" size="25" value=""/>
   
Contraseña:<input name="passwd" size="25" type="password"/>
   <
input type="submit" value="Inicio de sesión"/>
</
form
autenticacion.php: en este script se comprueba si el par usuario/contraseña suminisgtrado por el usuario coinciden con los almacenados en la base de datos

Código PHP:

  
if (login($_POST["usuario"],$_POST["passwd"])==1){
 
//Si coninciden usuario y congtraseña
    
session_start(); //iniciamos la sesion
    
$_SESSION["logeado"]=1//creamos una variable logeado=1 (1)
    
$_SESSION["usuario"]=$_POST["usuario"]; 
/*almaceno el usuario como variable de sesion para utilizarlo luego en mi aplicacion*/
    
header ("Location: index.php"); //todo es correcto estoy validado abro mi aplicacion web
:cool:  }
   else {
     
//si no existe se va a login.php
     
header("Location: login.php");
   }

/*esta funcion devuelve 1 si el par usuario/contraseña coinciden con los almacenados en la base de datos. Utilizo PDO para conectar con la base de datos. Además uso una consulta paramétrica para evitar SQLInjection
*/
  
function login($usuario,$passwd){
     
/*asignar valores pertinentes al crear el objeto PDO en mi caso prueba*/ 
     
$db = new PDO("mysql:host=localhost;dbname=prueba",'prueba','prueba');
     
$q $db->prepare("SELECT passwd from usuarios where usuario=:usuario");
     
$q->bindParam(':usuario',$usuario);
     
$q->execute();
     
$row $q->fetch(PDO::FETCH_ASSOC);
     if (
$row["passwd"]=="" || $row["passwd"]!=$passwd){
         return 
0// usuario/contraseña incorrecta
     
}
         else return 
1// usuario/contraseña correcta
     
$db=null;
  } 
(1) la variable logeado por motivos de seguridad debe reemplazar por una variable con un nombre más complicado por ejemplo "123AWETRT323esdaqwe" pero para no liarla mas usare "logeado"

seguridad.php: para evitar que alguien pueda ejecutar mi aplicacion(index.php) sin previamente haberse validado se incluirá seguridad php al principio de index.php de forma que sea lo primero que se ejecute

Código PHP:
<?php
    session_start
(); //inicio sesion

    
if ($_SESSION["logeado"] !=1) { //no estoy logeado debo logearme primero
       
header("Location: login.php");
       exit();
    }
      
//en caso contrario estoy logeado y puedo continuar con la aplicacion
?>
En todos los ficheros de mi aplicacion tendrán una primera linea como la siguiente para comprobar la seguridad

Código PHP:
   <?php  include("seguridad.php");   ?>
Esta forma de asegurar una aplicación la he encontrado googleando por ahi.

¿Qué se puede mejorar?
¿Qúe incluiriais?
¿Hay una forma de permitir sólamente 3 intentos?. Se me ocurre que agregando un nuevo campo en la base de datos numfallos, fecha,hora y que desde que se llegue a un número de fallos predeterminado que se bloquee durante un periodo de tiempo determinado desde fecha hora el usuario podría ser una mejora para eviar que alguien utilice un programa para hacer tropocientos intentos
¿es suficiente el uso de una consulta parametrica para evitar SQLInjection?

salu2 y gracias
Responder Con Cita