Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: dimitrix en 22 Diciembre 2011, 02:05 am



Título: Problema con (int)
Publicado por: dimitrix en 22 Diciembre 2011, 02:05 am
Tengo el siguiente código:

Código
  1. <?php
  2. (int)$suma;
  3. $suma="a";
  4. echo($suma);
  5. ?>

El problema es que me muestra por pantalla a y en ningún momento he dicho que quiero que deje de ser INT ¿Alguna forma para que me haga caso?


Título: Re: Problema con (int)
Publicado por: dark_sargon en 22 Diciembre 2011, 16:01 pm
PHP: Manipulación de tipos - Manual (http://php.net/manual/es/language.types.type-juggling.php)


Título: Re: Problema con (int)
Publicado por: dimitrix en 22 Diciembre 2011, 16:21 pm
Sí, eso me lo estudie antes de preguntar.

Lo que pasa es que 'forzar' que una variable sea siempre INT es algo muy bueno en cuanto a seguridad informática.

Y en el caso de otros lenguajes como C (creo recordar) no se puede meter una cadena a un INT.

Y como PHP está creado en C pienso que quizás si exista alguna forma.


Título: Re: Problema con (int)
Publicado por: dark_sargon en 22 Diciembre 2011, 16:31 pm
Ya te entiendo. Tienes razón, sería algo muy bueno para la seguridad.
Me interesa éste tema, voy a buscar a ver si encuentro algo. Si encuentras algo, publícalo por favor :)

Aunque se sabe que PHP actualiza el tipo de variable cada vez que se le asigna un valor a esta.

¿No se podría verificar el dato que entra antes de asignarlo?
Código
  1. <?php
  2.  $dato = "a";
  3.  if(gettype($dato)=="integer"){
  4.    $suma = $dato;
  5.    echo $suma;
  6.  }else{
  7.    echo "El dato debe ser un n&uacute;mero entero.";
  8.  }
  9. ?>


Título: Re: Problema con (int)
Publicado por: ZHOSS-9 en 22 Diciembre 2011, 20:22 pm
Lo que ha dicho dark es un buen método para seguridad, sí. Ese tema es interesante.
En cuanto al forzado de tipos:

Código
  1. <?php
  2.  
  3.       function suma() {
  4.  
  5.       $s1 = "2";
  6.       $s2 = "3";
  7.       echo "<br><br>";
  8.       echo "$s1 , $s2 <br><br>";
  9.  
  10.       // Nos devuelve dos string
  11.       echo gettype($s1);
  12.       echo " , ";
  13.       echo gettype($s2);
  14.       echo "<br>";
  15.  
  16.       $suma1 = $s1+$s2;
  17.       echo $suma1;
  18.       echo "<br>";
  19.  
  20.       // Ahora los convertimos a integer
  21.       $s1 = (int) $s1;
  22.       $s2 = (int) $s2;
  23.  
  24.       // Esto devuelve dos integer
  25.       echo gettype($s1);
  26.       echo " , ";
  27.       echo gettype($s2);
  28.       echo "<br>";
  29.       $suma1 = $s1+$s2;
  30.       echo $suma1;
  31.  
  32.       }
  33.  
  34.       suma();
  35.  
  36. ?>
  37.  
Puedes copiar el código y probarlo haciendo las rectificaciones que quieras.


En el ejemplo de dark, si haces

Código
  1. <?php
  2.   $dato = "a";
  3.     $dato = (int) $dato;
  4. ?>

$dato sería de tipo integer y valdría 0.


Título: Re: Problema con (int)
Publicado por: dimitrix en 22 Diciembre 2011, 22:48 pm
Sí, esas 'soluciones' ya las conozco y es las que utilizo, al igual que utilizo una función para FLOAT que además de volverte FLOAT te mira si han puesto coma en vez de punto, etc... además luego te la redondea a dos decimales así que por mucho código que metan es imposible que te hagan un XSS o SQLi.

Código
  1. function limpia_num($str){
  2. if(strpos($str, '.') < strpos($str,',')){
  3. $str = str_replace('.','',$str);
  4. $str = strtr($str,',','.');          
  5. }else{
  6. $str = str_replace(',','',$str);          
  7. };
  8. $str=(float)$str;
  9. $str=round($str,2);
  10.  
  11. return $str;
  12. };

Se le llama así:
Código
  1. <?php
  2. echo(limpia_num($_GET['ID']));
  3. ?>



El problema es que los informáticos (como todos), cometen errores y pueden olvidarse de usar la función en algún momento. Por eso estaría genial que se pudiera crear un INT que no si le meten texto diera 0.