Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/06/2013, 04:38
Avatar de guardarmicorreo
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!