SQL Injection
Criei uma situação hipotética de desenvolvimento de faturas para uma nova fintech no artigo de JSON e sugeri a seguinte situação problema: O que acontecerá quando persistir em suas aplicações o nome de uma cliente que, porventura, se chame, digamos, Joana D'arc?
Injeção de SQL na prática
Uma das informações que você precisará cadastrar na fatura a ser paga é o nome da pessoa debitada. Sendo assim, para simplificar, suponham que terá uma string de SQL apenas para cadastrar esse nome.
Algo como INSERT INTO faturas ( nome_completo ) VALUES ( 'Gabriel Leite' )
. Agora vejam como ficaria essa mesma instrução se o nome da cliente em questão fosse Joana D'arc: INSERT INTO faturas ( nome_completo ) VALUES ( 'Joana D'arc' )
.
Perceba que certamente o banco de dados não vai conseguir interpretar corretamente a parte do VALUES
. Na prática, ele vai considerar que as aspas simples após o D
da palavra D'arc terminam a string 'Joana D'
, fazendo com que o trecho arc')
fique "solto" na instrução, resultando num erro.
Imagine, agora, que o valor recebido em nome_completo
seja algo ataque da peste'); DROP TABLE clientes; DROP TABLE faturas; --
. Isso fará com que nossa instrução completa seja INSERT INTO faturas ( nome_completo ) VALUES ( 'ataque da peste' ); DROP TABLE clientes; DROP TABLE faturas; -- )
.
Perceba que neste caso foram acrescentadas duas instruções de exclusão das tabelas clientes
e faturas
. Algo grave e que faria sua empresa ficar sem clientes e sem faturas, praticamente indo a falência.
Este é um tipo de ataque de cibernético muito famoso conhecido como SQL Injection. E é claro, existem diversas variações possíveis para esse tipo de ataque.
Você pode estar pensando: “Ora, nesse caso é fácil de resolver! Basta remover as aspas, os parênteses e os demais caracteres especiais das informações que o usuário nos passar. Aliás, esse processo é chamado de sanitização”
A boa notícia é que existem bibliotecas nas principais linguagens que resolvem esta situação. Afinal de contas, se fôssemos resolver este problema utilizando expressões regulares, perderíamos muito tempo e ainda poderíamos não tratar todos os casos.
Normalmente quem faz esse papel de sanitização é o próprio driver de conexão com o BD.
Nada mais justo, uma vez que os drivers são bibliotecas desenvolvidas pelas empresas desenvolvedoras dos sistemas gerenciadores de banco de dados. E com isso resolveremos o "problema da Joana D'arc" bem como evitaremos que strings maliciosas sejam executadas em nosso BD.
Vejamos alguns exemplos:
// NodeJS
const connection = // Cria a conexão com o BD.
const sql = 'INSERT INTO faturas ( nome_completo ) VALUES (?)';
connection.query(sql, ["Joana D'arc"], function (error, results, fields) {
if (error) throw error;
// ...
});
// Java
Connection connection = // Cria a conexão com o BD.
String sql = "INSERT INTO faturas ( nome_completo ) VALUES (?)";
PreparedStatemend ps = connection.prepareStatement(sql);
ps.setString(1, "Joana D'arc");
ps.execute();
// PHP
$query = "INSERT INTO faturas ( nome_completo ) VALUES (:nome)";
$statement = $this->con->prepare($query);
$statement->bindValue(":nome","Joana D'arc");
$statement->execute();
Agora é sua vez: mãos à massa!
Estude Segurança web em Java na Alura!
Os cursos de segurança web em java da Alura ensinam as boas práticas para enxergar vulnerabilidades que podem existir em uma aplicação web java e muito mais. Acesse ao primeiro curso clicando aqui e proteja suas aplicações de diferentes ataques e ameaças.