Posible bug PHP 5.3.3

Iniciado por odeONeSs, 22 Agosto 2013, 00:06 AM

0 Miembros y 1 Visitante están viendo este tema.

odeONeSs

Hola buenas,

Programando un servicio web muy sencillo me he dado cuenta de que php hace algo muy raro. Puede ser el principio de un posible buffer overflow??? :S no se.. la verdad que nunca se me ha dado bien debuggear...

Os cuento:

en este código correspondiente a "fichero.php" recojo un parámetro get v e incluyo un "unarchivo.php" en el caso de que v sea igual a "2.0"

Código (php) [Seleccionar]
<?
$version=isset($_GET['v']) ? $_GET['v'] : '2.0' ;
if($version=='2.0'){
include('unarchivo.php');
}
?>


Al hacer la petición al fichero: http://localhost/fichero.php?v=2.0 todo va bien , se incluye correctamente "unarchivo.php"

Al hacer la petición al fichero: http://localhost/fichero.php?v=2.1 todo va bien , no se incluye

En cambio al hacer la petición http://localhost/fichero.php?v=2.00 de igual manera se incluye :SS

Continuando haciendo pruebas si se hace una petición  http://localhost/fichero.php?v=2.001 no se incluye.

Pero lo mas heavy de esto es que buscando los límites de esto haciendo la petición con 15 ceros trás el punto http://localhost/fichero.php?v=2.0000000000000001125

Se incluye admitiendo cualquier número detrás!!! (con letras no tira).

Alguien sabe que puede significar esto????

Gracias y Saludos!!

Cambio de firma de prueba

Stakewinner00

#1
añade otro = para que quede

   <?
   $version=isset($_GET['v']) ? $_GET['v'] : '2.0' ;
   if($version==='2.0'){
   include('unarchivo.php');
   }
   ?>


y no, no es un bug, es un error tuyo de programación xD.

La comparación con dos == solo mira si es igual y 2.0 si que es matemáticamente lo mismo que 2.00 y si le pones muchos decimales pues lo redondea a 2.0. En cambio con tres = le dices que tiene que ser idéntico, entonces 2.0 es igual pero no idéntico a 2.00 y por eso ya no salta

Dejo un post de un compañero del foro llamado drvy donde explicaba esto con más detalle.
http://www.drvy.net/blog/nunca-comparar-string-igual-php/

odeONeSs

Estoy de acuerdo , pero ese es otro tipo de operador

Operadores de comparación
Código (php) [Seleccionar]

Ejemplo Nombre Resultado

$a == $b Igual TRUE si $a es igual a $b después de la manipulación de tipos.
$a === $b Idéntico TRUE si $a es igual a $b, y son del mismo tipo.


El tema es que porqué interpreta el string "2.0" igual a "2.00000000000000012423434353454645645"

y te dice que "2.0" es diferente a "2.0001123131232131"

Y cuales pueden ser sus aplicaciones en seguridad.
Cambio de firma de prueba

Stakewinner00

Hace como las calculadoras, al tener un numero muy largo lo corta y listo. Pero con pocos decimales aun no decide recortar. Las calculadoras te mostraran 2.001 pero no te mostraran 2.00000000000000000000000000001 sino 2.0

En seguridad se puede aplicar como por ejemplo para hacer bypass de passwords como explica el post que deje en el comentario anterior

odeONeSs

Si , acabo de ver que lo has actualizado. Esta muy bien.

Pero vamos ya te digo yo que el 90% de las app open source se utiliza "==" a saco.

Por ejemplo:

https://github.com/WordPress/WordPress/search?q=%3D%3D&type=Code
Cambio de firma de prueba

Stakewinner00

#5
En ese caso no es un problema de seguridad ni de funcionalidad. Compara con las teclas, no conozco ninguna tecla que sea 39x o 37x y en los otros puede que haya algo que si que sea un problema de seguridad pero por lo general se compara con == cuando no es un problema de seguridad menos cuando se despistan como es obvio.


PD:También hay muchos con === https://github.com/WordPress/WordPress/search?p=2&q=%3D%3D%3D&type=Code

odeONeSs

No no, no te he puesto un ejemplo en concreto.

Solo he pegado una busqueda en github en el código de wordpress
Citar
We've found 346 code results

Gracias por la info de todas maneras, no sabía que WHK ya le había encontrado una aplicación.

Y recordar a todos los que lean esto. Igual no es lo mismo que idéntico (según php).

Saludos!
Cambio de firma de prueba