Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Como mejorar clase sesion

Estas en el tema de Como mejorar clase sesion en el foro de Frameworks y PHP orientado a objetos en Foros del Web. estoy empezando con las sesiones en php ahora tengo este codigo algun consejo para mejorarlo? poder hacerlo mas seguro ??? le agadeceria sus consejos :p ...
  #1 (permalink)  
Antiguo 06/08/2008, 14:37
 
Fecha de Ingreso: julio-2008
Ubicación: México
Mensajes: 61
Antigüedad: 15 años, 9 meses
Puntos: 0
Como mejorar clase sesion

estoy empezando con las sesiones en php ahora tengo este codigo algun consejo para mejorarlo? poder hacerlo mas seguro ??? le agadeceria sus consejos :p
Código PHP:
require_once("class.mysql.php");

class 
session {
    
    function 
session($nick){
        
$db  = new db(); 
        
session_start();
        
$_SESSION['usuario'] = $nick;
        
$_SESSION['token'] = md5(rand().$_SESSION['usuario']);
        
$db->query("UPDATE usuarios SET token = '{$_SESSION['token']}' WHERE  nick = '{$nick}'");
        
$db->cierra();
    }
    
    public static function 
get_status() {
        
$dbs = new db();
        
session_start();
        
        if(!empty(
$_SESSION['usuario']) && !empty($_SESSION['token'])) {
              
$_SESSION['usuario'] = mysql_real_escape_string($_SESSION['usuario']);
              
$_SESSION['token'] = mysql_real_escape_string($_SESSION['token']);
            
            
$dbs->query("SELECT * FROM usuarios WHERE nick = '{$_SESSION['usuario']}' AND token = '{$_SESSION['token']}'");
            
              if(
$dbs->num_rows() == 1) {
                
$_SESSION['token'] = md5(rand().$_SESSION['usuario']);
                
$dbs->query("UPDATE usuarios SET token = '{$_SESSION['token']}' WHERE  nick = '{$_SESSION['usuario']}' ");
                
$db->cierra();
                return 
1;
              } 
              else {
                  
$db->cierra();
                
session_destroy();
                
header("Location: index.php");
                exit;
            }
        }
    }
    
    function 
logout(){
        
session_start();
        
session_unset();
        
session_destroy();
        
header ("location: index.php");
    } 
y asi lo inicio
Código PHP:
$usr = new session ("usuario");
session::get_status(); //asi lo reviso 

Última edición por libso; 06/08/2008 a las 14:46
  #2 (permalink)  
Antiguo 06/08/2008, 22:13
Avatar de emiliodeg  
Fecha de Ingreso: septiembre-2005
Ubicación: Córdoba
Mensajes: 1.830
Antigüedad: 18 años, 8 meses
Puntos: 55
Respuesta: Como mejorar clase sesion

yo agregaria un singleton para la conexion a la base de datos o en su defecto la guardaria en un atributo privado de la clase, para no llamar 2 o mas veces a la conexion
__________________
Degiovanni Emilio
developtus.com
  #3 (permalink)  
Antiguo 07/08/2008, 07:05
 
Fecha de Ingreso: julio-2008
Ubicación: México
Mensajes: 61
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Como mejorar clase sesion

ok gracias por el consejo :D
  #4 (permalink)  
Antiguo 07/08/2008, 11:26
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: Como mejorar clase sesion

Te hago algunas sugerencias partiendo del estándar de PHP:

  • Nombre de archivos de clases: de class.mysql.php a Mysql.php
  • Nombre de clase en mayusculas
  • Llaves de clase y métodos abajo (como dice el estándar)
  • Aunque los métodos sean por defecto públicos, usar la nomenclatura completa agregando "public"
  • Constructor con palabra reservada
  • Si siempre vas a usar la conexión con la bd, puede ser una relación de "asociación" y la conviertes en un atributo
  • Cambiaría el diseño agregando una clase SessionPersistencia, y MySQL por DB genérica, así no te atas a una base particular

Faltaría

- Agregar la clase Usuario, no manejar el nombre, siempre el objeto y pedirle al mismo el nombre (POO)

Va el ejemplo:

Código PHP:
<?php
/*Archivo: SessionPersistencia.php */

require_once 'Db.php';


class 
SessionPersistencia extends Db
{
    private 
$_db;
    
    public function 
__construct()
    {
        
$this->db  = new db();
    }
    
/*
     * etcétera, los demás métodos, todo en un archivo aparte
    */
    
}
Código PHP:
<?php
/*Archivo: Session.php*/

require_once 'SessionPersistencia.php';

class 
Session 
{   
    private 
$_persistencia;
    private 
$_usuario;
    private 
$_token;
    
    public function 
__construct($nombre_usuario null)
    {
        
session_start();
        
        
$this->_persistencia= new SessionPersistencia();
        
        if(!
is_null($nombre_usuario)){
            
$this->_usuario     = new Usuario($usuario);
            
$this->_token       $this->_generarToken($usuario);
            
            
/*
             * Dentro podrías actualizar los valores 
             * de sesión en conjunto con los de la base
             */
            
$_persistencia->update($this);            
        }
    }
    public function 
getUsuario()
    {
        return 
$this->_usuario;
    }
    public function 
getToken()
    {
        return 
$this->_token;
    }
    private function 
_generarToken($text)
    {
        return 
md5(rand().$text);
    }
    public 
statis function getStatus() 
    {
        
$session = new Session();
        
        if(!empty(
$_SESSION['usuario']) && !empty($_SESSION['token'])) {
              
            
$token $this->_persistencia->getToken($_SESSION['usuario']);

            if(
$_SESSION['token'] == $token){                
                
$this->_usuario = new Usuario($_SESSION['usuario']);
                
$this->_token   $this->_generarToken($usuario);            
                
$_persistencia->update($this);
            }else {
                exit;
            }
        }
    }
    public function 
__destruct()
    {
        
session_destroy();
        
header("Location: index.php");        
    }
}
?>
Forma de probarlo.

Código PHP:
<?php
$session 
= new Session ("usuario");

Session::getStatus(); 
?>
Se pueden hacer varias modificaciones al diseño, pero bueno, es un ejemplo medio rápido y pueden existir errores o detalles que hay que arreglar.

Espero que el ejemplo te permita tener otro punto de vista un poco distinto al que venías haciendo.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com

Última edición por enriqueplace; 08/08/2008 a las 07:35 Razón: Mal indentada una llave
  #5 (permalink)  
Antiguo 09/08/2008, 12:05
 
Fecha de Ingreso: julio-2008
Ubicación: México
Mensajes: 61
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Como mejorar clase sesion

:O muchas gracias, si ya tengo una mejor vision de esto voy a implementar y mejorar lo posteare para haber si alguien le puede servir gracias :D
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 16:02.