Inyección SQL: qué es y cómo solucionarla
La inyección SQL es una vulnerabilidad en la que el texto que introduce un visitante se incluye en una consulta a la base de datos no como un valor, sino como parte de un comando. Como resultado, una persona externa puede leer, modificar o eliminar lo que no debería tener a su alcance.
Analogía para dueños de sitios web
Imagina un archivo y un formulario: "trae el expediente número ___". Si alguien escribe en el campo del número "...y además llévate todo el archivero y deja la puerta abierta", y el empleado lee todo el formulario como una instrucción, lo hará. La vulnerabilidad no está en el archivo, sino en la costumbre de armar instrucciones con texto ajeno. La solución es un formulario donde el número de expediente siempre siga siendo un número y nunca se lea como un comando.
Qué se puede perder
| Qué ocurre | A qué lleva |
|---|---|
| Lectura de tablas ajenas | Filtración de las bases de datos de clientes y pedidos, junto con avisos a las personas afectadas y preguntas de los reguladores |
| Acceso a cuentas | Hashes de contraseñas de administradores, acceso al panel de administración, control del sitio |
| Escritura de código ajeno en la base de datos | Una infección que vuelve incluso después de limpiar los archivos: consulta código malicioso en el sitio |
Cómo afecta al SEO
No es un factor de posicionamiento directo: lo que golpea es la consecuencia. A través de la inyección se suben a la base de datos contenido spam y enlaces ocultos a temáticas ajenas. Luego sigue el escenario típico: los buscadores evalúan mal la temática del sitio, las posiciones caen, algunas páginas salen del índice y, cuando el dominio entra en las bases de sitios inseguros, los navegadores muestran una advertencia y el tráfico baja.
Cómo se ve en el informe de Security Shield
El escáner envía una consulta de prueba inofensiva a los parámetros encontrados y comprueba si el sitio devuelve un mensaje de error de la base de datos. Si lo devuelve, aparece un hallazgo: "SQL Injection Indicator (DB Error)": severidad alta, clase CWE-89, categoría OWASP A03:2021. La evidencia muestra un fragmento del error, y la nota "requiere verificación" significa que el servicio registra un síntoma, no que hackee la base de datos.
La prueba se realiza solo en los modos de pago y en un dominio verificado. El escáner observa desde fuera y solo ve los parámetros que encontró en las páginas: que no haya un hallazgo no significa que no existan inyecciones en ningún lugar. Qué se comprueba exactamente está en el artículo sobre Security Shield.
Un error de base de datos en la respuesta significa que texto ajeno llegó a la consulta. Pasa al desarrollador la dirección de la página y el nombre del parámetro que aparecen en el informe. El escape manual de comillas y las "listas negras" de palabras no son una solución aquí.
Cómo corregirlo
- Consultas parametrizadas. La solución principal: el texto de la consulta se define de antemano y los valores se pasan por separado, como una prepared statement. Así, el contenido del campo no puede convertirse físicamente en parte del comando.
- ORM o capa de consultas del framework. Las bibliotecas modernas lo hacen por defecto; los problemas surgen donde la consulta se arma manualmente como una cadena de texto.
- Permisos mínimos para el usuario de la base de datos. La cuenta del sitio casi nunca necesita permisos para eliminar tablas ni para trabajar con archivos.
- Oculta los errores técnicos a los visitantes: la salida de depuración debe ir a los registros, no a la página.
- Actualiza el CMS y las extensiones. En sitios típicos, la inyección suele venir de un plugin vulnerable y no de tu propio código.
Cómo evitar que vuelva a ocurrir
Acuerda con el desarrollador que las consultas armadas concatenando cadenas de texto no pasan la revisión. Un firewall frente al sitio es una medida temporal mientras se corrige, no un reemplazo de las prepared statements. Después de corregir, repite un escaneo profundo. También es útil revisar con la auditoría del sitio: mostrará páginas y enlaces ajenos si algo ya entró en la base de datos.