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)
参数 | 描述 |
---|---|
corda | Requeridos.Especifica a string a ser verificada. |
caracteres | Opcional.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!
📚 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!