¿Cómo previene MySQL la inyección de sql? Principio y prevención de inyección SQL

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)
参数描述
cadenaRequerido.Especifica la cadena a comprobar.
personajesOpcional.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!

🔔 ¡Sea el primero en obtener la valiosa "Guía de uso de la herramienta de inteligencia artificial para marketing de contenidos ChatGPT" en el directorio superior del canal! 🌟
📚 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!

 

发表 评论

Su dirección de correo electrónico no será publicada. 项 已 用 * 标注

滚动 到 顶部