Foros del Web » Programando para Internet » PHP »

¿Este script de logueo es suficiente?

Estas en el tema de ¿Este script de logueo es suficiente? en el foro de PHP en Foros del Web. Tengo este script para validar los usuario registrados en un sistema: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original <?php     session_start ( ) ;   ...
  #1 (permalink)  
Antiguo 23/07/2011, 17:10
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
¿Este script de logueo es suficiente?

Tengo este script para validar los usuario registrados en un sistema:

Código PHP:
Ver original
  1. <?php
  2.     session_start();
  3.     include'../include/conexion.php';
  4.     include'../include/funciones.php'; 
  5.  
  6.     if (!isset($_POST['username'])){
  7.         setcookie("msglog","&iexcl;Usuario no Autenticado!",time()+2,"/");
  8.         redirect("../index.php");
  9.     }
  10.  
  11.     $urlAcceso  = $_GET["urlAcceso"];
  12.  
  13.     $consultaUsuario = $db->prepare("SELECT * FROM tb_acceso WHERE username = ? ");
  14.     $consultaUsuario->bindParam(1, $_POST['username'], PDO::PARAM_STR);
  15.     $consultaUsuario->execute();       
  16.  
  17.     if ($consultaUsuario->rowCount() == 0){
  18.         setcookie("msglog","&iexcl;El usuario <b>".$_POST['username']."</b> no tiene acceso!",time()+2,"/");
  19.         redirect("../index.php");
  20.         break;
  21.     }else{
  22.         $usuario        = $consultaUsuario->fetch();
  23.         $passUsuario    = $usuario['password'];            
  24.  
  25.         if (md5($_POST['password']) == $passUsuario){
  26.             $_SESSION['token']      = rand(0,10);
  27.             $_SESSION['username']   = $usuario['username'];
  28.             $_SESSION['descusua']   = $usuario['descusua'];
  29.             $_SESSION['rollusua']   = $usuario['rollusua'];
  30.            
  31.             redirect('../vistas/panel.php');       
  32.  
  33.         }else{
  34.             setcookie("msglog","&iexcl;Contrase&ntilde;a Incorrecta!",time()+2,"/");
  35.             redirect ("../index.php");
  36.         }
  37.     }

El archivo funciones.php contienes una funcion JavaScript para redireccionar (tal vez no sea la mejor opcion pero por ahora asi lo hago)

Quiero que por favor me den su opinion de este script. ¿Es suficiente? ¿Esta mal? ¿Que tan mal?

Gracias.
__________________
Aprendiendo!!!
  #2 (permalink)  
Antiguo 23/07/2011, 17:17
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: ¿Este script de logueo es suficiente?

Este es el script para cerrar session

Código PHP:
Ver original
  1. <?php
  2.     session_start();
  3.  
  4.     include("../include/funciones.php");   
  5.     unset($_SESSION['token']);
  6.     unset($_SESSION["user"]);
  7.     unset($_SESSION["roll"]);
  8.     unset($_SESSION['username']);
  9.  
  10.     $_SESSION = array();
  11.  
  12.     setcookie("msglog","Sesi&oacute;n Cerrada!!!",time()+2,"/");
  13.  
  14.     redirect("../index.php");
__________________
Aprendiendo!!!
  #3 (permalink)  
Antiguo 23/07/2011, 17:19
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: ¿Este script de logueo es suficiente?

Y este es el script para validar en cada pagina que el usuario este logueado

Código PHP:
Ver original
  1. if(!isset($_SESSION['username']) || !isset($_SESSION['token'])){
  2.             setcookie("msglog","Usuario no autenticado",time()+2,"/");
  3.             redirect('../index.php');
  4.  
  5.         }
__________________
Aprendiendo!!!
  #4 (permalink)  
Antiguo 23/07/2011, 18:40
Avatar de perryjr  
Fecha de Ingreso: julio-2010
Ubicación: Granada, Spain, Spain
Mensajes: 190
Antigüedad: 14 años, 4 meses
Puntos: 27
Respuesta: ¿Este script de logueo es suficiente?

1. Supongo, que la función redirect(..) cuando la usas, hace un exit o algo así para interrumpir que la página se mande. No sirve de nada redireccionar al usuario, si tb le envias la página que no debería ver (un hacker si podría verla MUY facilmente)

2. Otra posible debilidad, es que aquí compruebas:
Código PHP:
Ver original
  1. if (!isset($_POST['username']))

pero aquí no:
Código PHP:
Ver original
  1. $urlAcceso  = $_GET["urlAcceso"];

Nada te puede asegurar que el cliente (algo que no controlas casi en absoluto, no sabes quien hay usando tu página) haya enviado /pagina?urlAccesso=... Y tu código fallaría.
Código PHP:
Ver original
  1. $urlAcceso  = isset($_GET['urlAcceso']) ? $_GET["urlAcceso"] : '/pagina-principal-del-sitio';

3. Procura usar cadenas simples '...' en vez de "...", porque cada vez que usas "..." PHP tiene que escanear la cadena entera (aunque sean cortas, pero mira es un tiempo y recursos gastados) en busca de cosas que reemplazar, tipo "antes $reemplazar despues". Es un consejo para incrementar el rendimiento, aunque no es absolutamente necesario.

Finalmente solo decirte que:
1. Excelente que guardes las contraseñas con md5() y lo compruebes con eso.
2. Excelente código, fácil de leer y muy organizado.
__________________
I (L) Google
  #5 (permalink)  
Antiguo 25/07/2011, 06:04
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: ¿Este script de logueo es suficiente?

perryjr gracias por tu comentario.

Código PHP:
Ver original
  1. if (!isset($_POST['username']))

Esto lo hago para verificar si se envio el formulario. ¿Por que habria debilidad?

Código PHP:
Ver original
  1. $urlAcceso  = $_GET["urlAcceso"];

Esto era algo que iva a implementar pero no lo hice, se quedo el codigo ahi.

Gracias por el consejo de las comillas sencillas.

Espero sigas sugiriendo cambios.

Gracias.
__________________
Aprendiendo!!!
  #6 (permalink)  
Antiguo 26/07/2011, 11:15
Avatar de perryjr  
Fecha de Ingreso: julio-2010
Ubicación: Granada, Spain, Spain
Mensajes: 190
Antigüedad: 14 años, 4 meses
Puntos: 27
Respuesta: ¿Este script de logueo es suficiente?

Debilidad me refiero a que dependiendo de las configuracion de PHP que tengas en el servidor, si tu intentas acceder a $_GET['urlAcceso'], y no existe el elemento 'urlAcceso' en $_GET porque no se ha enviado tal elemento al servidor, tu script fallará, dejando tras de sí un error. De nuevo, dependiendo de las configuraciones de tu servidor, es posible que ese error llegue al usuario (llamemoslo hacker mientras no lo conozcamos =) ).

Esto me pasó a mi con la web de una inmobiliaria. Enviando /contacto.php, asi tal cual, sin datos; provocaba un error, que por configuraciones del servidor se enviaba al cliente (PHP_warning... todo ese rollo). La gracia es que ese rollo contenia nombres de archivo, líneas en esos archivos, etc. gracias a las cuales un atacante podría beneficiarse. Y de hecho les demostré que eso, unido a un pequeño error de SQL injection, me daba acceso a su base de datos.

No es que eso por si solo sea un problema, sino que es una debilidad más que se irá sumando hasta que tengan poder para hackear la página.

De todas maneras, es verdad que no somos Facebook, no somos Tuenti, esperemos y rezemos que Anonymous no tenga interés en nuestros datos... =) Pero aun asi nunca viene de más ponerle seguridad a las cosas

Es como otra cosa que no he mencionado ahora que me acuerdo, porque no me pareció importante. Y si alguien hace esto:
http://example.com/login.php?urlAcce...-infectada.php

Google por ejemplo si implementa mecanismos para no redireccionar fuera del dominio google.com; porque lo necesita. Seguramente ni tu ni yo lo necesitemos nunca, pero no está de más conocer que el problema esta ahí, y coger buenas costumbres en la programación para evitarlos =)
__________________
I (L) Google
  #7 (permalink)  
Antiguo 26/07/2011, 13:34
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: ¿Este script de logueo es suficiente?

Ok gracias, eso en cuanto al $_GET['urlAcceso'], y en cuanto a lo de asignacion de las variables de session, busqueda en la base de datos y los demas?
__________________
Aprendiendo!!!
  #8 (permalink)  
Antiguo 27/07/2011, 04:30
Avatar de perryjr  
Fecha de Ingreso: julio-2010
Ubicación: Granada, Spain, Spain
Mensajes: 190
Antigüedad: 14 años, 4 meses
Puntos: 27
Respuesta: ¿Este script de logueo es suficiente?

1. Evitas SQL Injection, con lo de bindParam().
2. No guardas la contraseña en la $_SESSION (sí, he visto programadores que lo hace -.-')

Me parecen bastante bien. Quizás podrías mejorar en que la llamada a setcookie(...); pa los mensajes es muy repetitiva. Puedes crear una funcion setMessage(); o algo así para abstraerte de todo eso (y si cambias el sistema de mensajes, no tienes que cambiar tanto código).

Por lo demás esta muy bien tu código en esos sentidos.
__________________
I (L) Google
  #9 (permalink)  
Antiguo 27/07/2011, 07:15
Avatar de anacona16  
Fecha de Ingreso: marzo-2010
Ubicación: Bogota DC
Mensajes: 610
Antigüedad: 14 años, 8 meses
Puntos: 52
Respuesta: ¿Este script de logueo es suficiente?

Eso de setMessage() ya lo habia pensado, hacer una clase que contenga todos esos mensajes en un script aparte.
__________________
Aprendiendo!!!

Etiquetas: logueo, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:15.