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

PHP OO Asegurar mis clases.

Estas en el tema de Asegurar mis clases. en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas tardes che! Por favor me dan una mano... que fallas en cuanto a seguridad tengo en mis clases? Soy medio nuevo, novato, principiante. Conecto ...
  #1 (permalink)  
Antiguo 03/01/2013, 15:28
 
Fecha de Ingreso: agosto-2009
Mensajes: 51
Antigüedad: 15 años, 4 meses
Puntos: 1
Asegurar mis clases.

Buenas tardes che!

Por favor me dan una mano... que fallas en cuanto a seguridad tengo en mis clases? Soy medio nuevo, novato, principiante.

Conecto a mis bases de datos con mi claseBaseDatos.php que es esta...

Código PHP:
<?php
class BaseDatos {
 private 
$HOSTNAME;
 private 
$BASEDATOS;
 private 
$USUARIO;
 private 
$CLAVE;
 private 
$CONEXION;
 private 
$QUERY;
 private 
$RESULT;
 private 
$ERROR;
/**
 * Constructor de la clase que inicia ls variables instancias de la clase
 * vinculadas a la coneccion con el Servidor de BD
 */
 
public function __construct(){
 
$this->HOSTNAME "localhost";
 
$this->BASEDATOS "registro";
 
$this->USUARIO "root";
 
$this->CLAVE"toor";
 
$this->RESULT=0;
 
$this->QUERY="";
 
$this->ERROR="";
 }
/**
 * Funcion que retorna una cadena
 * con una peque�a descripcion del error si lo hubiera
 *
 * @return cadena
 */
 
public function getError(){
 return 
$this->ERROR;


 }


/**
 * Inicia la coneccion con el Servidor y la Base Datos Mysql.
 * Retorna true si la coneccion con el servidor se pudo establecer y false en caso contrario
 *
 * @return boolean
 */
 
public function Iniciar(){
 
$conexion mysql_connect($this->HOSTNAME,$this->USUARIO,$this->CLAVE);
 if (
$conexion){
 if (
mysql_select_db($this->BASEDATOS,$conexion)){
 
$this->CONEXION $conexion;
 unset(
$this->QUERY);
 unset(
$this->ERROR);
 return 
true;
 } else {
 
$this->ERROR mysql_errno($conexion) . ": " mysql_error($conexion);
 return 
false;
 }
 }else{
 
$this->ERROR mysql_errno($conexion) . ": " mysql_error($conexion);
 return 
false;
 }
 }


/**
 * Ejecuta una consulta en la Base de Datos.
 * Recibe la consulta en una cadena enviada por parametro.
 *
 * @param cadena $consulta
 * @return boolean
 */
 
public function Ejecutar($consulta){
 unset(
$this->ERROR);
 
$this->QUERY $consulta;
 if( 
$this->RESULT mysql_query($consulta)){
 return 
true;
 } else {
 
$this->ERROR =mysql_errno$this->CONEXION) . ": " mysql_error$this->CONEXION);
 return 
false;
 }
 }


/**
 * Devuelve un registro retornado por la ejecucion de una consulta
 * el puntero se despleza al siguiente registro de la consulta
 *
 * @return unknown
 */
 
public function Registro() {


 if (
$this->RESULT){
 if(
$temp mysql_fetch_assoc($this->RESULT)) {
 return 
$temp;
 }else{
 
mysql_free_result($this->RESULT);
 return 
false;
 }
 }else{
 
$this->ERROR mysql_errno($this->CONEXION) . ": " mysql_error($this->CONEXION);
 return 
false;
 }
 }


/**
 * Devuelve el id de un campo autoincrement utilizado como clave de una tabla
 * Retorna el id numerico del registro insertado, devuelve null en caso que la ejecucion de la consulta falle
 *
 * @param cadena $consulta
 * @return id de la tupla insertada
 */
 
public function devuelveIDInsercion($consulta){
 unset(
$this->ERROR);
 
$this->QUERY $consulta;
 if (
$this->RESULT mysql_query($consulta)){
 
$id mysql_insert_id();
 return 
$id;
 } else {
 
$this->ERROR =mysql_errno$this->CONEXION) . ": " mysql_error$this->CONEXION);
 return 
null;
 }
 }


}
?>
Y la utilizo desde mis otras clases como por ejemplo para abm de una tabla de usuarios... mi claseUsuarios.php

En esta clase uno de mis errores es no comprobar si los id_usuario son enteros, no es cierto? Hay mas problemas?

Una vez leí que tenia que comprobar si el objeto BaseDatos no existia antes de crearlo... esto por que es?

Código PHP:
<?php
include_once "claseBaseDatos.php";

class 
Usuario{

    private 
$id_usuario;
    private 
$nombre;
    private 
$apellido;
    private 
$usuario;
    private 
$pass;
    private 
$rol;
    private 
$email;
    private 
$telefono;

    public function 
__construct(){
        
$this->idusuario "";
        
$this->nombre "";
        
$this->apellido "";
        
$this->usuario "";
        
$this->pass "";
        
$this->rol "";
        
$this->email "";
        
$this->telefono "";
    }
    public function 
cargar($id_usuario null$nombre$apellido$usuario$pass$rol$email$telefono){
        
$this->setIdUsuario($id_usuario);
        
$this->setNombre($nombre);
        
$this->setApellido($apellido);
        
$this->setUsuario($usuario);
        
$this->setPass($pass);
        
$this->setRol($rol);
        
$this->setEmail($email);
        
$this->setTelefono($telefono);
    }
    
    public function 
setIdUsuario($id_usuario){
        
$this->idusuario $id_usuario;
    }
    public function 
setNombre($nombre){
        
$this->nombre=$nombre;
    }
    public function 
setApellido($apellido){
        
$this->apellido=$apellido;
    }
    public function 
setUsuario($usuario){
        
$this->usuario=$usuario;
    }
    public function 
setPass($pass){
        
$this->pass=$pass;
    }
    public function 
setRol($rol){
        
$this->rol=$rol;
    }
    public function 
setEmail($email){
        
$this->email=$email;
    }
    public function 
setTelefono($telefono){
        
$this->telefono=$telefono;
    }
    
    public function 
getIdUsuario(){
        return 
$this->idusuario;
    }
    public function 
getNombre(){
        return 
$this->nombre;
    }
    public function 
getApellido(){
        return 
$this->apellido;
    }
    public function 
getUsuario(){
        return 
$this->usuario;
    }
    public function 
getPass(){
        return 
$this->pass;
    }
    public function 
getRol(){
        return 
$this->rol;
    }
    public function 
getEmail(){
        return 
$this->email;
    }
    public function 
getTelefono(){
        return 
$this->telefono;
    }
    
    public function 
Agregar(){
        
$base=new BaseDatos();
        
$consultaInsertar="INSERT INTO usuarios (id_usuario, nombre, apellido, usuario, pass, rol, email, telefono) VALUES ('".$this->getIdUsuario()."', '".$this->getNombre()."', '".$this->getApellido()."', '".$this->getUsuario()."', '".$this->getPass()."', '".$this->getRol()."', '".$this->getEmail()."', '".$this->getTelefono()."')";
        if(
$base->Iniciar()){

            if(
$base->Ejecutar($consultaInsertar)){                 
                return 
true;

            }    else {
                echo 
$base->getError();
                    return 
false;
                    
            }

        } else {
            echo 
$base->getError();
            return 
false;
            
        }
        
    }
    public function 
Buscar($id_usuario){
        
$base=new BaseDatos();
        
$consultaUsuario="SELECT * FROM usuarios WHERE id_usuario=".$id_usuario;
        
        if(
$base->Iniciar()){
            if(
$base->Ejecutar($consultaUsuario)){
                if(
$row2=$base->Registro()){
                    
                    
$this->setIdUsuario($row2['id_usuario']);
                    
$this->setNombre($row2['nombre']);
                    
$this->setApellido($row2['apellido']);
                    
$this->setUsuario($row2['usuario']);
                    
$this->setRol($row2['rol']);
                    
$this->setEmail($row2['email']);
                    
$this->setTelefono($row2['telefono']);
                    
                    return 
true;
                }                
            
             }    else {
                 echo 
$base->getError();
                 return 
false;
                 
            }
         }    else {
             echo 
$base->getError();
             return 
false;
             
         }            
    }
    public static function 
Listar($condicion){
        
$base=new BaseDatos();
        
$consultaListar="SELECT * FROM usuarios ";
        if (
$condicion!=""){
            
$consultaListar.=' WHERE '.$condicion;
        }
        
$consultaListar.=" ORDER BY id_usuario ";
        
        if(
$base->Iniciar()){
            if(
$base->Ejecutar($consultaListar)){                
                
$arreglo= array();
                while(
$row2=$base->Registro()){
                    
                    
$id_usuario= ($row2['id_usuario']);
                    
$nombre = ($row2['nombre']);
                    
$apellido = ($row2['apellido']);
                    
$nombre_usuario = ($row2['usuario']);
                    
$pass = ($row2['pass']);
                    
$rol = ($row2['rol']);
                    
$email = ($row2['email']);
                    
$telefono = ($row2['telefono']);
                
                    
$usuario=new Usuario();
                    
$usuario->cargar($id_usuario$nombre$apellido$nombre_usuario$pass$rol$email$telefono);
                    
array_push($arreglo,$usuario);
    
                }
                return 
$arreglo;
            
             }    else {
                 echo 
$base->getError();
                 return 
false;
                 
            }
         }    else {
             echo 
$base->getError();
             return 
false;
             
         }            
    }
    public function 
Eliminar(){
        
        
$base=new BaseDatos();
        if(
$base->Iniciar()){
            
$consultaBorra="DELETE FROM usuarios WHERE id_usuario=".$this->getIdUsuario();
        
            if(
$base->Ejecutar($consultaBorra)){
                    return 
true;
            }else{
                    echo 
$base->getError();
                    return 
false;
                    
                }            
        }else{
            echo 
$base->getError();
            return 
false;
            
        }
    }
    
    public function 
Actualizar(){
        
$base = new BaseDatos();
        
$consultaModifica="UPDATE usuarios SET nombre='".$this->getNombre()."', apellido='".$this->getApellido()."', usuario='".$this->getUsuario()."', pass='".$this->getPass()."', rol='".$this->getRol()."', email='".$this->getEmail()."', telefono='".$this->getTelefono()."' WHERE id_usuario="$this->getIdUsuario();
        if(
$base->Iniciar()){
            if(
$base->Ejecutar($consultaModifica)){
                return 
true;
            }else{
                echo 
$base->getError();
                return 
false;
                
            }
        }else{
            echo 
$base->getError();
            return 
false;
            
        }
    }
}
?>

Saludos! Gracias!!
  #2 (permalink)  
Antiguo 03/01/2013, 15:35
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 5 meses
Puntos: 793
Respuesta: Asegurar mis clases.

Anuncio: Extensión MySQL obsoleta y tienes problemas de inyección SQL.

Muchos recomiendan que se use PDO y Sentencias preparadas
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #3 (permalink)  
Antiguo 03/01/2013, 16:25
 
Fecha de Ingreso: agosto-2009
Mensajes: 51
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: Asegurar mis clases.

Ok... gracias!... ya lo estoy leyendo.

Y a corto plazo... puedo hacer algo para evitar la inyeccion sql? Ademas de transformar en enteros los id...
  #4 (permalink)  
Antiguo 03/01/2013, 16:35
Avatar de andresdzphp
Colaborador
 
Fecha de Ingreso: julio-2011
Ubicación: $this->Colombia;
Mensajes: 2.749
Antigüedad: 13 años, 5 meses
Puntos: 793
Respuesta: Asegurar mis clases.

Debes aprender a usar PDO (o Mysqli) ya que las funciones mysql_* son obsoletas. Te recomendaría que usaras la función mysql_real_escape_string (antes usada para evitar inyecciones SQL), pero va a quedar obsoleta en PHP 5.50 y removida en el futuro.

En el mismo manual lo advierten:

Cita:
This extension is deprecated as of PHP 5.5.0, and will be removed in the future. Instead, the MySQLi or PDO_MySQL extension should be used.
__________________
Si sabemos como leer e interpretar el manual será mucho más fácil aprender PHP. En lugar de confiar en ejemplos o copiar y pegar - PHP
  #5 (permalink)  
Antiguo 04/01/2013, 11:16
 
Fecha de Ingreso: agosto-2009
Mensajes: 51
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: Asegurar mis clases.

Ok... muchas gracias.

A leer entonces...

Saludos!

Etiquetas: clases, php, usuariosphp, bases-de-datos
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 10:29.