FlawOpen

flawopen.com/SQL Injection/¿Qué es una consulta parametrizada?

¿Qué es una consulta parametrizada, en términos sencillos?

Página de referencia
En términos simples

Piensa en un formulario con campos etiquetados: el programa mantiene fijas las instrucciones y pide a la biblioteca de base de datos que coloque cada valor en su campo. La biblioteca puede usar preparación nativa en el servidor o emularla en el cliente, pero el código no debe reescribir las instrucciones con datos del usuario.

El mecanismo

Con una sentencia preparada de forma nativa en el servidor, el controlador prepara el SQL con marcadores y proporciona los valores enlazados al ejecutarla. El protocolo y el momento dependen de la base de datos y del controlador. Algunos controladores pueden emular la preparación en el cliente; PDO documenta ese modo expresamente. Por eso, la llamada a la API por sí sola no indica cómo viaja el valor. Mantén fija la estructura SQL, usa la API de enlace documentada por el controlador y comprueba si está activo el modo nativo o el emulado.

Por qué esto es distinto de solo "escapar con cuidado"

El escaping manual exige que el código de la aplicación codifique correctamente los valores antes de concatenarlos; es frágil y depende del contexto. Una API de parámetros delega el tratamiento del valor al controlador. Con preparación nativa en el servidor, los valores se transmiten como parámetros separados del protocolo; con emulación, el controlador procesa los marcadores en el cliente. No incluyas entradas del usuario en cadenas SQL construidas por la aplicación y comprueba el comportamiento de enlace documentado por el controlador.

FAQ

¿Es esto lo mismo que una "prepared statement"?

Muy relacionado: una prepared statement es el objeto del lado de la base de datos creado a partir de la estructura fija de la consulta; la parametrización es la práctica de vincularle valores por separado. Los términos suelen usarse indistintamente.

¿Funciona esto para todas las partes de una consulta?

Solo para valores (datos), no para identificadores como nombres de tablas o columnas: esos necesitan otra defensa, normalmente una lista de permitidos.

Referencias

Véase también Inyección SQL (CWE-89): cómo funciona y cómo evitarla en cada lenguaje — flawopen.com ¿Prisma $queryRaw es seguro frente a SQL Injection? ¿Es segura la interpolación en where() de Rails? ¿Sequelize query() es seguro frente a SQL Injection? ¿SQLAlchemy text() es seguro frente a SQL Injection? ¿La verificación de consultas de sqlx en compilación evita la inyección SQL? ¿Los procedimientos almacenados evitan la inyección SQL?