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.

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?

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
- Guia Linguagem PHP
- Guia MySQL