Foros del Web » Programando para Internet » PHP »

para un login script, es necesario comparar el valor de $_SESSION?

Estas en el tema de para un login script, es necesario comparar el valor de $_SESSION? en el foro de PHP en Foros del Web. Estoy usando Código PHP:   if (isset( $_SESSION [ 'user' ])) { accion  }  pero quiero saber si es necesario comparar el valor de session, como en ...
  #1 (permalink)  
Antiguo 17/12/2011, 06:39
 
Fecha de Ingreso: marzo-2007
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 16
para un login script, es necesario comparar el valor de $_SESSION?

Estoy usando
Código PHP:
 if (isset($_SESSION['user'])) {accion 
pero quiero saber si es necesario comparar el valor de session, como en este caso:
Código PHP:
if (isset($_SESSION['user']=="valor")) {accion 
Mas que nada por cuestiones de seguridad, es necesario o con ver si la session fue seteada es suficiente? algun pro o contra?
  #2 (permalink)  
Antiguo 17/12/2011, 09:14
Avatar de linuxzero  
Fecha de Ingreso: noviembre-2011
Ubicación: Argentina
Mensajes: 778
Antigüedad: 12 años, 5 meses
Puntos: 160
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

Es depende de lo que necesites, si es necesario comparar valores lo haces, si no es necesario no lo haces, reside unicamente en que necesites hacer.
__________________
Si todo fuera tan sencillo como un symfony cc la vida seria más fácil.
http://phpnico.wordpress.com
  #3 (permalink)  
Antiguo 17/12/2011, 12:23
 
Fecha de Ingreso: marzo-2007
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

claro, en mi caso seria para un login
  #4 (permalink)  
Antiguo 17/12/2011, 12:29
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

para comparar si es administrador o un usuario normal o invitado o niveles podria ser si no no es necesario o si es x seguridad crea otra session a parte de esa

$token= creas un campo nuevo en la bd con una clave de seguridad encriptada y la muestras aki ,
$_SESSION['token'] = sha1($token);
esto en la verificacion del login


en el archivo
$token = 'clave que guardaste en la bd encriptada o la pones normal y encriptas aki';
if (isset($_SESSION['token']==$sha1($token))) {accion }

asi algo te podria servir de seguridad pero es tan solo un ejemplo esto se puede complicar muchisimo mas


tan solo son sugerencia para que veas por donde puedes moverte o plantearte nuevas cosas
  #5 (permalink)  
Antiguo 17/12/2011, 12:59
 
Fecha de Ingreso: marzo-2007
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

Osea comparar el valor agregaria un poco mas de seguridad cierto? Porque si no, al crear la session con el ID del usuario sacado de la base de datos, ya uno tendria acceso no mas a la cuenta que tiene ese ID. Y eso se haria con un mysqli_fetch_assoc por ejemplo. Esta bien eso?

Por otro lado, cuando uso $_SESSION['ID'] y el ahi lo saque de la base de datos, es buena idea encriptar el ID para la session?

No conozco metodos para que otra persona injecte algo al servidor y cree una session falsa, pero en caso de que sea posible, al crear una session encriptada la cosa podria ser distinta. Es comun hacer esto o no es necesario??

gracias
  #6 (permalink)  
Antiguo 17/12/2011, 13:09
Avatar de Chico3001  
Fecha de Ingreso: septiembre-2011
Ubicación: Mexico, DF
Mensajes: 112
Antigüedad: 12 años, 7 meses
Puntos: 12
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

No existe un metodo 100% seguro para evitar que alguien se te meta, lo unico que puedes hacer es complicarle las cosas a un atacante....

Una sesion es facil de encriptar (http://phpsec.org/projects/guide/1.html), y mas aun si dejas una variable obvia como "id" o "login" o "nivel", asi que lo usual ahora es crear un numero aleatorio (token) y guardarlo en la base de datos junto con los datos sensibles, despues al inicio de tu script solicitas ese token y lo comparas contra la base, asi puedes saber si la sesion es valida y que nivel tiene el usuario

Precisamente tengo una pregunta abierta sobre ese tema (http://www.forosdelweb.com/f18/llamada-duplicada-header-964815/), aqui te dejo lo que llevo de la rutina de comprobacion de seguridad, aun esta en desarrollo pero te puede servir para que te des una idea....

Código PHP:
if (!seguridad()) {
    
// Cierra la sesion y regresa a pagina de inicio
    
session_destroy();
    
$dir='entrar.php';
    
header("Location: $dir");
    die();
    } 
Código PHP:
// ***************************************************************************************
//        seguridad.- revisa que el usuario y su sesion se encuentren activas
function seguridad() {

    if(!isset(
$_SESSION['token'])) {

        global 
$self;
        
$ipv4 sprintf("%u"ip2long(getenv('REMOTE_ADDR')));

        
// Guarda variables en la lista negra para analisis posterior
        
$bd=Db::getInstance();

        
$sql="INSERT INTO config_listanegra (ip,intento,usuario,clave)
            VALUES ('$ipv4','0','$self','null')"
;
        
$bd->insertar_dato($sql);

        return 
FALSE;

    } else {

        return 
TRUE;

    }

  #7 (permalink)  
Antiguo 17/12/2011, 13:58
 
Fecha de Ingreso: marzo-2007
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

Como dijo webankenovi. Entonces al hacer login genero un token o numeros random y lo guardo temporalmente en la base de datos y lo asigno a la session pero tmb lo encripto y despues lo comparo. Osea que la session esta asegurada a un nivel mas. Que buena idea. Nunca lo hice. Que es lo mas comun para generar el token y de cuantos caracteres? 40? como el md5? Lo unico que tengo en cuenta es random(). Tu codigo "Chico3001" esta un poco avanzado para mi. Y si no me equivoco estas usando una clase cuando usas el simbolo -> y :: ? todavia estoy fresco con OOP

Gracias!
  #8 (permalink)  
Antiguo 17/12/2011, 14:10
Avatar de Chico3001  
Fecha de Ingreso: septiembre-2011
Ubicación: Mexico, DF
Mensajes: 112
Antigüedad: 12 años, 7 meses
Puntos: 12
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

md5 son 32 bytes... la clase solo me controla los accesos a la base de datos ya que tengo muchos archivos en mi aplicacion, pero si te sientes mas seguro usando funciones adelante.. es lo mismo

El token lo genero y lo registro de esta forma:

Código PHP:
            // Clave exitosa, se registra la sesion y se continua a la parte segura
            
unset($_SESSION['error']);
            
$token md5(uniqid(rand(), true));
            
$_SESSION['token'] = $token;

            
$sql "INSERT INTO config_listablanca (usuario, ip, token)
                    VALUES ('$usuario', '$ipv4', '$token')"
;
            
$bd->insertar_dato($sql);

            
header('Location: index2.php'); 

Última edición por Chico3001; 17/12/2011 a las 14:16
  #9 (permalink)  
Antiguo 17/12/2011, 14:45
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

paso a paso

1- logeamos y insertamos en el campo token del usuario un numero aleatorio

2- seleccionamos token de la bd y le damos valor como session ya encriptada

3- en cada pagina comparamos la session con el token de la bd ambos encriptados si no fallara


CHICO te lo explico bastante bien
  #10 (permalink)  
Antiguo 17/12/2011, 14:54
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

if (isset($_SESSION['token']==sha1($token))) {

if (isset($_SESSION['nivel']=="admin, usuario,invitado,cliente lo que gustes")) {

if (isset($_SESSION['user'])) {


accion


}
}
}

Última edición por webankenovi; 17/12/2011 a las 15:04
  #11 (permalink)  
Antiguo 17/12/2011, 17:32
 
Fecha de Ingreso: marzo-2007
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

muy bien gracias. lo voy a poner en practica.
  #12 (permalink)  
Antiguo 17/12/2011, 18:42
 
Fecha de Ingreso: marzo-2007
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

Me funciona, que les parece?

Código PHP:
function login_user ($email$password) {
    global 
$dbc;
    
$query"select count(email) as user, user_id from users where email='$email'and password='$password';";
    
$resultmysqli_query($dbc$query);
    
$row mysqli_fetch_array($result);
    if( 
$row['user']==1) {
        
$tokenuniqid(rand(),false);
                
$query"update users set token='$token' where user_id='".$row['user_id']."'";
        
$result=mysqli_query($dbc$query);
    }
}
login_user($email$password); 
Si creen que puede haber algo mas efectivo o mas rapido, me dicen! gracias.
  #13 (permalink)  
Antiguo 17/12/2011, 21:43
Avatar de Chico3001  
Fecha de Ingreso: septiembre-2011
Ubicación: Mexico, DF
Mensajes: 112
Antigüedad: 12 años, 7 meses
Puntos: 12
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

Me parece bien... solo que no veo que pases el token a la superglobal $_SESSION.... como lo revisas?
  #14 (permalink)  
Antiguo 18/12/2011, 10:22
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

function login_user ($email, $password) {
global $dbc;
$query= "select count(email) as user, user_id from users where email='$email'and password='$password';";
$result= mysqli_query($dbc, $query);
$row = mysqli_fetch_array($result);
if( $row['user']==1) {
$token= uniqid(rand(),false);
$query= "update users set token='$token' where user_id='".$row['user_id']."'";
$result=mysqli_query($dbc, $query);

if($result){
$_SESSION['token'] = $token;
}


}
}
login_user($email, $password);
  #15 (permalink)  
Antiguo 18/12/2011, 11:29
 
Fecha de Ingreso: marzo-2007
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

Si pegue el script equivocado porque tengo localhost y carpeta original. Falto sincronizar los archivos con Dreamweaver. Pero lo tengo asi (como dijo webankenovi):

Código PHP:

if( $result ) {
$_SESSION['token'] = $token;

Estar consultando la base de datos para validar al usuario cada vez que uno quiera ingresar al web, hace una diferencia significable en la velocidad de respuesta? o esto es solamente recomendable para altos niveles de usuarios?

Tengo otro script sin usar token y estaba pensando en que seria mas rapido, pero obviamente menos seguro, este es:

Código PHP:

//con esta funcion devuelvo la session 'user_id' si es que fue seteada previamente para seguir dando permisos.

function logged_in () {
    return isset(
$_SESSION['connection']);
}

//con esta funcion ejecuto un query para ver si el usuario existe, si existe devuelvo el user_id

function login_user ($email$password) {
    global 
$dbc;
    
$query"select count(email) as user, user_id from users where email='$email'and password='$password';";
    
$resultmysqli_query($dbc$query);
    
$row mysqli_fetch_array($result);
    if( 
$row['user']==1) { return sha1($row['user_id']);} else { return false; }
    

En mi login.php :

Código PHP:
<?php
session_start
();
include(
'func_users.php');

if (isset(
$_POST['email']) && isset($_POST['password'])) {
    
$email mysqli_real_escape_string($dbctrim($_POST['email']));
    
$password trim($_POST['password']);
    
    if(
$login=login_user ($email,$password)) {
        
$_SESSION['connection']=$login;
        
header('Location: index.php');
        exit();
        
        } else {
                
header('Location: index.php');
                exit();
                        }
    
    
    
    }



?>
  #16 (permalink)  
Antiguo 18/12/2011, 11:36
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

no tiene xq , por que solo validaras a la hora de logearse nada mas , obviamente sera menos seguro ese script si'
  #17 (permalink)  
Antiguo 18/12/2011, 11:42
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

tambien te digo que tu script de login es de los mas escasos que e visto (quiero decir basico) no creo que tengas problemas de velocidad , si vieras algunos scripts de login completos entonces te asustarias
  #18 (permalink)  
Antiguo 19/12/2011, 10:10
 
Fecha de Ingreso: marzo-2007
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

bueno pero uno esta revisando si la session fue creada constantemente o al menos cada vez que se cambie de pagina. Osea al principio de cada archivo uno se fija si la session fue seteada para permitir mostrar contenido privado, entonces si el token esta guardado en la base de datos y la session fue creada con el token, no tendria uno que comparar la session token con la base de datos token y si son iguales dar acceso o negarlo? Abria una consulta de base de datos cada vez que hace esta comparacion, no? (para estar seguro que entendi)

Por otro lado, que mas puede uno agregar para mas complejidad? que es comun aparte del token.

Estaba pensando en otra session con la direccion IP, ya que es unica.
  #19 (permalink)  
Antiguo 19/12/2011, 11:17
Avatar de Chico3001  
Fecha de Ingreso: septiembre-2011
Ubicación: Mexico, DF
Mensajes: 112
Antigüedad: 12 años, 7 meses
Puntos: 12
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

Efectivamente... al inicio de cada pagina necesitas comparar el token del cliente con el token almacenado en la base... si son iguales entonces permites el acceso

Por otro lado te falta la funcion contraria..... actualmente estas creando tokens y almacenandolos en la base de datos... sin embargo tambien tienes que pensar en una funcion automatica (ejecutada con un cronjob por ejemplo) que revise la base de datos y vaya eliminando automaticamente los tokens viejos... de lo contrario llegara un punto donde no importa el token que te den.. siempre estara vigente...
  #20 (permalink)  
Antiguo 19/12/2011, 11:36
 
Fecha de Ingreso: marzo-2007
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

Cuando inserto un token hago un sql "update" cuando cierro la session puedo simplemente dejar el token. Cuando el usuario regresa hago otro sql "update" y lo reemplazo. Dejar el token guardado en la base de datos, no es buena idea?

En caso de que no sea buena idea, podria instalar un javascript que al cerrar la ventana o hacer "logout" ejecute una function PHP con un query para eliminar el token.

Cita:
Por otro lado, que mas puede uno agregar para mas complejidad? que es comun aparte del token.

Estaba pensando en otra session con la direccion IP, ya que es unica.
  #21 (permalink)  
Antiguo 19/12/2011, 11:45
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

Cita:
Iniciado por eybel Ver Mensaje
bueno pero uno esta revisando si la session fue creada constantemente o al menos cada vez que se cambie de pagina. Osea al principio de cada archivo uno se fija si la session fue seteada para permitir mostrar contenido privado, entonces si el token esta guardado en la base de datos y la session fue creada con el token, no tendria uno que comparar la session token con la base de datos token y si son iguales dar acceso o negarlo? Abria una consulta de base de datos cada vez que hace esta comparacion, no? (para estar seguro que entendi)

Por otro lado, que mas puede uno agregar para mas complejidad? que es comun aparte del token.

Estaba pensando en otra session con la direccion IP, ya que es unica.
si lo entendiste bien

ahora al logearse creas token y guardas y al navegar compruebas y al finalizar session destruyes el token de la bd
  #22 (permalink)  
Antiguo 19/12/2011, 11:52
 
Fecha de Ingreso: marzo-2007
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

claro, la unica diferencia es que cuando cierran abruptamente la ventana del explorador tendria que usar javascript para ejecutar una function php que elimine el token de la base de datos, ya que la session se terminaria automaticamente al cerrarse (pero se podria igual, destruir).

Me podrian decir que otros metodos se podrian implementar? solo para tenerlos en cuenta a futuro... Cookies lo descarto. Pero IP seria buena idea?
  #23 (permalink)  
Antiguo 19/12/2011, 11:58
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

ip tambien podrias inplementarlo añadirias mas filtros (token,user,nivel,ip) esta bien si puedes hacerlo .

lo de el token de eliminar ay una manera mucho mejor

crea una tabla especifica de tokens , con id-token-time y ip si kieres

un script que compruebe si el usuario lleva sin navegar mas de x minutos y si es asi se destruye , entnces al navegqr los usuarios estaran ejeuctando dicho script todo el rato y asi eliminando tokens sin usar (no se si me entendiste)
  #24 (permalink)  
Antiguo 19/12/2011, 12:06
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

$token_controlador = time();
$token_segundos = 600;10minutos
$token_controlador_final = $token_controlador - $token_segundos;

/*borrar datos token mas de 10 min*/
mysql_query("delete from token where controlador < $controlador_controlador_final") or die ("pagina de error");

mas o menos esta es la idea para borrarlos , cualquier usuario ejecutara este script al navegar y borrara tokens sin usar en 10 minutos

podrias usarlo en una tabla nueva o en la misma de usuarios
  #25 (permalink)  
Antiguo 19/12/2011, 12:08
 
Fecha de Ingreso: marzo-2007
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

Si te entendi, pero tendria que ser un script que se ejecute automaticamente del lado del servidor. Como si fuera una tarea automatizada, cierto?

Chico3001 dijo
Cita:
(ejecutada con un cronjob por ejemplo)
se lo conoce asi?
  #26 (permalink)  
Antiguo 19/12/2011, 12:10
 
Fecha de Ingreso: marzo-2007
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

Ah osea los mismos usuarios tienen una tarea asignada de limpiar los tokens de la base de datos. Buena idea!
  #27 (permalink)  
Antiguo 19/12/2011, 12:11
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

no tiene xq pueden ser los usuarios de la web los que ejecuten ese script al navegar por tus paginas (ellos no lo sabran)

como si hablaramos de un sistema de usuarios online de ay lo e sacado yo la idea
  #28 (permalink)  
Antiguo 19/12/2011, 12:15
 
Fecha de Ingreso: marzo-2007
Mensajes: 782
Antigüedad: 17 años, 1 mes
Puntos: 16
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

Si si ahi te conteste pero creo que no viste la respuesta que puse.. muy buena idea! gracias por el dato, con esa idea podria hacer varios tipos de mantenimientos diarios
  #29 (permalink)  
Antiguo 19/12/2011, 12:22
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

esque contestamos a la vez jeje ya vi la respuesta si es asi , puedes llegar hacer cualquier cosa

yo lo hago en un sistema online los usuarios que navegan comprueban la tabla y si el controlador es mas de 10 minutos lo borro de la tabla de online
  #30 (permalink)  
Antiguo 19/12/2011, 12:49
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: para un login script, es necesario comparar el valor de $_SESSION?

cronjob tambien te valdria eso ya gustos

Etiquetas: login
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 13:06.