Las consultas parametrizadas permiten pasar valores a la consulta a través de parámetros especiales, en lugar de directamente mediante la sustitución de variables. Esto mejora la seguridad y protege contra inyecciones SQL, así como acelera la ejecución de consultas repetidas gracias a la caché del plan.
SQL dinámico permite construir y ejecutar consultas sobre la marcha (por ejemplo, a través de EXEC sp_executesql en MS SQL o PREPARE/EXECUTE en PostgreSQL). Es necesario tener mucho cuidado: la sustitución de valores directamente en el texto de la consulta puede llevar a inyecciones SQL, errores de sintaxis y un mal rendimiento.
Ejemplo de consulta parametrizada (en Python con la biblioteca psycopg2):
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
Ejemplo de SQL dinámico en PostgreSQL:
EXECUTE format('SELECT * FROM %I WHERE value = %L', tablename, value);
Pregunta: ¿Por qué simplemente escapar comillas ('), como lo hacen algunas aplicaciones antiguas, no es suficiente para proteger contra inyecciones SQL?
Respuesta:
Escapar comillas no protegerá contra todos los tipos de inyección, especialmente si un atacante inserta una estructura de consulta SQL (por ejemplo, "; DROP TABLE users;"). Además, no cubre todas las particularidades de diferentes tipos de datos y no protege contra el eludir filtros a través de codificación o caracteres especiales. Siempre se deben usar consultas parametrizadas.
Historia
Historia
Historia
En un CRM, la letra “O'Connor” causó un error en la aplicación que construía consultas SQL mediante la concatenación simple de cadenas. Debido a la comilla simple no escapada, ninguna tarjeta con ese apellido se guardaba, lo que se descubrió solo un año después.