Como o MySQL impede a injeção de sql? Princípio e prevenção de injeção de SQL

MySQLComo evitar a injeção de sql? Princípio e prevenção de injeção de SQL

MySQL e injeção de SQL

Se você pegar os dados inseridos pelo usuário através de uma página da web e inseri-los em umbanco de dados MySQL, pode haver problemas de segurança de injeção de SQL.

Este capítulo apresentará a você como evitar injeção de SQL e usar scripts para filtrar caracteres injetados em SQL.

A chamada injeção de SQL é enganar o servidor para executar comandos SQL maliciosos, inserindo comandos SQL no formulário da web para enviar ou inserir a string de consulta do nome de domínio ou solicitação de página.

Nunca devemos confiar na entrada do usuário, devemos assumir que os dados de entrada do usuário não são seguros e todos nós precisamos filtrar os dados de entrada do usuário.

No exemplo a seguir, o nome de usuário inserido deve ser uma combinação de letras, números e sublinhados, e o nome de usuário deve 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 输入异常";
}

Vamos dar uma olhada na situação SQL que ocorre quando nenhum caractere especial é filtrado:

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

Na instrução de injeção acima, não filtramos a variável de $name, e a instrução SQL que não precisamos é inserida em $name, que excluirá todos os dados da tabela de usuários.

mysqli_query() em PHP não tem permissão para executar múltiplas instruções SQL, mas SQLite e PostgreSQL podem executar múltiplas instruções SQL ao mesmo tempo, então precisamos verificar rigorosamente os dados desses usuários.

Para evitar a injeção de SQL, precisamos prestar atenção aos seguintes pontos:

  • 1. Nunca confie na entrada do usuário.Verifique a entrada do usuário, você pode usar expressões regulares ou limitar o comprimento; converter aspas simples e duplas "-", etc.
  • 2. Nunca use sql de montagem dinâmica, você pode usar sql parametrizado ou usar procedimentos armazenados diretamente para consulta e acesso a dados.
  • 3. Nunca use conexões de banco de dados com privilégios de administrador, use conexões de banco de dados separadas com privilégios limitados para cada aplicativo.
  • 4. Não armazene informações confidenciais diretamente, não criptografe ou faça hash de senhas e informações confidenciais.
  • 5. As informações de exceção do aplicativo devem fornecer o mínimo de dicas possível, e é melhor usar informações de erro personalizadas para agrupar as informações de erro originais
  • 6. O método de detecção de injeção sql geralmente adota auxiliar软件Ou a plataforma do site para detectar, o software geralmente usa a ferramenta de detecção de injeção sql jsky, e a plataforma do site tem a ferramenta de detecção de plataforma de segurança do site Yisi. MDCSOFT SCAN et al.O uso do MDCSOFT-IPS pode efetivamente defender contra injeção de SQL, ataques XSS, etc.

Evitar injeção de SQL

Em linguagens de script como Perl e PHP você pode escapar dos dados inseridos pelo usuário para evitar injeção de SQL.

A extensão MySQL para PHP fornece a função mysqli_real_escape_string() para escapar de caracteres de entrada especiais.

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

Injeção em Declarações Like

Ao consultar como, se o usuário inserir valores com "_" e "%", isso acontecerá: o usuário originalmente queria consultar "abcd_", mas os resultados da consulta incluem "abcd_", "abcde" e "abcdf "Etc.; o problema também ocorre quando o usuário deseja consultar "30%" (nota: trinta por cento).

Em um script PHP podemos usar a função addcslashes() para lidar com a situação acima, como no exemplo a seguir:

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

A função addcslashes() adiciona uma barra invertida antes do caractere especificado.

Formato de sintaxe:

addcslashes(string,characters)
参数描述
cordaRequeridos.Especifica a string a ser verificada.
caracteresOpcional.Especifica o caractere ou intervalo de caracteres afetado por addcslashes().

Hope Chen Weiliang Blog ( https://www.chenweiliang.com/ ) compartilhou "Como o MySQL impede a injeção de sql? princípio e prevenção de injeção de sql", ele irá ajudá-lo.

Bem-vindo a compartilhar o link deste artigo:https://www.chenweiliang.com/cwl-500.html

Bem-vindo ao canal Telegram do blog de Chen Weiliang para receber as últimas atualizações!

🔔 Seja o primeiro a obter o valioso "Guia de uso da ferramenta de IA de marketing de conteúdo ChatGPT" no diretório superior do canal! 🌟
📚 Este guia contém um valor enorme, 🌟Esta é uma oportunidade rara, não perca! ⏰⌛💨
Compartilhe e curta se gostar!
Seus compartilhamentos e curtidas são nossa motivação contínua!

 

发表 评论

Seu endereço de e-mail não será publicado. 必填 项 已 用 * 标注

滚动 到 顶部