Estoy rediseñando un sitio web impulsado por PHP que utiliza una base de datos mínima. La versión original utilizaba "declaraciones pseudopreparadas" (funciones de PHP que incluían el reemplazo de parámetros y citas) para evitar ataques de inyección y separar la lógica de la base de datos de la lógica de la página.¿Cuándo * no * usar declaraciones preparadas?
Parecía natural reemplazar estas funciones ad-hoc con un objeto que usa PDO y declaraciones realmente preparadas, pero después de leerlas, no estoy tan seguro. PDO todavía parece una gran idea, pero uno de los principales puntos de venta de declaraciones preparadas es poder reutilizarlas ... lo que nunca haré. Aquí está mi configuración:
- Las declaraciones son todas trivialmente simples. La mayoría tiene el formato
SELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1
. La afirmación más compleja del lote es simplemente tres selecciones unidas junto conUNION ALL
s. - Cada visita a la página ejecuta a lo sumo una declaración y la ejecuta solo una vez.
- Estoy en un entorno alojado y, por lo tanto, receloso de cerrar de golpe sus servidores realizando personalmente "pruebas de resistencia".
Dado que el uso de declaraciones preparadas duplicará, como mínimo, el número de viajes de ida y vuelta a la base de datos que hago, ¿será mejor que los evite? ¿Puedo usar PDO::MYSQL_ATTR_DIRECT_QUERY
para evitar la sobrecarga de múltiples viajes a la base de datos mientras se conserva el beneficio de la parametrización y la defensa de inyección? ¿O las llamadas binarias utilizadas por la API de declaración preparada funcionan bastante bien en comparación con la ejecución de consultas no preparadas que no debería preocuparme por ello?
EDIT:
Gracias por todos los buenos consejos, amigos. Este es uno en el que me gustaría poder marcar más de una respuesta como "aceptada", muchas perspectivas diferentes. Al final, sin embargo, tengo que dar el rick a su debido ... sin su respuesta me habría ido felizmente y habría hecho completamente lo incorrecto incluso después de siguiendo el consejo de de todos. :-)
Declaraciones preparadas emuladas es!
** Tenga cuidado **: las instrucciones preparadas emuladas de PDO son vulnerables a la inyección de SQL si el conjunto de caracteres se modifica en tiempo de ejecución. Consulte [esta respuesta] (http://stackoverflow.com/a/60496/1862009) y [esta respuesta] (http://stackoverflow.com/a/12202218/1862009) para obtener una explicación. – toxalot
Es fácil: si * sabe * que la cadena proviene de su aplicación y no puede ser manipulada por un usuario, entonces no hay necesidad de declaraciones preparadas, porque no hay nada que inyectar. Si no está seguro (mal, pero en proyectos mayores no evitables) use una declaración preparada. –