English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
En este tutorial, aprenderá cómo arreglar vulnerabilidades comunes en bases de datos.
La inyección SQL es un ataque en el que el atacante puede inyectar o ejecutar código SQL malicioso en los datos que ingresa al servidor de la aplicación a través del navegador (por ejemplo, las entradas de formularios web).
Se puede usar para revelar información sensible, como el número de teléfono del usuario, la dirección de correo electrónico, la información de la tarjeta de crédito, etc. Los atacantes incluso pueden usarlo para evitar el proceso de autenticación y obtener acceso completo a toda la base de datos. Vamos a ver cómo funciona.
Consideremos la siguiente instrucción SQL, que es un ejemplo simple de autenticación de usuarios en aplicaciones web utilizando nombre de usuario y contraseña.
SELECT * FROM users WHERE username='username_val' AND password='password_val';
aquí,username_valypassword_valque representan el nombre de usuario y la contraseña ingresados por el usuario. Si el usuario ingresa como nombre de usuario “ 123”como contraseña”, la declaración de resultados será:
SELECT * FROM users WHERE username='john' AND password='123';
Pero supongamos, si el usuario es el atacante, no ha ingresado un nombre de usuario y contraseña válidos en el campo de entrada, sino valores similares a los siguientes: ' OR 'x'='x
En este caso, la consulta SQL anterior se estructurará como:
SELECT * FROM users WHERE username='' OR 'x'='x' AND password='' OR 'x'='x';
Esta instrucción es una instrucción SQL válida, ya que WHERE 'x'='x' siempre es verdadero, por lo que la consulta devolveráusersTodas las filas de la tabla. Puede ver que el atacante puede acceder fácilmente a toda la información sensible de la base de datos con un truco.
si}}usersLa tabla es grande y contiene millones o más filas, la única sentencia también puede causar un ataque de denegación de servicio (DoS) al sobrecargar los recursos del sistema, lo que hace que su aplicación no sea accesible para usuarios legítimos.
Advertencia:Si su script genera unaDELETEoUPDATESi realiza una consulta, ignorar las consecuencias de las vulnerabilidades de inyección SQL puede ser aún peor. Los atacantes pueden eliminar datos de la tabla o cambiar permanentemente todas las filas.
Siempre verifique la entrada del usuario, no haga suposiciones. No construya sentencias SQL directamente desde la entrada del usuario. Si está utilizando PHP y MySQL, puede usar la función mysqli_real_escape_string() para crear cadenas de caracteres SQL válidas que se puedan usar en sentencias SQL.
Este es un ejemplo muy básico de autenticación de usuarios utilizando PHP y MySQL, que muestra cómo evitar la inyección SQL al obtener la entrada del usuario.
<?php // Starting session session_start(); /* Intentar conectar al servidor MySQL Supongamos que está ejecutando el servidor MySQL con la configuración predeterminada (el usuario 'root' no tiene contraseña) */ $link = mysqli_connect("localhost", "root", "", "demo"); // Revisar la conexión if($link === false){ die("Error: No se puede conectar a la base de datos."); } // Evitar la inyección SQL al escapar la entrada del usuario para garantizar la seguridad $username_val = mysqli_real_escape_string($link, $_POST['username']); $password_val = mysqli_real_escape_string($link, $_POST['password']); if(isset($username_val, $password_val)){ // Intentar seleccionar la ejecución de la consulta $sql = "SELECT * FROM users WHERE username='" . $username_val . "' AND password='" . $password_val . "'"; if($result = mysqli_query($link, $sql)){ if(mysqli_num_rows($result) == 1{ // El usuario ha pasado la autenticación, por favor realice la operación aquí $row = mysqli_fetch_array($result); /*Guardar el valor en las variables de sesión para acceder a él más tarde en la referencia de sesión */ $_SESSION['user_id'] = $row['user_id']; $_SESSION['first_name'] = $row['first_name']; header('Location: welcome.html'); } else { echo "¡Error! Nombre de usuario o contraseña no válidos."; } } else { echo "Error: hubo algún problema. Por favor, inténtelo de nuevo."; } } // Cerrar conexión cerrar conexión mysqli_close($link); ?>
Consejo:Probar el tamaño y el tipo o el contenido de los datos recibidos por la aplicación de prueba, e implementar limitaciones adecuadas para evitar el uso de recursos del sistema.