Foros del Web » Programando para Internet » PHP »

problema al recorrer foreach

Estas en el tema de problema al recorrer foreach en el foro de PHP en Foros del Web. estoy trabajando en un validador, el primer paso consiste en que verifique si el usuario y el email introducidos contienen sql injection, por lo que ...
  #1 (permalink)  
Antiguo 07/06/2013, 04:38
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
problema al recorrer foreach

estoy trabajando en un validador, el primer paso consiste en que verifique si el usuario y el email introducidos contienen sql injection, por lo que primero instancio la clase y la reproduzco así

controlador.php
-
Código PHP:
Ver original
  1. function validar($usuario, $email, $passwd, $passwd2, $nombre)
  2.     {
  3.         //creo una instancia para obtener un usuario, una contraseña y un email existentes
  4.         $usuario_class = new Validar($usuario, $email, $passwd, $passwd2);
  5.        
  6.         //compruebo que el usuario no contiene sql injection
  7.         $validar_usuario = $usuario_class->seguridad_patrones();
  8.         foreach($validar_usuario as $informe)
  9.         {
  10.            
  11.             echo $informe ['usuario']. "<br>"; //esta es la línea 316
  12.             echo $informe ['email']; //esta es la línea 317
  13.         }
  14.     }

en la clase tengo el siguiente código

Código PHP:
Ver original
  1. class Validar extends Conectar
  2. {
  3.     ///////////////////////////
  4.     //declaro las variables
  5.     ///////////////////////////
  6.    
  7.     //variables que contienen los valores que el usuario introduce
  8.     private $usuarioc;
  9.     private $emailc;
  10.     private $passwdc;
  11.     private $passwd2c;
  12.    
  13.     //arrays que contienen la consulta en base de datos
  14.     // y la salida según la validación (true o false)
  15.     private $arr = array();
  16.     private $salida = array();
  17.    
  18.     //variables para devolver si el usuario, email, passwd y passwd2
  19.     //son correctos según comprobación anti sql injection
  20.     private $validar = array();
  21.    
  22.     //resultados de la búsqueda con los patrones en los parámetros
  23.     private $res;
  24.     private $res2;
  25.     private $res3;
  26.     private $res4;
  27.     private $res5;
  28.    
  29.     //////////////////////////////////////////
  30.     //patrones para buscar palabras prohibidas
  31.     //////////////////////////////////////////
  32.    
  33.     //patrones para evitar email injection
  34.     private $seguridad_email =
  35.     array(
  36.         "Content-Type:",
  37.         "MIME-Version:",
  38.         "Content-Transfer-Encoding:",
  39.         "Return-path:",
  40.         "Subject:",
  41.         "From:",
  42.         "Envelope-to:",
  43.         "To:",
  44.         "bcc:",
  45.         "cc:",
  46.         );
  47.        
  48.     //patrones para evitar sql injection
  49.     private $seguridad_sql =
  50.     array (
  51.         "UNION",
  52.         "DELETE",
  53.         "DROP",
  54.         "SELECT",
  55.         "INSERT",
  56.         "UPDATE",
  57.         "CRERATE",
  58.         "TRUNCATE",
  59.         "ALTER",
  60.         "INTO",
  61.         "DISTINCT",
  62.         "GROUP BY",
  63.         "WHERE",
  64.         "RENAME",
  65.         "DEFINE",
  66.         "UNDEFINE",
  67.         "PROMPT",
  68.         "ACCEPT",
  69.         "VIEW",
  70.         "COUNT",
  71.         "HAVING",
  72.         "'",
  73.         '"',
  74.         "{",
  75.         "}",
  76.         "[",
  77.         "]",
  78.         );
  79.     //patrones para evitar direcciones web
  80.     private $seguridad_url =
  81.     array (
  82.         "HOTMAIL",
  83.         "WWW",
  84.         ".COM",
  85.         "@",
  86.         "W W W",
  87.         ". c o m",
  88.         "http://",
  89.         );
  90.     //patrones para evitar variables y comodines
  91.     private $seguridad_varcom =
  92.     array("$",
  93.         "&",
  94.         "*",
  95.     );
  96.    
  97.     //aplico el constructor que recibe los parámetros del usuario
  98.     public function __construct( $usr, $emil, $paswd, $paswd2 )
  99.     {
  100.         $this->usuarioc = $usr;
  101.         $this->emailc = $emil;
  102.         $this->passwdc = $paswd;
  103.         $this->passwd2c = $paswd2;
  104.     }
  105.    
  106.     //primero reviso los parámetros asegurando que no contengan sql injection
  107.    
  108.     //valido el usuario contra sql injection
  109.     public function seguridad_patrones()
  110.     {
  111.         //reviso el usuario
  112.         $this->res = stripos ( $this->usuarioc , "FROM:");
  113.         if ( $this->res === false )
  114.         {
  115.             $this->validar['usuario'] = "usuario no contiene sql injection";
  116.         }
  117.         else
  118.         {
  119.             $this->validar['usuario'] = "usuario contiene sql injection";
  120.         }
  121.        
  122.         //reviso el email
  123.         $this->res2 = stripos ( $this->emailc , "FROM:" );
  124.         if ( $this->res2 === false )
  125.         {
  126.             $this->validar['email'] = "email no contiene sql injection";
  127.         }
  128.         else
  129.         {
  130.             $this->validar['email'] = "email contiene sql injection";
  131.         }
  132.        
  133.         return $this->validar;
  134.         //reviso el passwd
  135.        
  136.     }
  137. }

me devuelve los siguientes errores

Cita:
Warning: Illegal string offset 'usuario' in C:\xampp\htdocs\xampp\web\poo\controlador.php on line 316
u

Warning: Illegal string offset 'email' in C:\xampp\htdocs\xampp\web\poo\controlador.php on line 317
u
Warning: Illegal string offset 'usuario' in C:\xampp\htdocs\xampp\web\poo\fcontrolador.php on line 316
e

Warning: Illegal string offset 'email' in C:\xampp\htdocs\xampp\web\poo\controlador.php on line 317
e
las líneas 316 y 317 están indicadas en el documento controlador.php

no entiendo el problema, puesto que he leido sobre este problema y me dice que se debe a que a partir de php 5.4 hay que indicar los indicadores de los arrays con enteros o string de entero, entonces hice lo siguiente tanto en el código del controlador como en el de la clase

Código PHP:
Ver original
  1. //en el controlador cambié los indicadores 'usuario' e 'email' por [1] y [2] respectivamente
  2.  
  3.         foreach($validar_usuario as $informe)
  4.         {
  5.            
  6.             echo $informe [1]. "<br>";
  7.             echo $informe [2];
  8.         }
  9.  
  10. //en la clase hice lo mismo
  11.  
  12. public function seguridad_patrones()
  13.     {
  14.         //reviso el usuario
  15.         $this->res = stripos ( $this->usuarioc , "FROM:");
  16.         if ( $this->res === false )
  17.         {
  18.             $this->validar[1] = "usuario no contiene sql injection";
  19.         }
  20.         else
  21.         {
  22.             $this->validar[1] = "usuario contiene sql injection";
  23.         }
  24.        
  25.         //reviso el email
  26.         $this->res2 = stripos ( $this->emailc , "FROM:" );
  27.         if ( $this->res2 === false )
  28.         {
  29.             $this->validar[2] = "email no contiene sql injection";
  30.         }
  31.         else
  32.         {
  33.             $this->validar[2] = "email contiene sql injection";
  34.         }
  35.        
  36.         return $this->validar;
  37.         //reviso el passwd
  38.        
  39.     }

no me devuelve ningún error pero me devuelve solo esto

Cita:
s
um
a
no entiendo de qué cadena sale eso, pero no lo tengo en ninguna cadena.

¿alguien me puede ayudar?

gracias!
  #2 (permalink)  
Antiguo 07/06/2013, 04:44
 
Fecha de Ingreso: abril-2012
Mensajes: 590
Antigüedad: 12 años, 7 meses
Puntos: 58
Respuesta: problema al recorrer foreach

Para evitar SQL Injections lo puedes hacer mucho más facil con mysqli o algún framework simplemente escapando las consultas. No hace falta tanto lío.

Para acceder al elemento de un objeto es con object->nombre no object['nombre'] (esto es para arrays).

Cuando haces el foreach estás seguro de que eso es una lista de objetos de tipo Validar o estas haciendo un foreach de un objeto validar? porque entonces normal que no te coja los campos porque en $informe estás cogiendo cada uno de los campos de validar.

Además, el campo nombre es privado por lo que veo porque no puedes acceder haciendo un $informe->nombre. Tendrás que hacer un "getter" que devuelva ese atributo, ya que es privado.
  #3 (permalink)  
Antiguo 07/06/2013, 04:52
Avatar de guardarmicorreo  
Fecha de Ingreso: noviembre-2012
Ubicación: Córdoba
Mensajes: 1.153
Antigüedad: 12 años
Puntos: 84
Respuesta: problema al recorrer foreach

Cita:
Iniciado por alyciashape Ver Mensaje
Para evitar SQL Injections lo puedes hacer mucho más facil con mysqli o algún framework simplemente escapando las consultas. No hace falta tanto lío.
gracias por el consejo, pero he pensado que para aprender no es bueno utilizar frameworks.
Cita:
Para acceder al elemento de un objeto es con object->nombre no object['nombre'] (esto es para arrays).
eso sí lo se, pero yo no estoy accediendo al elemento de un objeto, estoy accediendo al return de un array, si te fijas en la línea 133 hay un return $this->validar;

Cita:
Cuando haces el foreach estás seguro de que eso es una lista de objetos de tipo Validar o estas haciendo un foreach de un objeto validar? porque entonces normal que no te coja los campos porque en $informe estás cogiendo cada uno de los campos de validar.
no, es de un array retornada desde la clase Validar.

Cita:
Además, el campo nombre es privado por lo que veo porque no puedes acceder haciendo un $informe->nombre. Tendrás que hacer un "getter" que devuelva ese atributo, ya que es privado.
ya, es privado accediéndolo desde fuera, pero yo lo retorno desde dentro de la clase, por lo que creo que no hay problema con eso no?

gracias por tu ayuda! a ver si podemos resolver esto :D

Etiquetas: foreach, resultados, select, sql, variables
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 22:42.