Ver Mensaje Individual
  #1 (permalink)  
Antiguo 15/09/2016, 20:52
Avatar de marciano_79
marciano_79
 
Fecha de Ingreso: agosto-2009
Mensajes: 88
Antigüedad: 15 años, 7 meses
Puntos: 0
Página protegida, no puedo ingresar

Hola estimados todos... hace un tiempo tenia funcionando bien un formulario de inicio de sesión para administrador, pero un seudo “experto” le echo mano para mayor seguridad y ahora no sé qué es lo que hizo que no me deja ingresar…
Les dejo los script, haber si alguien puede ayudarme a observar qué errores hay… estuve haciendo pruebas como de usuarios y contraseñas y todo funciona bien, el problema radica en la función que protege el acceso a la página… “es lo que creo”

Dejo los codigos a continuación...

INDEX.PHP
Código PHP:
Ver original
  1. require('conexion.php');
  2. sec_session_start(); // Esta funcion detiene a JavaScript en ataques a la identificación de la sesión. 
  3.  
  4.     if (login_check($cnx) == true){
  5.         header("Location: ver.php");
  6.     }
  7.  
  8.     if (isset($_POST['email'], $_POST['password'])) {
  9.         $email = mysqli_real_escape_string($cnx,$_POST['email']);
  10.         $password = mysqli_real_escape_string($cnx,$_POST['password']);
  11.         $error = '';
  12.        
  13.         $sha1_pass = sha1($password);
  14.    
  15.     if (login($email, $sha1_pass, $cnx) == true) {
  16.         // Login success
  17.         header("Location: ver.php");
  18.         exit();
  19.         } else {
  20.             $error = "El nombre o contraseña son incorrectos";
  21.         }
  22. }
Código HTML:
Ver original
  1. <form action="<?php $_SERVER['PHP_SELF']; ?>"  method="post">
  2.                         <h1>Login</h1>
  3.                         <div>
  4.                             <input  name="email" type="text" placeholder="Usuario">
  5.                         </div>
  6.                         <div>          
  7.                             <input  name="password" type="password" id="password" placeholder="Password">
  8.                         </div>
  9.                         <div>
  10.                             <label>
  11.                                 <input type="checkbox" name="remember_me">
  12.                                 Recuerdame
  13.                             </label>
  14.                         </div>
  15.                         <input type="submit" value="Entrar"/>
  16.                     </form>

FUNCIONES.PHP
Código PHP:
Ver original
  1. function sec_session_start() {
  2.     $session_panel_admin = 'user_id';   // Configura sesión personalizado.
  3.     $secure = 'SECURE';
  4.     // Esto detiene que JavaScript sea capaz de acceder a la identificación de la sesión.
  5.     $httponly = true;
  6.     // Obliga a las sesiones a solo utilizar cookies.
  7.     if (ini_set('session.use_only_cookies', 1) === FALSE) {
  8.         header("Location: ../error.php?err=Could not initiate a safe session (ini_set)");
  9.         exit();
  10.     }
  11.     // Obtiene los params de los cookies actuales.
  12.     $cookieParams = session_get_cookie_params();
  13.     session_set_cookie_params($cookieParams["lifetime"],
  14.         $cookieParams["path"],
  15.         $cookieParams["domain"],
  16.         $secure,
  17.         $httponly);
  18.     // Configura el nombre de sesión al configurado arriba.
  19.     session_name($session_panel_admin);
  20.     session_start();            // Inicia la sesión PHP.
  21.     session_regenerate_id();    // Regenera la sesión, borra la previa.
  22. }
  23.  
  24.  
  25.  
  26.  
  27. function login($email, $sha1_pass, $cnx) {
  28.     // Usar declaraciones preparada - inyección de SQL no será posible.
  29.     if ($stmt = $cnx->prepare("SELECT ID_USUARIO, NOMBRE, PASSWORD
  30.        FROM usuarios
  31.       WHERE EMAIL = ?
  32.        LIMIT 1")) {
  33.         $stmt->bind_param('s', $email);  // Une “$email” al parámetro.
  34.         $stmt->execute();    // Ejecuta la consulta preparada.
  35.         $stmt->store_result();
  36.        
  37.         // Obtiene las variables del resultado..
  38.         $stmt->bind_result($user_id, $username, $db_password);
  39.         $stmt->fetch();
  40.        
  41.         if ($stmt->num_rows == 1) {
  42.  
  43.         if ($db_password == $sha1_pass) {  
  44.         //¡La contraseña es correcta!
  45.         //Obtén el agente de usuario del usuario.
  46.             $user_browser = $_SERVER['HTTP_USER_AGENT'];
  47.         // Protección XSS ya que podríamos imprimir este valor.
  48.             $user_id = preg_replace("/[^0-9]+/", "", $user_id);
  49.             $_SESSION['user_id'] = $user_id;
  50.  
  51.         // Protección XSS ya que podríamos imprimir este valor.
  52.             $username = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $username);
  53.  
  54.             $_SESSION['username'] = $username;
  55.             $_SESSION['login_string'] = ($sha1_pass . $user_browser);
  56.  
  57.         // Inicio de sesión exitoso.
  58.             return true;
  59.             } else {
  60.                 return false;
  61.             }
  62.         }
  63.     }
  64. }

El problema creo que radica en esta parte de la función login_check..

Código PHP:
Ver original
  1. function login_check($cnx) {
  2.     // Revisa si todas las variables de sesión están configuradas.
  3.     if (isset($_SESSION['user_id'], $_SESSION['username'], $_SESSION['login_string'])) {
  4.        $user_id = $_SESSION['user_id'];
  5.        $username = $_SESSION['username'];
  6.        $login_string = $_SESSION['login_string'];
  7.        
  8.  
  9.         // Obtiene la cadena de agente de usuario del usuario.
  10.     $user_browser = $_SERVER['HTTP_USER_AGENT'];
  11.  
  12.     if ($stmt = $cnx->prepare("SELECT PASSWORD
  13.                   FROM usuarios
  14.                   WHERE ID_USUARIO = ? LIMIT 1")) {
  15.         // Une “$user_id” al parámetro.
  16.             $stmt->bind_param('i', $user_id);
  17.             $stmt->execute();   // Ejecuta la consulta preparada.
  18.             $stmt->store_result();
  19.  
  20.             if ($stmt->num_rows == 1) {
  21.                 // Si el usuario existe, obtiene las variables del resultado.
  22.                 $stmt->bind_result($sha1_pass);
  23.                 $stmt->fetch();
  24.                 $login_check = $sha1_pass;
  25.  
  26.                 if ($login_check == $login_string) {
  27.                     // ¡¡Conectado!!
  28.                     return true;
  29.                 } else {
  30.                     // No conectado.
  31.                     return false;
  32.                 }
  33.             } else {
  34.                 // No conectado.
  35.                 return false;
  36.             }
  37.         } else {
  38.             // Could not prepare statement
  39.             header("Location: ../error.php?err=Database error: cannot prepare statement");
  40.             exit();
  41.         }
  42.     } else {
  43.         // No conectado.
  44.         return false;
  45.    }
  46. }

Y esta es la pagina protegida

VER.PHP
Código PHP:
Ver original
  1. require('conexion.php');
  2. include_once 'includes/functions.php';
  3. sec_session_start();
  4. <?php if (login_check($cnx) == true) : ?>
  5.         <p>Bienvenido <?php echo ($_SESSION['username']); ?>!</p>
  6.             <p>
  7.              Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
  8.             </p>
  9.             <p>Retornar a <a href="index.php">Página de acceso</a></p>
  10.         <?php else : ?>
  11.             <p>
  12.                 <span class="error">Usted no esta autorizado al acceso de esta página.</span> Favor <a href="index.php">Inicie sesión</a>.
  13.             </p>
  14.         <?php endif; ?>

Cualquier info, quedo muy agradecido... ojala me puedan ayudar! saludos a todos..