Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > PHP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-01-2010
hibero hibero is offline
Miembro
 
Registrado: nov 2003
Posts: 104
Poder: 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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pronunciación correcta. marcoszorrilla La Taberna 1 12-11-2008 21:38:25
Cual es la forma correcta de llamar y ejecutar un ProcAlmacenado en IB6 y Delphi 7??? Saltamontes Firebird e Interbase 5 11-07-2007 17:05:19
Cómo utilizar consultas con DISTINCT de forma correcta dec MySQL 9 19-09-2006 17:50:47
Cual es la Forma Correcta de Guardar Texto en un IbDataset con TcpServer???? AGAG4 Varios 0 10-12-2004 22:14:41
Forma correcta de emigrar base de datos.. ronimaxh Firebird e Interbase 5 07-04-2004 23:34:38


La franja horaria es GMT +2. Ahora son las 01:47:18.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi