Directorio de artículos
MySQL¿Cómo prevenir la inyección de sql? Principio y prevención de inyección SQL
MySQL e inyección SQL
Si toma los datos ingresados por el usuario a través de una página web y los inserta en unbase de datos mysql, entonces puede haber problemas de seguridad de inyección SQL.
Este capítulo presentará cómo evitar la inyección de SQL y filtrar los caracteres inyectados en SQL a través de scripts.
La llamada inyección SQL consiste en engañar al servidor para que ejecute comandos SQL maliciosos insertando comandos SQL en el formulario web para enviar o ingresar la cadena de consulta del nombre de dominio o solicitud de página.
Nunca debemos confiar en la entrada del usuario, debemos asumir que los datos de entrada del usuario no son seguros y todos necesitamos filtrar los datos de entrada del usuario.
En el siguiente ejemplo, el nombre de usuario ingresado debe ser una combinación de letras, números y guiones bajos, y el nombre de usuario debe tener entre 8 y 20 caracteres:
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)) { $result = mysqli_query($conn, "SELECT * FROM users WHERE username=$matches[0]"); } else { echo "username 输入异常"; }
Echemos un vistazo a la situación de SQL que ocurre cuando no se filtran los caracteres especiales:
// 设定$name 中插入了我们不需要的SQL语句 $name = "Qadir'; DELETE FROM users;"; mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
En la instrucción de inyección anterior, no filtramos la variable de $nombre. La instrucción SQL que no necesitamos se inserta en $nombre, lo que eliminará todos los datos en la tabla de usuarios.
mysqli_query() en PHP no puede ejecutar varias declaraciones SQL, pero en SQLite y PostgreSQL, se pueden ejecutar varias declaraciones SQL al mismo tiempo, por lo que debemos verificar estrictamente los datos de estos usuarios.
Para evitar la inyección de SQL, debemos prestar atención a los siguientes puntos:
- 1. Nunca confíes en la entrada del usuario.Verifique la entrada del usuario, puede usar expresiones regulares o limitar la longitud; convertir comillas simples y doble "-", etc.
- 2. Nunca use sql de ensamblaje dinámico, puede usar sql parametrizado o usar directamente procedimientos almacenados para consulta y acceso a datos.
- 3. Nunca use conexiones de bases de datos con privilegios de administrador, use conexiones de bases de datos separadas con privilegios limitados para cada aplicación.
- 4. No almacene información confidencial directamente, ni cifre ni extraiga contraseñas e información confidencial.
- 5. La información de excepción de la aplicación debe brindar la menor cantidad de sugerencias posible, y es mejor usar información de error personalizada para envolver la información de error original.
- 6. El método de detección de inyección sql generalmente adopta auxiliar软件O la plataforma del sitio web para detectar, el software generalmente usa la herramienta de detección de inyección sql jsky, y la plataforma del sitio web tiene la herramienta de detección de la plataforma de seguridad del sitio web Yisi. MDCSOFT SCAN et al.El uso de MDCSOFT-IPS puede defenderse eficazmente contra la inyección de SQL, los ataques XSS, etc.
Prevenir la inyección de SQL
En lenguajes de secuencias de comandos como Perl y PHP, puede escapar los datos ingresados por el usuario para evitar la inyección de SQL.
La extensión de MySQL para PHP proporciona la función mysqli_real_escape_string() para escapar de los caracteres de entrada especiales.
if (get_magic_quotes_gpc()) { $name = stripslashes($name); } $name = mysqli_real_escape_string($conn, $name); mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
Inyección en declaraciones similares
Al consultar como, si el usuario ingresa valores con "_" y "%", esto sucederá: el usuario originalmente quería consultar "abcd_", pero los resultados de la consulta incluyen "abcd_", "abcde" y "abcdf Etc.; el problema también ocurre cuando el usuario quiere consultar "30%" (nota: treinta por ciento).
En un script PHP podemos usar la función addcslashes() para manejar la situación anterior, como en el siguiente ejemplo:
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_"); // $sub == \%something\_ mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
La función addcslashes() agrega una barra invertida antes del carácter especificado.
Formato de sintaxis:
addcslashes(string,characters)
参数 | 描述 |
---|---|
cadena | Requerido.Especifica la cadena a comprobar. |
personajes | Opcional.Especifica el carácter o rango de caracteres afectados por addcslashes(). |
Esperanza Chen Weiliang Blog ( https://www.chenweiliang.com/ ) compartió "¿Cómo evita MySQL la inyección de sql? principio de inyección sql y prevención", te ayudará.
Bienvenido a compartir el enlace de este artículo:https://www.chenweiliang.com/cwl-500.html
¡Bienvenido al canal de Telegram del blog de Chen Weiliang para obtener las últimas actualizaciones!
📚 Esta guía contiene un gran valor. 🌟Esta es una oportunidad única, ¡no la pierdas! ⏰⌛💨
¡Comparte y dale me gusta si te gusta!
¡Su compartir y Me gusta son nuestra motivación continua!