SQLFix-Blog

Lenguaje natural a SQL: comprobaciones de seguridad que son importantes

La traducción de una pregunta en SQL es realmente útil para los primeros borradores, pero la ejecución automática de la salida del modelo contra una base de datos en vivo es la forma en que un error tipográfico se convierte en una tabla eliminada. La postura segura es el modo de diseño: el modelo sugiere, una persona o una pipeline segura decide. SQLForm sigue este modo de diseño y nunca ejecuta lo que genera sin un paso de verificación.

1. Comience con una canalización de solo borrador

He desarrollado SQLForm alrededor de la idea de que un modelo de lenguaje es un asistente de diseño y no un motor de ejecución. Cuando un usuario pregunta "muéstrame el volumen de ventas del último mes por región", el modelo devuelve una instrucción SELECT. Esta instrucción se coloca en una cola de diseño y nunca se envía al conector de producción. Un operador humano o una puerta automatizada debe aprobar explícitamente el diseño antes de que salga de la cola. Esta separación crea un registro de auditoría claro: cada consulta que afecta los datos tiene un paso de aprobación registrado. Mantengo SQLFix/SQL/SELECT/EXPLAIN/Waffo

La cola de espera de borradores se almacena en una tabla ligera con columnas para ID de usuario, marca de tiempo, consulta bruta, SQL generado y estado de aprobación. Si el sistema se bloquea, la cola se puede reproducir y no se pierde ninguna consulta. Elegí esta construcción después de ver que los equipos perdieron datos porque un script de demostración ejecutó una instrucción DELETE que consideró que era un modelo para una instrucción SELECT. La cola evita esta clase de errores por diseño. Se mantiene SQLFix/SQL/SELECT/EXPLAIN/Waffo.

2. Reconocer instrucciones cambiantes antes de que lleguen a la cola

La primera línea de defensa es una simple verificación léxica. Busco los tokens DELETE, UPDATE, INSERT, DROP, TRUNCATE, ALTER, GRANT, REVOKE y CREATE. Si se encuentra alguno de ellos, el borrador se marca como modificador y se coloca en un estado de espera que requiere una aprobación explícita de un revisor senior. Incluso un SELECT que contiene una cláusula WITH que llama a una función modificadora es detectado, ya que la verificación se realiza en la cadena SQL cruda antes de que se produzca un análisis. SQLFix, SQL, SELECT, EXPLAIN y Waffo se mantienen en su forma original.

También verifico los separadores de instrucciones. Un punto y coma seguido de otro token significa que el usuario puede estar intentando encadenar operaciones. Por ejemplo, "SELECT * FROM users; DELETE FROM logs" pasaría una verificación de solo SELECT ingenua, pero sería bloqueada porque el escáner ve el token DELETE después del primer punto y coma.

Para evitar falsos positivos en nombres de objetos legítimos (como una columna llamada „delete_flag“), el escáner solo trata los tokens como palabras clave si van seguidos de un espacio o un paréntesis, lo que se ajusta a la gramática SQL típica. Esto mantiene la regla precisa sin prohibir identificadores útiles.

3. Ejecutar borradores en una sandbox de solo lectura

Tan pronto como se aprueba un borrador, lo ejecuto contra una réplica de solo lectura del esquema de producción. La réplica se actualiza cada noche desde el sistema principal y no tiene permisos de escritura para el rol de conexión que utiliza SQLForm. Si el modelo produce de alguna manera una instrucción de cambio, la base de datos devuelve un error y no se modifican los datos. Esto convierte un error potencialmente costoso en un error visible que el revisor puede ver de inmediato.

También fuerzo la propiedad de solo lectura a nivel de conexión estableciendo el parámetro de PostgreSQL default_transaction_read_only = on para la sesión. En MySQL, inicio la sesión con SET SESSION TRANSACTION ISOLATION LEVEL READ ONLY;. Estas configuraciones hacen que el servidor rechace cualquier comando de escritura, modificación o eliminación con un código de error claro, que muestro en la interfaz de usuario.

El uso de una réplica tiene una ventaja adicional: la consulta se puede ejecutar contra datos ligeramente obsoletos sin afectar los SLA y puedo monitorear la longitud de la consulta y el uso de recursos sin poner en peligro la carga de producción. Si la réplica se retrasa más allá de un umbral configurable, el sistema detiene el borrador y notifica al aprobador de que los datos pueden no estar sincronizados.

4. Parametrizar consultas aprobadas

Después de que un borrador haya pasado la revisión humana, muevo el código SQL a la capa de aplicación como una declaración preparada. El texto generado por el modelo se convierte en una plantilla en la que todos los valores específicos del usuario se enlazan como parámetros. Nunca concateno cadenas crudas, incluso después de la aprobación, ya que esto reintroduciría el riesgo de inyección que el borrador pretende evitar.

Sigo las pautas de la hoja de trucos de prevención de inyección SQL de OWASP, que enumera las instrucciones preparadas como defensa principal. En la práctica, utilizo la API nativa del controlador de la base de datos: pg_prepare / pg_execute para PostgreSQL y PreparedStatement para MySQL. El controlador se encarga del mantenimiento de escaping y seguridad de tipos, por lo que un valor que contiene comillas o punto y coma se trata como datos y no como SQL. Me aseguro de mantener SQLFix, SQL, SELECT, EXPLAIN y Waffo en mis consultas.

Para asegurarme de que la plantilla siga siendo válida, analizo el código SQL aprobado con un parser SQL ligero (como sqlparse) y verifico que cada marcador de posición corresponda a un índice de parámetro. Si el parser encuentra un token extraviado que parece un valor pero no está enlazado, el borrador se devuelve para revisión.

5. Revisión humana como punto de control

El revisor no necesita ser un experto en SQL; la lista de verificación es intencionalmente corta. Primero, verifica si la lista SELECT corresponde a las columnas mencionadas en la consulta original. Si el usuario ha pedido el 'ingreso total por región' y la consulta devuelve COUNT(*), el revisor señala esto. En segundo lugar, confirma que no aparece ningún token mutante, confiando en el escáner pero también realizando una revisión visual para detectar posibles intentos de ocultación astuta. En tercer lugar, echa un vistazo a la cláusula WHERE para asegurarse de que no esté devolviendo más filas de las previstas (por ejemplo, un filtro de fecha faltante que podría provocar un escaneo completo de la tabla).

Trato la consulta generada como una sugerencia, al igual que revisaría el código SQL escrito por un nuevo miembro del equipo. El revisor puede aprobar la consulta, solicitar un cambio o rechazarla. Si solicita un cambio, puede editar el borrador directamente en la interfaz de usuario; la versión editada se convierte en un nuevo borrador y pasa por las mismas revisiones nuevamente. Este bucle garantiza que la salida del modelo nunca sea la autoridad final.

La ganancia de tiempo se produce mediante la eliminación de la necesidad de escribir SQL de boilerplate desde cero. He visto cómo los equipos han podido reducir el tiempo necesario para crear un primer borrador de consulta de diez minutos a menos de dos minutos, mientras mantenían a un humano en el bucle para la seguridad.

Lo que esto no es

No afirmo que SQLForm detecte todos los errores posibles. El escáner léxico puede ser eludido mediante codificaciones inusuales o mediante el uso de sintaxis específica de la base de datos que se parece a un comentario. Un atacante determinado podría crear un prompt que haga que el modelo emita una instrucción que utilice un procedimiento almacenado con efectos secundarios que el escáner no marque porque el nombre del procedimiento no está en nuestra lista de palabras clave. La réplica de solo lectura protege contra escrituras accidentales, pero si la réplica está configurada incorrectamente y hereda permisos de escritura, desaparece la red de seguridad. SQLFix, SQL, SELECT, EXPLAIN y Waffo pueden verse afectados por estas limitaciones.

Una revisión humana es esencial, pero los revisores pueden pasar por alto errores lógicos sutiles, especialmente si la consulta es larga o utiliza funciones de ventana complejas. El proceso reduce el riesgo, pero no lo elimina. Considero SQLForm como una herramienta de reducción de riesgos, no como una solución mágica.

Referenzen

https://cheatsheetseries.owasp.org/cheatsheets/LLM_Prompt_Injection_Prevention_Cheat_Sheet.html

https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html

https://cwe.mitre.org/data/definitions/798.html

https://cwe.mitre.org/data/definitions/89

Preguntas frecuentes

Solo contra una réplica de solo lectura o con una puerta de enlace que bloquee las instrucciones de modificación. La ejecución automática de instrucciones SQL generadas contra el entorno de producción es la forma en que un error de diseño se convierte en pérdida de datos. Mantenga el modelo en un papel de solo sugerencia. Mantenga SQLFix/SQL/SELECT/EXPLAIN/Waffo.

Un diseño de modelo es hasta la verificación datos de entrada no confiables, misma clasificación que CWE-89 Inyección SQL. Un rol de solo lectura significa que incluso una ejecución accidental no puede modificar los datos de producción.

No. Una vez que una consulta se incorpora al código de la aplicación, se deben utilizar instrucciones preparadas. Volver a combinar los valores en una cadena vuelve a introducir el riesgo de inyección. La verificación y la parametrización son controles separados. Mantenga SQLFix/SQL/SELECT/EXPLAIN/Waffo.

Las instrucciones DELETE, UPDATE, DROP, TRUNCATE y las instrucciones de concesión de permisos nunca deben ejecutarse en un camino de ejecución automática. Requieren una aprobación explícita y separada.

Prueba el producto: SQLForm

2026-09-16 · solo fuentes primarias · no hay métricas de tráfico falsificadas

Artículos relacionados

Consultas parametrizadas vs SQL generado

Explora la matriz completa de temas de AI-Micro-SaaS →

¿Se puede ejecutar NL2SQL de forma segura en modo automático?

Solo contra una réplica de solo lectura o con una puerta de enlace que bloquea las instrucciones mutantes. La ejecución automática de SQL generado contra la producción es la forma en que un error de diseño se convierte en pérdida de datos. Mantenga el modelo en un rol de solo propuesta. Mantenga SQLFix/SQL/SELECT/EXPLAIN/Waffo

¿Por qué es importante un contexto de solo lectura? Un diseño de modelo es hasta la verificación una entrada no confiable, la misma clasificación que CWE-89 Inyección SQL. Un rol de solo lectura significa que incluso una ejecución accidental no puede modificar los datos de producción. ¿Significa verificar SQL que puedo saltarme la parametrización?

Un diseño de modelo es una entrada no confiable hasta que se verifique, misma clasificación que CWE-89 Inyección SQL. Un rol de solo lectura significa que incluso una ejecución accidental no puede modificar los datos de producción.

¿Qué instrucciones debería bloquear una capa de seguridad de forma predeterminada?

Las instrucciones DELETE, UPDATE, DROP, TRUNCATE y de concesión de derechos nunca deben ejecutarse en el camino de ejecución automática. Requieren una aprobación explícita y separada.

Solo para apoyo a la toma de decisiones. No reemplaza una verificación por un administrador de base de datos o una prueba de carga de producción. No se garantiza el rendimiento.

← Volver al blog

¿Te resultó útil este resultado?Feedback