Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/02/2014, 17:24
Avatar de Middrel
Middrel
 
Fecha de Ingreso: abril-2005
Mensajes: 835
Antigüedad: 19 años, 6 meses
Puntos: 27
Cómo reforzar mi código de sesiones

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($sqlSelectUserMYSQLI_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!!