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