elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  [Pregunta]: ¿Qué estoy haciendo mal con esta consulta PDO?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Pregunta]: ¿Qué estoy haciendo mal con esta consulta PDO?  (Leído 6,356 veces)
Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
[Pregunta]: ¿Qué estoy haciendo mal con esta consulta PDO?
« en: 4 Mayo 2021, 00:21 am »

Estoy mejorando todas mis consultas, antes usaba este método:

Código anterior (siempre use esto y funciona correctamente), como "dato curioso" en esta consulta sino concateno '.($by).' no me devuelve datos, es decir que no puedo usar :by en la consulta. No entiendo por qué (si me pudieran ayudar con eso también)
Código
  1. $con = Connection(USERNAME, PASSWORD);
  2. $query = $con->prepare('SELECT id_album FROM albums WHERE '.($by).' = :by_value');
  3. $query->execute(array(':by_value' => $by_value));
  4. $results = $query->fetchAll();
  5.  

Pero viendo un poco parece ser que hacerlo de la siguiente manera es más eficiente y seguro:
Pero me dice "Uncaught Error: Call to a member function bindParam() on bool" busqué el error pero veo ninguna relación con lo que escribí, lo ví varias veces pero parece que todo está correcto.
Código
  1. $con = Connection(USERNAME, PASSWORD);
  2. $query = $con->prepare('SELECT id_album FROM albums WHERE :by = :by_value');
  3. $query = $con->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  4. $query->bindParam(':by', $by);
  5. $query->bindParam(':by_value', $by_value);
  6. $query->execute();
  7. $results = $query->fetchAll();
  8.  


En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: [Pregunta]: ¿Qué estoy haciendo mal con esta consulta PDO?
« Respuesta #1 en: 4 Mayo 2021, 00:43 am »

No creo que puedas parametrizar esa parte de la query. Hasta donde yo tengo entendido solo los valores, no los campos. Quizás se pueda hacer algo con la tabla de metadatos de MySQL pero no lo recomendaría.

El error sin embargo es porque PDO::setAtribute regresa true/false, así que ahí te cargas $query. Simplemente no guardes el resultado de esa función en $query... pero como te dije, no creo que puedas parametrizar esa parte de la query.

Y de la otra forma tienes que estar completamente seguro del contenido de $by porque ahí fácilmente tienes SQLi.


En línea

Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
Re: [Pregunta]: ¿Qué estoy haciendo mal con esta consulta PDO?
« Respuesta #2 en: 4 Mayo 2021, 20:21 pm »

Entonces tampoco se puede parametrizar los limites en una consulta, no?

Código
  1. "... ORDER BY id_x DESC LIMIT :start, :quantity"
  2.  

donde start es 0, y quantity es 10.
En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: [Pregunta]: ¿Qué estoy haciendo mal con esta consulta PDO?
« Respuesta #3 en: 4 Mayo 2021, 22:57 pm »

Al parecer creo que eso es posible. Creo que me equivoque cuando dije que solo podemos parametrizar valores... sobre todo cuando emulas los prepared statements. Pero al parecer nombres de columnas (o al menos usar un placeholder para multiples columnas) no es posible.
En línea

Leguim


Desconectado Desconectado

Mensajes: 720



Ver Perfil
Re: [Pregunta]: ¿Qué estoy haciendo mal con esta consulta PDO?
« Respuesta #4 en: 5 Mayo 2021, 01:36 am »

No creo que te hayas equivocado, esa consulta de los LIMIT :x, :y no funciona a no ser que concatene LIMIT '.($x).', '.($y)

No sé si se podría arreglar esta vulnerabilidad de inyecciones para estas variables que quedarán concatenadas, con alguna función para "limpiar". Para este caso puedo decir si es numerico x e y pero ya cuando la variable es una cadena se complica.
En línea

MinusFour
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.529


I'm fourth.


Ver Perfil WWW
Re: [Pregunta]: ¿Qué estoy haciendo mal con esta consulta PDO?
« Respuesta #5 en: 5 Mayo 2021, 03:40 am »

No creo que te hayas equivocado, esa consulta de los LIMIT :x, :y no funciona a no ser que concatene LIMIT '.($x).', '.($y)

No sé si se podría arreglar esta vulnerabilidad de inyecciones para estas variables que quedarán concatenadas, con alguna función para "limpiar". Para este caso puedo decir si es numerico x e y pero ya cuando la variable es una cadena se complica.

Hay ejemplos en SO donde si funciona, pero tienes que especificar PDO::PARAM_INT al parámetro con PDOStatement::bindValue. En la misma documentación de MySQL hace mención que esto es posible. No veo porque el driver no lo habría de tomar en cuenta.
« Última modificación: 5 Mayo 2021, 03:42 am por MinusFour » En línea

WHK
Moderador Global
***
Desconectado Desconectado

Mensajes: 6.589


Sin conocimiento no hay espíritu


Ver Perfil WWW
Re: [Pregunta]: ¿Qué estoy haciendo mal con esta consulta PDO?
« Respuesta #6 en: 6 Mayo 2021, 18:42 pm »

Hola, cuando dices:

Citar
no me devuelve datos

Es porque no tienes un error en la programación de tu código sino en el resultado de la consulta SQL.

Has probado realizar la consulta SQL manualmente a tu base de datos para comprobar que realmente te deba retornar valores?, por otro lado debes tener cuidado porque cuando parametrizas valores este aplica secuencias de escapes y encierra los valores en comillas simples, aplicar esto al nombre de una columna puede perjudicar la query final, no creo que sea una buena práctica hacer que el nombre de la columna sea dinámica, para eso te recomiendo mejor que tengas clases de php diferentes para cada caso, o sea, un modelo de datos por cada tabla y si necesitas repetir funciones como por ejemplo un crud (consultar, editar, eliminar) entonces debes hacer una clase base y extenderla.

Por otro lado, si $by fuera una constante de tipo string y la pasaras directamente sin parametrizar entonces no debería haber problemas, pero veo que lo estás haciendo de manera dinámica porque probablemente en tu proyecto web el usuario final el le pasa el nombre de la tabla por parámetro get o post y eso es una pésima práctica y extremadamente peligroso y la parametrización no te va a salvar de esa inyección porque los nombres de columnas no usan comillas simples sino apóstrofes "`" e incluso puntos para concatenar la raiz del origen, incluso guión bajo en caso de sql server, y la secuencia de escape de caracteres para "valores" no es la misma que para "nombres de tablas":

https://stackoverflow.com/questions/182287/can-php-pdo-statements-accept-the-table-or-column-name-as-parameter

Citar
Table and Column names CANNOT be replaced by parameters in PDO.

Creo que en ves de buscar la manera de hacer funcionar tu query debes enfocarte en replantear el diseño de arquitectura de tu aplicación y reconstruir esa funcionalidad.

Saludos.
« Última modificación: 6 Mayo 2021, 18:48 pm por WHK » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
programa de matriz aver si el programa q estoy haciendo esta bien « 1 2 »
Programación C/C++
eduardo17445 10 6,738 Último mensaje 23 Octubre 2012, 00:11 am
por flony
quisiera que me digeran si este foro q estoy haciendo esta bien c++
Programación C/C++
eduardo17445 4 2,655 Último mensaje 3 Diciembre 2012, 20:17 pm
por flony
[Pregunta]: Ejecutar esta consulta constantemente
PHP
Leguim 2 3,164 Último mensaje 15 Noviembre 2019, 00:17 am
por [u]nsigned
[Pregunta]: ¿Cómo puedo hacer esta consulta?
Bases de Datos
Leguim 6 4,830 Último mensaje 22 Abril 2021, 05:24 am
por Leguim
[Pregunta]: ¿Cómo hacer esta consulta 2?
Bases de Datos
Leguim 0 3,140 Último mensaje 23 Abril 2021, 00:07 am
por Leguim
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines