Hola, buenas tardes,
Estoy trabajando con sesiones
PHP. Me basé en algunas guías, creando sesiones sencillas y poco a poco ir reforzándolas para que el ingreso sea más seguro. quería ver si me pueden ayudar con esto. En principio, coloco mi código de inicio de sesión y en base a este ir trabajando más en la seguridad.
Tengo mi archivo
session.php, el cuál recibe los datos desde un formulario:
Código PHP:
session_start();
include("bd/config-sistema.php");
include("reglas/mensajes.php");
date_default_timezone_set('America/Mexico_City');
if(isset($_POST['enviar'])){
$diaActual = date("Y-m-d");
// Utilizamos mysql_real_escape_string para evitar SQL Injection -> Filtro 1
$user = mysqli_real_escape_string($connect, $_POST['user']);
$pass = mysqli_real_escape_string($connect, $_POST['pass']);
$passCodif = crypt($pass, '$2a$07$vasto78try14perma09wq2$');
// Buscamos que el usuario se encuentre en la base de datos y no tenga un máximo de 3 intentos de logueo -> Filtro 2
$sqlSelectUser = mysqli_query($connect, "Select id_usuario, usu_usuario, usu_password, usu_baja, usu_bloqueo, usu_intentos, grp_grupo From sys_usuarios Left join sys_grupo On (id_grupo = usu_grupo) Where usu_usuario = '$user'", MYSQLI_USE_RESULT) or die(mysqli_error($connect));
$rowSelectUser = mysqli_fetch_array($sqlSelectUser, MYSQLI_ASSOC);
$ide = $rowSelectUser['id_usuario'];
$usuario = $rowSelectUser['usu_usuario'];
$password = $rowSelectUser['usu_password'];
$grupo = $rowSelectUser['grp_grupo'];
$vigencia = $rowSelectUser['usu_baja'];
$bloqueo = $rowSelectUser['usu_bloqueo'];
$intentos = $rowSelectUser['usu_intentos'];
mysqli_free_result($sqlSelectUser);
// Revisamos que el usuario exista y sea el mismo al introducido
if($usuario == $user){
// Verificamos que no tenga algún bloqueo
if($bloqueo == 1){
$mensaje = $bloqueoLogin;
// Ahora verificamos que el password coincida con el almacenado
} elseif($password == $passCodif){
$_SESSION['estado'] = 'logueado'; // Definimos el estatus del usuario
$_SESSION['usuario'] = $ide; // Definimos el id del usuario
$_SESSION['registro'] = $usuario; // Definimos el número de registro
$_SESSION['acceso'] = date('Y/m/d h:i:s A'); // Definimos la hora de entrada del usuario
$_SESSION['grupo'] = $grupo; // Definimos el grupo al que pertenece
$_SESSION['modulo'] = ""; // Definimos el módulo al cuál acceso
$_SESSION['evento'] = ""; // Definimos los movimientos que hizo el usuario
header('Location: empresa.php');
} else {
// Si el usuario, realiza más de 3 intentos para ingresar con un password erróneo, la cuenta se bloqueará
if($intentos < 3) {
$intentos = $intentos + 1;
$sqlUpdateUsuarios = mysqli_query($connect, "Update sys_usuarios Set usu_intentos = $intentos Where id_usuario = $ide", MYSQLI_USE_RESULT) or die(mysqli_error($connect));
mysqli_free_result($sqlUpdateUsuarios);
$mensaje = $passIncorrecto;
} elseif ($intentos == 3){
$fechaBloqueo = strtotime('+1 day', strtotime($diaActual));
$fechaDesbloqueo = date("Y-m-d", $fechaBloqueo);
$sqlUpdateUsuarios = mysqli_query($connect, "Update sys_usuarios Set usu_bloqueo = 1 Where id_usuario = $ide", MYSQLI_USE_RESULT) or die(mysqli_error($connect));
$sqlUpdateUsuarios = mysqli_query($connect, "Update sys_usuarios Set usu_fecha_desbloqueo = '$fechaDesbloqueo' Where id_usuario = $ide", MYSQLI_USE_RESULT) or die(mysqli_error($connect));
mysqli_free_result($sqlUpdateUsuarios);
$mensaje = $bloqueoLogin;
}
}
} else {
$mensaje = $errorInicio;
}
}
Básicamente, ese es el inicio. Posteriormente en cada página, en el inicio añado el siguiente código:
empresa.php Código PHP:
<?php include("sesiones/session.php"); if($_SESSION['estado'] != 'logueado'){ header('Location:index.php'); } ?>
en algunos casos, debido al grupo al que pertenezca el usuario existen secciones o módulos a los que no puede ingresar, eso lo realizo con esta instrucción:
Código PHP:
<div id="menu">
<ul>
<li class="menu"><a href="empresa.php">EMPRESA</a></li>
<li class="menu"><a href="clientes.php">CLIENTES</a></li>
<li class="menu"><a href="facturacion.php">PEDIDOS</a></li>
<?php if($_SESSION['grupo'] == 'General' || $_SESSION['grupo'] == 'Administrativo'){ ?>
<li class="menu"><a href="#">COBRANZA</a></li>
<?php } ?>
<li class="menu"><a href="inventario.php">INVENTARIO</a></li>
<?php if($_SESSION['grupo'] == 'General' || $_SESSION['grupo'] == 'Administrativo'){ ?>
<li class="menu"><a href="reportes.php">REPORTES</a></li>
<?php } ?>
</ul>
</div>
existe un grupo de usuario que es el más bajo, o normal, este no podrá acceder a las opciones de
Cobranza y
Reportes. En el ejemplo de los menús, si se dan cuenta sólo muestro las opciones de acuerdo a la variable $_SESSION['grupo'], pero si el usuario sabe que existe una página llamada
conranza.php y trata de escribirla en la barra de direcciones, agrego esta línea a esas páginas:
Código PHP:
<?php include("sesiones/session.php"); if($_SESSION['estado'] != 'logueado'){ header('Location:index.php'); } if($_SESSION['grupo'] != 'General'){ header('Location:modulo-restringido.php'); } ?>
y esto es lo que tengo. Leí que hay muchas formas de intentar entrar a un sitio mediante ataques, pero aún se me dificultan todos los métodos que puedo usar para que mi sitio sea seguro, por ejemplo, aún no implemento lo siguiente:
1. Evitar que un usuario entre con la misma cuenta de otro.
2. Finalizar la sesión cada cierto tiempo.
3. No sé si debo usar cookies o no.
4. Cerrar correctamente la sesión, para ello uso la siguiente sentencia:
destroy.php
Código PHP:
session_start();
session_destroy();
header('Location: ../index.php');
Bueno, ¿me podrían aconsejar si voy por buen camino?¿algo que se me esté pasando?¿si mi código es demasiado vulnerable?
De antemano, agradezco por sus comentarios. Toda crítica es bienvenida y asimilada como tal.
Saludos!!