--- title: SQL Injection localeTitle: Injeção SQL --- ## Injeção SQL Uma vulnerabilidade no aplicativo causada pelo programador que não limpa a entrada antes de incluí-la em uma consulta no banco de dados. Isso faz com que o invasor tenha leitura completa e, com mais frequência, não tenha acesso de gravação ao banco de dados. Com esse tipo de acesso, um invasor pode fazer coisas muito ruins. ### Exemplo de ataque de injeção de SQL O script PHP abaixo executa uma instrução SQL para obter o e-mail de um usuário por ID. No entanto, a entrada não é higienizada, tornando-a vulnerável à injeção de SQL ```PHP connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT email FROM users WHERE id =" . $input; $result = $conn->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo $row["email"]; } } else { echo "no results"; } $conn->close(); ``` ```SQL SELECT email FROM users WHERE id = `$input`; ``` Assim, com o acima, a entrada não é do tipo convertida (ou seja, lançando a entrada com (int) para que somente um número seja permitido) nem escapando permitindo que alguém execute um ataque SQL Injection - por exemplo, a URL `getemailbyuserid.php?id=1'; My Query Here-- -` permite que você execute consultas SQL arbitrárias com pouco esforço. ### Defendendo seu site de ataques de injeção de SQL em PHP Existem algumas abordagens para defender seu site dos ataques de injeção SQL. Essas abordagens são lista branca, conversão de tipo e escape de caractere **Lista de permissões:** A abordagem de lista de desbloqueio é usada nos casos em que apenas algumas entradas são esperadas. Você pode listar cada entrada esperada em um Comutador PHP e, em seguida, ter um padrão para entrada inválida. Você não precisa se preocupar com um problema de transmissão de tipo ou um bypass de escape de caractere, mas a entrada permitida é extremamente limitada. Continua uma opção, veja o exemplo abaixo. ```PHP