ProgramaciónDesarrollador Fullstack

Hable sobre consultas parametrizadas y SQL dinámico. ¿Cuándo usar cada enfoque, qué riesgos están asociados con SQL dinámico y cómo evitarlos? Proporcione ejemplos.

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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 capciosa.

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

En uno de los sistemas de cálculo de salarios, SQL dinámico generaba informes. Debido a la falta de soporte para parametrización en el antiguo marco, se concatenaban cadenas manualmente. Un usuario accidentalmente (o no tan accidentalmente) pasó un fragmento de SQL en el campo "apellido" — esto permitió acceder a los salarios de otros.

Historia

Una pequeña tienda en línea utilizó SQL dinámico para filtrar productos sin la validación adecuada. Al intentar especificar un valor no estándar, el usuario provocó un error en el analizador SQL, lo que "causó" que la entrega de todos los productos se detuviera temporalmente.

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.