Estrictamente hablando, en realidad no se necesita escaparse, porque el valor del parámetro nunca se interpola en la cadena de consulta.
La manera en que funcionan los parámetros de consulta es que la consulta se envía al servidor de la base de datos cuando llamó a prepare()
, y los valores de los parámetros se envían más tarde, cuando llamó al execute()
. Por lo tanto, se mantienen separados de la forma textual de la consulta. Nunca hay una oportunidad para inyección SQL (siempre que PDO::ATTR_EMULATE_PREPARES
sea falso).
Así que sí, los parámetros de consulta lo ayudan a evitar esa forma de vulnerabilidad de seguridad.
¿Son 100% de protección contra cualquier vulnerabilidad de seguridad? No claro que no. Como sabrá, un parámetro de consulta solo ocupa el lugar de un único valor literal en una expresión SQL. No se puede hacer una única sustitución de parámetros para una lista de valores, por ejemplo:
SELECT * FROM blog WHERE userid IN (?);
No se puede utilizar un parámetro para que los nombres de tabla o nombres de columna dinámicos:
SELECT * FROM blog ORDER BY ?;
Puede 't utilizar un parámetro para cualquier otro tipo de sintaxis SQL:
SELECT EXTRACT(? FROM datetime_column) AS variable_datetime_element FROM blog;
por lo que hay un buen número de casos en los que hay que manipular la consulta como una cadena, antes de la llamada prepare()
. En estos casos, aún necesita escribir el código cuidadosamente para evitar la inyección de SQL.
esto fue muy buena información. ¡gracias! – sqram
También 'LIKE?' Es válido, pero debe escapar de los caracteres utilizados para la coincidencia. –
Con respecto a "Nunca hay una oportunidad para la inyección SQL (siempre que PDO :: ATTR_EMULATE_PREPARES sea falso).", ¿Significa esto que las preparaciones emuladas con PDO NO son tan seguras como las preparaciones nativas del controlador db? Si es así, ¿por qué? –