Existen diferentes medidas para prevenir ataques de inyección SQL y proteger la base de datos. Para ello es necesario familiarizarse con todos los componentes involucrados: el servidor, las aplicaciones individuales y el sistema de gestión de base de datos.
Paso 1: Supervisar las modificaciones automáticas en las aplicaciones
Comprueba y filtra los métodos y parámetros que utilizan las aplicaciones para acceder a la base de datos. Los datos transferidos siempre deben estar en el formato de datos esperado. Si, por ejemplo, se requiere un parámetro numérico, lo puedes comprobar mediante un script PHP incluyendo la función is_numeric(). El proceso de filtrado se encarga de ignorar caracteres especiales. Otro punto importante es asegurarse de que las aplicaciones no generen ningún mensaje de error externo que pueda revelar información sobre el sistema o la estructura de la base de datos utilizada.
Los llamados Prepared Statements se han convertido en una práctica común que puede utilizarse con muchos sistemas de gestión de bases de datos. Estas instrucciones predefinidas se crearon originalmente para ejecutar solicitudes frecuentes, reduciendo el riesgo de ataques de inyección SQL debido a su estructura. Esto principalmente debido a que las instrucciones con parámetros transmiten el comando SQL real a la base de datos, separado de los parámetros. Así, es el propio sistema de gestión de la base de datos quien, al final, los ejecuta juntos y enmascara automáticamente los caracteres especiales.
Paso 2: Proporcionar una protección completa al servidor
Lógicamente, la seguridad del servidor en el que se ejecuta el sistema de gestión de base de datos juega un papel fundamental en la prevención de ataques de inyección SQL. La primera medida de seguridad es el endurecimiento del sistema operativo de acuerdo con el siguiente patrón:
- Instala y activa únicamente aquellas aplicaciones y servicios que son realmente relevantes para la base de datos.
- Elimina todas las cuentas de usuario que no sean necesarias.
- Asegúrate de instalar todas las actualizaciones relevantes para el sistema y el programa.
Cuanto más altos sean los requisitos vinculados a la seguridad de tu proyecto web, mayor será la necesidad de instalar sistemas de detección de intrusiones (IDS) o sistemas de prevención de intrusiones (IPS). Estos funcionan con diferentes sistemas de reconocimiento y tienen como objetivo detectar ataques contra el servidor a tiempo y alertar a su administrador y, en el caso de los IPS, tomar medidas apropiadas automáticamente. Otra medida de protección recomendable también es la implementación de un puerto en la capa de aplicación (Application Layer Gateway) que monitoree directamente, en el nivel de aplicación, el tráfico entre las aplicaciones y el navegador web.
Paso 3: Blindar la base de datos y utilizar códigos más seguros
De la misma forma que un sistema operativo, una base de datos debería estar libre de factores externos irrelevantes y ser actualizada regularmente. Para ello es recomendable desactivar todos los servicios y cuentas de usuario inactivos, así como eliminar todos los procedimientos almacenados que no sean necesarios. Configura una cuenta de base de datos que esté destinada únicamente para el acceso desde la web y que tenga derechos de acceso mínimos. Recuerda almacenar toda la información confidencial, por ejemplo, las contraseñas, de manera cifrada en la base de datos.
En lo que respecta a los Prepared Statements no se recomienda utilizar el módulo mysql de PHP, sino más bien mysqli o PDO. De esta manera puedes proteger tu sistema con códigos de seguridad. Así, por ejemplo, la función en script PHP mysqli_real_escape_string() previene que los caracteres especiales sean transmitidos a la base de datos SQL en su forma original y los enmascara por sí misma. Si expandes, por ejemplo, el siguiente código: