¿Porque se recomienda usar "data binding" en las consultas PDO de tipo SELECT sino van a introducir datos en la BD?
-
3Porque en un `SELECT...` **también puedes ser víctima de Inyección SQL**. Ver: http://es.stackoverflow.com/questions/10518/qué-es-la-inyección-sql-y-cómo-puedo-evitarla Imagina que tienes esto: `SELECT FROM tabla WHERE id_usuario=$POST['id_usuario'];` Tienes un formulario donde se introduce un `id_usuario` y mandas la consulta a la BD ¿verdad? . ¿Y si alguien escribe esto en el input del formulario? **`1; DELETE FROM unatabla; DELETE FROM otratabla; DELETE FROM oootratabla;`** Te imaginas lo que pasa en ese caso si no usas consultas preparadas (enviando los datos por databinding)? – A. Cedano Apr 02 '17 at 16:23
-
@A. Cedano eso se ve muy mal sí. Pasar una entrada directamente es peligroso... aunque para el caso concreto hay que conocer los nombres de las tablas. Por sistema me gusta aplicar filtros a todo lo que entra en el sistema aunque siempre se puede pasar algo que no se nos ocurra probar, entiendo que por eso se debe seguir las recomendaciones. – Orici Apr 02 '17 at 16:56
-
Hay tablas que son comúnes según el manejador de base de datos (tablas del sistema). Si envías la consulta con una conexión de usuario administrador cualquiera podría borrarte una de esas tablas. Pero por inyección SQL te pueden obtener la clave del administrador de la BD y muchas cosas más. Mira aquí sólo algunos ejemplos de lo que puede ocurrir: http://es.stackoverflow.com/a/53280/29967 Y lo que dices de los **filtros** es relativo, pues los mismos no son siempre eficaces a la hora de prevenir contra la inyección SQL. En la respuesta del enlace explico también algo sobre el asunto. Saludos. – A. Cedano Apr 02 '17 at 17:07
1 Answers
PDO significa exactamente “PHP Data Objects”, como veremos más adelante, se hace uso de la archiconocida programación orientada a objetos para PHP cuando quieres usar PDO. He de decir primero que si quieres usar eso debes tener una versión de PHP superior o igual a la 5.1, pero como creo que veréis lógico, no me voy a entretener ahora en eso.
¿Qué ventajas tiene con respecto a lo convencional?
Esta es una pregunta común y creo que de sencilla respuesta: TODO. Me explico, a través de PDO puedes manejar 12 tipos distintos de bases de datos (Oracle, MySQL, SqLite, etc…), puedes usar parámetros por nombre (ya veremos en futuros tutoriales lo que es) y puedes usar “prepared statements”. Pero lo más importante es la SEGURIDAD que ganas usando este “método”, al usar estas sentencias preparadas, que no son muy distintas a lo que se consigue a través de MySQL, usando mysql_real_escape_string();, pero que a mi parecer son más fáciles de entender combinadas con los parámetros por nombre.
Sin embargo, como se suele decir, no todo el monte es orégano, o no es oro todo lo que reluce, el rendimiento es un 2,5% peor al conseguido a través de MySQLite, lo que quiere decir que es un 2,5% más lento que este último, algo realmente insignificante, pero esto pretende ser algo objetivo y todo ha de ser dicho.
Fuente: http://codigoprogramacion.com/cursos/php-y-mysql/usar-pdo-en-php-introduccion.html#.WOyREojyiUk
- 247
- 1
- 13
-
1Me parece que @Orici no pregunta por las ventajas de PDO, sino por una característica particular de este, el `data binding` – Muriano Apr 11 '17 at 12:12
-
Hola, el aporte es interesante, me imaginaba que el rendimiento era inferior (hay que seleccionar la BD a la que conectar), creo que querías decir MySQLi y no MySQLite en este último párrafo. – Orici Apr 12 '17 at 21:16