Foros del Web » Programando para Internet » PHP »

que tan seguro es mi login?

Estas en el tema de que tan seguro es mi login? en el foro de PHP en Foros del Web. bueno pues resulta que estas ultimas semanas eh tenido problemas con unos hackers. me han hecho algunos desastres en al pagina. bueno contra InyeccionSQL creo ...
  #1 (permalink)  
Antiguo 15/04/2010, 19:59
 
Fecha de Ingreso: marzo-2009
Mensajes: 73
Antigüedad: 15 años
Puntos: 1
que tan seguro es mi login?

bueno pues resulta que estas ultimas semanas eh tenido problemas con unos hackers. me han hecho algunos desastres en al pagina. bueno contra InyeccionSQL creo ya estar protegido, pero me encuentro con este tipo de hacking "Session Hijacking".

alguien sabe si el "Session Hijacking" solo afecta cuando se utilizan cookies? por que yo en todo mi sitio no uso cookies.

la forma que uso para el login es asi. que opinan ustedes? es suficiente con eso? o requiere mas seguridad?

por que segun he investigado (una de ellas http://phpsec.org/projects/guide/4.html) se puede hackear la sesion, pero no se si ese tipo de hacks afecta mi login teniendo en cuenta que no uso cookies.

bueno, espero me puedan ayudar. gracias

Código PHP:
    session_start();
    
    
//---------------------------------- logout
    
if ($_POST["salir"])
    {
        if (
$_POST["salir"]=="si")
        {
            
session_unset();
            
session_destroy();
            
header("Location: index.php");
            exit(
0);
        }
    }
    
    
//---------------------------------- ya esta logeado ,regrearlo al prinicpal 
    
if (isset($_SESSION["USUARIO"]) &&  session_id()== $_SESSION["SESION_ID"])
    { 
        
session_unset();
        
session_destroy();
        
header("location: index.php");
    }

    
//---------------------------------- faltan campos
    
if ( !isset($_POST['texto_usuario']) || !isset($_POST['texto_pass']) )
    {
        
session_unset();
        
session_destroy();
        
header("Location: index.php?error=true");
        exit(
0);
    }

    if ( 
$_POST['texto_usuario']=="" || $_POST['texto_pass']=="" )
    {
        
session_unset();
        
session_destroy();
        
header("Location: index.php?error=true");
        exit(
0);
    }

    
//---------------------------------- autenticacion
    
$texto_usuario $_POST['texto_usuario'];
    
$texto_usuario strtoupper($texto_usuario);
    
$texto_pass $_POST['texto_pass'];

        if( 
autenticar($texto_usuario,$texto_pass) )
        {
            
$perfil 2;
            
$id get_id($texto_usuario,$texto_pass);
        }
        else
        {
            
            
session_unset();
            
session_destroy();
            
header("Location: index.php?error=true");
            exit(
0);
        }

    
//---------------------------------- loing
    
session_destroy();
    
session_start();
    
$_SESSION["USUARIO_ID"]            = $id;
    
$_SESSION["USUARIO_NOMBRE"]     = $texto_usuario;
    
//$_SESSION["USUARIO_PASSWORD"]    = $texto_pass;
    
$_SESSION["SESION_ID"]          = session_id();
    
$_SESSION["PERFIL"]              = $perfil;

    
//---------------------------------- redireccionar
    /*if($_SESSION["PERFIL"] == 1)
        header("Location: admin.php");
    else*/
        
header("Location: admin2.php"); 
Código PHP:
        public function autenticar($usuario,$password)
        {
            
$link conectarse();
            
$q "SELECT id_administrador FROM administradores WHERE usuario='".comillas_inteligentes($usuario)."' and password='".comillas_inteligentes($password)."'";
            
$result mysql_query($q,$link) or die("ocurrio un error");

            
$es_correcto false;
            while(
$row mysql_fetch_array($result))
            {
                
$es_correcto true;
                
$id_administrador $row["id_administrador"];
            }
            
            
mysql_close($link);
            return 
$es_correcto;
        }
        
        function 
comillas_inteligentes($valor)
        {
            
// Retirar las barras
            
if (get_magic_quotes_gpc()) {
                
$valor stripslashes($valor);
            }
        
            
$valor mysql_real_escape_string($valor);
            return 
$valor;
        } 
  #2 (permalink)  
Antiguo 15/04/2010, 20:10
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: que tan seguro es mi login?

disculpa que te contradiga, pero el simple echo de usar sesiones implica que usas cookies (y dudo mucho que uses el modo enable_trans_sid).

veo que te falta hashear las contraseñas, es algo muy recomendable que almacenes en la base de datos las contraseñas con md5 por ejemplo.

el robo de la sesión, (o el robo de la cookie de la sesión) es muy común si no proteges a tu sistema contra XSS, pero eso ya es un tema muy extenso, sin hablar también del CSRF; si quieres consulta en google o en mi blog para mayor información, lo estoy renovando

Última edición por maycolalvarez; 15/04/2010 a las 20:23
  #3 (permalink)  
Antiguo 15/04/2010, 23:36
 
Fecha de Ingreso: marzo-2009
Mensajes: 73
Antigüedad: 15 años
Puntos: 1
Respuesta: que tan seguro es mi login?

oh ok, primero que nada muchas gracias por tu tiempo.

no sabia que el hecho de usar session implicaba cookies, como no las usaba explisitamente. bueno eh seguido investigando y creo que implementare esto:

Código PHP:
    if (!isset($_SESSION['empeso']))
    {
        
session_regenerate_id();
        
$_SESSION['empeso'] = true;
    }
    if (isset(
$_SESSION['HTTP_USER_AGENT']))
    {
        if (
$_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'].'abcde'))
        {
            
header("location: error.php");
            exit;
        }
    }
    else
    {
        
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT'].'abcde');
    } 
que opinan de eso? cres que este mejor? eso iria al principio cad apagina que se visita. por ciero, en el post anterior olvide comentar que en cada pgina, para validar si el usr esta logeado pongo esto

Código PHP:
     if ( $_SESSION["PERFIL"]!=)
    { echo 
"zona restringida"; ....... 
respecto a XSS, te refiere a no desplegar texto en al pagina proveniente del port o get (por ejemplo) no? eso ya lo tengo implementado pero aun asi le dare una revisada a mi codigo para ves que no se me halla escapado alguna.

entonces que opinan?
por cierto, por "hashear" te refieres a cosas como md5? bueno se que la pregunta es unpoco obio pero por que lo recomiendas? que riesgos hay si no?

espero tengan tiempo de seguir respondiendome.
muchas gracias.
  #4 (permalink)  
Antiguo 16/04/2010, 00:30
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 15 años, 11 meses
Puntos: 16
Respuesta: que tan seguro es mi login?

Código PHP:
Ver original
  1. if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'].'abcde'))

che pero esta condicion siempre va a devolver un resultado distinto porque si $_SESSION['HTTP_USER_AGENT'] queda guardada como md5($_SERVER['HTTP_USER_AGENT'].'abcde') cuando vuelvas a comparar vas a tener el md5 del primer valor de $_SERVER['HTTP_USER_AGENT'] con el string y estas hasheando este valor en la comparacion

tenes que comprarolo sobre un valor que no modifique despues sino siempre van a ser distinto a manera de ejemplo
Código PHP:
Ver original
  1. $foo = 'samu';
  2. $foo = md5($foo.'std');
  3. if($foo != md5($foo.'std')){
  4.     //va a suceder siempre ya que md5($foo.'std') va a ser distinto a $foo
  5.     echo $foo;
  6. }
  7. echo '<br/>';
  8. echo md5($foo.'std'); // 3d92812bbfaee68cadce3dbc925b0657
  9. echo '<br/>';echo '<br/>';
  10. //Ahora seria distinto si la comparacion fuera
  11. if($foo == md5('samu'.'std')){
  12.     //en este caso va a dar true ya que $foo es igual a md5('samustd')
  13.     echo $foo;
  14. }
  #5 (permalink)  
Antiguo 16/04/2010, 01:34
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 15 años, 11 meses
Puntos: 326
Respuesta: que tan seguro es mi login?

Cita:
Iniciado por samu22 Ver Mensaje
Código PHP:
Ver original
  1. if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'].'abcde'))

che pero esta condicion siempre va a devolver un resultado distinto porque si $_SESSION['HTTP_USER_AGENT'] queda guardada como md5($_SERVER['HTTP_USER_AGENT'].'abcde') cuando vuelvas a comparar vas a tener el md5 del primer valor de $_SERVER['HTTP_USER_AGENT'] con el string y estas hasheando este valor en la comparacion
Yo esa parte la veo bien. No veo que vaya a devolver distinto. Imagina, si el agent es por ejemplo "Mozilla" (si, es mas largo, me da pereza!) y lo hasheas junto con abcde y lo guarda en sesisón. Luego comparar esa sesión con el navegar de nuevo, para evitar eso....

Yo hago algo parecido en mi login.

Concateno el user, el pass (en md5), la ip y lo guardo como "login". Si en algún momento cambia, te desloguea automáticamente :)
  #6 (permalink)  
Antiguo 16/04/2010, 01:54
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 15 años, 11 meses
Puntos: 16
Respuesta: que tan seguro es mi login?

Cita:
Iniciado por Eleazan Ver Mensaje
Yo esa parte la veo bien. No veo que vaya a devolver distinto. Imagina, si el agent es por ejemplo "Mozilla" (si, es mas largo, me da pereza!) y lo hasheas junto con abcde y lo guarda en sesisón. Luego comparar esa sesión con el navegar de nuevo, para evitar eso....

Yo hago algo parecido en mi login.

Concateno el user, el pass (en md5), la ip y lo guardo como "login". Si en algún momento cambia, te desloguea automáticamente :)
perdon, tenes razon, habia leido mal pense que estaba usando la variable de sesion para comprobar, y en realidad era la super global del servidor, por eso habia escrito eso
  #7 (permalink)  
Antiguo 16/04/2010, 20:38
 
Fecha de Ingreso: marzo-2009
Mensajes: 73
Antigüedad: 15 años
Puntos: 1
Respuesta: que tan seguro es mi login?

si, lo que pasa es que se esta comparando session contra server
lo de usar USR, PASS e IP es buena idea, tambien lo de desloguear.

entonces cren que con esas validaciones ya no me hackeen?

por ejmplo una ves que inicia sesion, en sesion guardo
$_SESSION["tipoUSR"] = "admin"

y en cada pagina de administrador comparo si esa variable de session tiene ese valor. cren que esto es seguro?

algun hacker podria cambiar el valor de la sesion?
por que hasta donde yo entendia las var de sesion se ejecutan del ladod el servidor por lo tanto creia que el hacker no tiene acceso a estas.
pero con lo que me comenta maycolalvarez temo que un hacker valla a oder cambiar facilmente de alguna manera el valor de $_SESSION["tipoUSR"] a como el convenga.

puede un usuario cambiar sus variables de session a voluntad?
  #8 (permalink)  
Antiguo 19/04/2010, 02:39
Avatar de Eleazan  
Fecha de Ingreso: abril-2008
Ubicación: Ibiza
Mensajes: 1.879
Antigüedad: 15 años, 11 meses
Puntos: 326
Respuesta: que tan seguro es mi login?

No tengo ni idea, no trabajo con esa variable casi :S

Pq no simplemente, después de comprobar que el login es correcto (y como lo comparas con la bbdd) obtienes de allí el "level" o tipo de user, o lo que quieras? Simplemente, vuelves a comprobar todo en cada página, y listo. Yo creo que así funcionaria

Etiquetas: login, seguro
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 19:25.