Como MySQL evita a inxección de SQL? Principio de inxección SQL e prevención

MySQLComo evitar a inxección de SQL? Principio e prevención da inxección SQL

MySQL e inxección SQL

Se colles os datos introducidos polo usuario a través dunha páxina web e insírelos nunBase de datos MySQL, entón pode haber problemas de seguridade de inxección SQL.

Este capítulo presentará como evitar a inxección de SQL e filtrar os caracteres inxectados en SQL mediante scripts.

A chamada inxección SQL consiste en enganar ao servidor para que execute comandos SQL maliciosos mediante a inserción de comandos SQL no formulario web para enviar ou introducir a cadea de consulta do nome de dominio ou da solicitude de páxina.

Nunca debemos confiar na entrada do usuario, debemos asumir que os datos de entrada do usuario non son seguros e todos necesitamos filtrar os datos de entrada do usuario.

No seguinte exemplo, o nome de usuario introducido debe ser unha combinación de letras, números e guións baixos, e o nome de usuario debe ter entre 8 e 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 输入异常";
}

Vexamos a situación SQL que ocorre cando non se filtran os caracteres especiais:

// 设定$name 中插入了我们不需要的SQL语句
$name = "Qadir'; DELETE FROM users;";
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Na instrución de inxección anterior, non filtramos a variable de $nome e a instrución SQL que non precisamos insírese en $name, o que eliminará todos os datos da táboa de usuarios.

mysqli_query() en PHP non está autorizado a executar varias instrucións SQL, pero en SQLite e PostgreSQL pódense executar varias instrucións SQL ao mesmo tempo, polo que necesitamos verificar rigorosamente os datos destes usuarios.

Para evitar a inxección de SQL, debemos prestar atención aos seguintes puntos:

  • 1. Nunca confíes na entrada do usuario.Comprobe a entrada do usuario, pode usar expresións regulares ou limitar a lonxitude; converte comiñas simples e dobre "-", etc.
  • 2. Nunca use SQL de ensamblaxe dinámico, pode usar SQL parametrizado ou usar directamente procedementos almacenados para a consulta e o acceso de datos.
  • 3. Nunca use conexións de bases de datos con privilexios de administrador, use conexións de bases de datos separadas con privilexios limitados para cada aplicación.
  • 4. Non almacene directamente información confidencial, non encripte nin elimine contrasinais e información confidencial.
  • 5. A información de excepción da aplicación debe dar o menor número de suxestións posible, e é mellor usar información de erro personalizada para envolver a información de erro orixinal.
  • 6. O método de detección de inxección sql xeralmente adopta auxiliarSoftwareOu a plataforma do sitio web para detectar, o software xeralmente usa a ferramenta de detección de inxección sql jsky e a plataforma do sitio web ten a ferramenta de detección da plataforma de seguridade do sitio web Yisi. MDCSOFT SCAN et al.Usar MDCSOFT-IPS pode defenderse eficazmente contra a inxección SQL, ataques XSS, etc.

Evitar a inxección de SQL

En linguaxes de scripts como Perl e PHP pode escapar dos datos introducidos polo usuario para evitar a inxección de SQL.

A extensión MySQL para PHP proporciona a función mysqli_real_escape_string() para escapar de caracteres especiais de entrada.

if (get_magic_quotes_gpc()) 
{
  $name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
 mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");

Inxección en Declaracións Like

Ao consultar como, se o usuario introduce valores con "_" e "%", isto ocorrerá: o usuario orixinalmente quería consultar "abcd_", pero os resultados da consulta inclúen "abcd_", "abcde" e "abcdf". " Etc.; o problema tamén ocorre cando o usuario quere consultar "30%" (nota: trinta por cento).

No script PHP podemos usar a función addcslashes() para xestionar a situación anterior, como no seguinte exemplo:

$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
 mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");

A función addcslashes() engade unha barra invertida antes do carácter especificado.

Formato de sintaxe:

addcslashes(string,characters)
参数descrición
cordaObrigatorio.Especifica a cadea a comprobar.
caracteresOpcional.Especifica o carácter ou rango de caracteres afectados por addcslashes().

发表 评论

O teu enderezo de correo electrónico non será publicado. Utilízanse os campos obrigatorios * Etiqueta

Volver arriba