PHP - Dato inesperado en prepare() de mysqli y PDO (algun bug?)

 
Vista:
sin imagen de perfil

Dato inesperado en prepare() de mysqli y PDO (algun bug?)

Publicado por Armando (2 intervenciones) el 12/12/2014 06:36:45
Buenas noches que tal espero me puedan ayudar con esta tema que me esta quitando la tranquilidad , por su atención gracias.
Tengo una duda referente al tema de sentencias preparadas de mysqli y PDO.
En "mysql" tengo la tabla de "usuarios" con los siguientes campos:

1
id_usuario
1
nombre
1
telefono
1
email
1
password

Y el método del la clase en php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public function editUsers()
{
	$connection = self::connect(); //recibo la instancia de la clase mysqli
	$sql = "SELECT nombre, telefono, email, password from usuarios WHERE id_usuario = ?";
	$stmt = $connection->prepare($sql);
	$stmt->bind_param("i", $id_usuario);
	$id_usuario = $_GET["id"];
 
	$stmt->execute();
	$stmt->store_result();
	if ($stmt->num_rows) {
		$stmt->bind_result($nombre, $apellido, $telefono, $email, $password);
 
		while ($stmt->fetch())  {
			$this->row = array($nombre, $apellido, $telefono, $email, $password);
		}
 
		$stmt->free_result();
		$stmt->close();
		$connection->close();
		return $this->row;
		} else {
			return 0;
	}
}

El punto aquí es que al realizar una búsqueda de algún usuario de la tabla por medio de su id como en este ejemplo:
1
http://localhost/php/php-poo/mysqli/editar.php?id=1

me devuelve los datos correctamente de acuerdo al usuario que almacena ese "id" o el que corresponda. Pero, si por ejemplo yo a la url le agrego esto:

1
http://localhost/php/php-poo/mysqli/editar.php?id=1rtt.232

O cualquier combinación de caracteres, siempre y cuando aparezca un número antes, pero que este id corresponda a algún usuario. Entonces la consulta se llevaría acabo y bueno lógicamente no me devolvería nada porque no coincide, pero saben me lleve la sorpresa de que me entrega los resultados de ese usuario, en este caso del id "1" o cualquier otro id que maneje, y buscando no encuentro la razón y bueno por curiosidad, intente hacer el código pero sin usar sentencias preparadas si no hacer directamente esto

1
query("SELECT nombre, telefono, email, password from usuarios WHERE id_usuario = ".$_GET['id']."");

y usando estos ejemplos
1
http://localhost/php/php-poo/mysqli/editar.php?id=1rtt.232
1
http://localhost/php/php-poo/mysqli/editar.php?id=1ddfds
1
http://localhost/php/php-poo/mysqli/editar.php?id=1.0fssd

entones si que no me devuelve nada la consulta.
Espero haber podido explicarme bien y de igual forma si alguien tiene alguna respuesta lógica
que me pueda ayudar porque estoy algo confuso sobre todo porque se supone que evitan las inyecciones de código...
Por su atención muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Dato inesperado en prepare() de mysqli y PDO (algun bug?)

Publicado por xve (6935 intervenciones) el 12/12/2014 08:54:06
Hola Armando, es bien curioso, yo desde hace mucho tiempo utilizo PDO con interrogantes, y nunca me habia dado cuenta de ello.

De la manera que lo utilizas, PDO sanitiza los valores, es decir, si espera un entero, no permite caracteres que no sean números, si espera texto, gestiona el tema de las comillas, etc... todo esto para impedir el SQLInjection.

Entiendo que lo que hace, es que como sabe que el campo id de la base de datos es un entero, convierte el valor a entero, y se queda con el valor 1.

Si haces esto en PHP, te devolverá únicamente el valor 1
1
2
$a="1a35";
echo (int)$a;

Entiendo que es por esto...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Dato inesperado en prepare() de mysqli y PDO (algun bug?)

Publicado por Armando (2 intervenciones) el 12/12/2014 10:13:43
Hola xve, agradezco que te hallas tomado el tiempo de leer y responder el problema que tenia y digo tenia, porque lo que escribiste me parece muy lógico, y es verdad que al hacer esto en php:

1
2
$a="1a35";
echo (int)$a;

te devuelve el valor 1 como entero.

Ahora me queda más claro como es que se gestionan los datos para evitar el SQLInjection
Muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar