Parablan

Hector Alejandro Parada Blanco


Inicio de sesión en PHP

Categoria: Programacion
Hector Alejandro Parada Blanco
2019-10-15

Al momento de crear aplicaciones web (WebApp), se deben tener en cuenta varios factores, como por ejemplo el contenido a mostrar dependiendo del usuario que visite e inicie sesión en nuestra plataforma, y para ello, se hace uso de sesiones, que nos ayuden a proteger el contenido de nuestra WebApp, así como a identificar el tipo de usuario que se conecta a nuestra aplicación.

Así las cosas, el día de hoy programaremos sesiones en el lenguaje PHP, y para empezar, crearemos una base de datos (llamada webapp) con la cual trabajará nuestra aplicación, dicha base de datos tiene la siguiente estructura.

CREATE DATABASE webapp;

USE webapp;

CREATE TABLE usuarios(
id_usuario INT(1) NOT NULL AUTO_INCREMENT PRIMARY KEY,
nombres CHAR(25),
apellidos CHAR(25),
username CHAR(25),
clave CHAR(35)

);

INSERT INTO usuarios(
nombres, apellidos, username, clave)
VALUES(
"Alejandro", "Parada Blanco", "usuario", md5("Clave123")
);


GRANT ALL ON webapp.* TO dito@localhost IDENTIFIED BY "d1t0_2019" WITH GRANT OPTION;

Como se puede observar no se trata de una base de datos compleja, posee una única tabla llamada usuarios, que para la finalidad de este artículo es todo lo que necesitaremos, adicionalmente, la última línea tiene la finalidad de crear un usuario llamado dito (así es, el nombre de un pokemon) con la clave d1t0_2019 y permisos totales sobre nuestra base de datos.

Bien, ahora creamos nuestro archivo principal llamado index.php el cual cuenta con dos estructuras html incrustadas, una de ellas muestra un formulario de inicio de sesión, mientras la otra tiene como finalidad dar la bienvenida al usuario si este inicia sesión claro está.

En primer lugar debemos iniciar una sesión, así que lo indicamos en nuestro archivo index.php con la instrucción session_start(); y enseguida creamos un token, el cual funcionará como método de protección al iniciar la sesión, este token lo enmascaramos con un hash MD5 para brindar mayor seguridad.

session_start();
$token=$_SESSION["token"] = md5(uniqid(mt_rand(), true));

Ahora comprobamos que la variable de sesión con el valor id_usuario no este vacía (luego entenderás esta instrucción), si está vacía se muestra un formulario de inicio de sesión, dicho formulario tendrá el token creado con anterioridad, eso sí, con atributo oculto (este token lo enviaremos junto con los datos de autenticación del usuario).

if(isset($_SESSION["id_usuario"])){
    $nombres=$_SESSION["nombres"];
    $apellidos=$_SESSION["apellidos"];
    echo("
    <!DOCTYPE html>

    <html lang='es'>
        <head>
        <meta charset='UTF-8'/>
        <title>Mi web App</title>
        </head>
        <body>
            <h3>Bienvenido <br/>".$nombres." ".$apellidos."</h3>
            <br/>
            <form method='POST' action='sesion.php?accion=logout&token=$_SESSION[token]'>
            <input type=submit value='cerrar'/>
            </form>
        </body>
    </html>");
}else{
    echo("
    <!DOCTYPE html>

    <html lang='es'>
        <head>
            <meta charset='UTF-8'/>
            <title>Mi web App</title>
        </head>
        <body>
        <center>
            <h1>Inicie sesi&oacute;n</h1>
            <form method='POST' action='sesion.php?accion=login'>
                <table>
                    <td><input type='text' id='usuario' name='usuario' placeholder='usuario'/>
                    <tr>
                    <td><input type='password' id='clave' name='clave' placeholder='Clave'/>
                    <tr>
                    <td><input type='submit' value='Ingresar'/>
                    <input type='hidden' id='token' name='token' value='".$token."'>
                </table>
            </form>
        </center>
        </body>
    </html>
    ");
}

Ahora creamos un nuevo archivo PHP al cual llamaré abrir_base_de_datos.php, este archivo lo llamaremos cada vez que se desee iniciar sesión, así como su nombre lo indica, este archivo contará con las instrucciones necesarias para establecer conexión con la base de datos.

Lo primero será comprobar que exista una sesión iniciada, si existe, creamos el pull de variables cuyos valores son: nombre del servidor donde se aloja nuestra base de datos, nombre de la base de datos (en este caso es webapp), nombre de usuario que tiene privilegios sobre nuestra base de datos (recordemos que se llama dito) y clave del usuario, adicionalmente, creamos una instancia del objeto mysqli a la cual he llamado mysql.

if(isset($_SESSION)){
    $servidor="localhost";
    $basededatos="webapp";
    $usuario_basededatos="dito";
    $clave_basededatos="d1t0_2019";
    $mysql=new mysqli($servidor, $usuario_basededatos, $clave_basededatos, $basededatos);
}else{
    header("location: index.php");
}

Quiero que presten atención a la instrucción header("location: index.php"); esta instrucción direcciona al usuario al archivo index.php si la sesión no se encuentra iniciada. Esto se debe hacer de esta forma, ya que si no se valida, el archivo abrir_base_de_datos.php puede ser llamado de forma arbitraria lo que podría desembocar en un ataque de tipo DDOS.

Recordemos que en nuestro index.php se creo un formulario que envía los datos de autenticación, así como el token de seguridad al archivo sesion.php, así que el último paso consistirá en crear el archivo en mención, el cual será el encargado de validar la información de inicio de sesión.

Lo primero que haremos será crear la variable token asignando el valor de la variable token enviado a través del formulario y validamos que su valor sea el mismo que contiene la variable de sesión $_SESSION["token"], recuerda que en el archivo index.php se le crea y asigno valor a dicha variable cuando el archivo index.php es cargado.

Ahora por medio de un ciclo de decisión switch validamos si lo que el usuario desea es iniciar sesión o cerrar sesión.

switch($_GET["accion"]){
    case "login":

El siguiente paso es validar el método utilizado para solicitar la página PHP, que en este caso es POST.

if ($_SERVER["REQUEST_METHOD"] == "POST"){

Ahora creamos las variables usuario y clave_ingresada y les asignamos los valores de usuario y clave enviados a través del formulario, también creamos una variable salt, la cual nos servirá para fortalecer la seguridad al momento de validar la información.

$usuario = (isset($_POST["usuario"]) && $_POST["usuario"]) ? $_POST["usuario"] : null;
$clave_ingresada = (isset($_POST["clave"])) ? $_POST["clave"]:null;
$salt="#f1d0.3s.un.d4lm4t4#";

La salt creada es el string "fido es un dalmata", encriptado a mi modo, iniciando y finalizando con el símbolo numeral (#), los espacios son remplazados por un punto (.) y las vocales son cambiadas por números.

Validamos que el nombre de usuario y la clave ingresada no estén vacías, e invocamos nuestro archivo abrir_base_de_datos.php para establecer conexión a la base de datos.

if($usuario!="" && $clave_ingresada!=""){
    include("abrir_base_de_datos.php");

Ahora enmascaramos la clave ingresada en MD5, esto debido a que al momento de la creación del usuario Alejandro en la base de datos, encriptamos la contraseña Clave123 en MD5, así por ejemplo, validamos que cuando se ingresa la clave Clave123, esta se convierte en el hash d9c661c13024383e291c4fac62ad0244 el cual es el mismo hash de la clave de nuestro usuario.

$clave_ingresada=md5($clave_ingresada);

Declaramos la variable $datos_usuario la cual contiene el query (consulta) que corrobora que el usuario exista, y si es así, obtenemos la clave que tiene asignada dicho usuario en la base de datos y la validamos con la clave ingresada.

$datos_usuario=$mysql->query("SELECT * FROM usuarios WHERE username='".$usuario."'");
while ($row_datos_usuario = mysqli_fetch_array($datos_usuario)){
    $clave=$row_datos_usuario["clave"];
    if($clave==$clave_ingresada){

Si las condiciones ya programadas se cumplen, verificamos la información una vez más, pero en esta ocasión, validamos dos string formados tras encriptar (mediante la función crypt de PHP) el usuario y la clave ingresada más la variable salt, contra el usuario y clave de dicho usuario que reposa en la base de datos más la variable salt.

if(crypt($usuario.$clave, $salt) == crypt($usuario.$clave_ingresada, $salt)){

Si luego de las validaciones realizadas, el usuario y contraseña son correctos, creamos algunas variables de sesión, en las cuales almacenamos datos que podemos utilizar en cualquier momento, como por ejemplo, el id del usuario (utilizada para validar en el archivo index.php que existe una sesión iniciada mediante la instrucción if(isset($_SESSION["id_usuario"])){), así como el nombre y apellidos del usuario, finalmente cerramos la conexión a la base de datos.

$_SESSION["id_usuario"] = $row_datos_usuario["id_usuario"];
$_SESSION["nombres"] = $row_datos_usuario["nombres"];
$_SESSION["apellidos"] = $row_datos_usuario["apellidos"];
$mysql->close();

Tras iniciar sesión satisfactoriamente, podemos observar en nuestro archivo index.php un botón que permite cerrar la sesión, así que esta acción la agregamos a nuestro ciclo switch.

case "logout":
    session_destroy($_SESSION=array());
    break;

Como se puede observar, la acción logout destruye las sesiones iniciadas por el usuario mediante la instrucción session_destroy la cual recibe como parametro la sesión iniciada en un array.

Ya hemos terminado, así que ejecutamos el archivo index.php y nuestra aplicación iniciará.

formulario

Formulario de inicio de sesión

inicio de sesion

 

Inicio de sesión

A continuación podrá descargar comprimido en formato 7z los archivos creados en este artículo (webapp).





Deja un comentario
Tu correo electrónico no será publicado. Tu nombre, comentario y código
captcha son obligatorios.


Comentario *
Nombre *
Correo electrónico

Captcha *