Você ainda não é assinante?

SQL Injection

SQL Injection é uma técnica que permite a um criminoso injetar comandos SQL no back-end da aplicação e, assim, o mesmo consegue roubar informações importantes ou até mesmo apagá-las.

ladrão roubando dados

Do ponto de vista da segurança, SQL Injection é uma falha grave, que deve ser evitada. O primeiro passo para isso é entender que os dados concatenados em um comando SQL podem modificar sua lógica de execução.

Por exemplo, o comando abaixo procura por um usuário usando o e-mail/senha informados:

SELECT email, nome FROM usuario WHERE email = ‘{$usuario}’ AND senha = ‘{$senha}’

Substituindo as variáveis pelos valores abaixo, estaremos tentando localizar um usuário com o e-mail estevao@mail.com.br e senha meudogsnoopy:

SELECT email, nome FROM usuario WHERE email = ‘estevao@mail.com.br’ AND senha = ‘meudogsnoopy’

O que acontecerá se substituirmos o valor meudogsnoopy pela string ‘ or ‘’=” ?

SELECT email, nome FROM usuario WHERE email = ‘estevao@mail.com.br’ AND senha = ‘‘ or ‘’=’’

Perceba que a lógica do comando SELECT foi alterada e agora conseguimos autenticar apenas conhecendo o e-mail do usuário.

Como evitar isso?

ladrão preso

A técnica fundamental para evitar o SQL Injection é remover qualquer comando SQL dos dados informados pelo usuário da aplicação. Note que o que permitiu ao trecho de SQL ‘ or ‘’ =‘ ser concatenado corretamente ao comando SELECT foi o uso correto das aspas. Sendo assim, uma solução seria tratá-las com a adição de contrabarras:

SELECT email, nome FROM usuario WHERE email = ‘estevao@mail.com.br’ AND senha = ‘\‘ or \‘\’=’’

Pronto, agora o banco de dados considerará que a senha informada foi \‘ or \‘\’ = \’ o que não modificará o funcionamento do comando SELECT.

Uma outra solução é a utilização dos chamados prepared statements. Eles implementam diversas formas sofisticadas de lidar com SQL Injection. Algumas dentre elas são a pré-execução do comando SQL para verificação de falhas e impedir que múltiplos comandos sejam executados de uma única vez.

Geralmente usaremos os prepared statements com o auxílio de algum framework ou extensão. No vídeo deste devcast usamos o PDO para exemplificar essa solução em PHP.

Sugestão de conteúdo

Guias de consulta