Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como funciona a injeção de SQL e como me protejo contra isso


Uma injeção de SQL é uma consulta SQL formada maliciosamente usada para "confundir" um banco de dados SQL em fornecer algo que não deveria. Por exemplo, considere a seguinte consulta
"SELECT * FROM `users` WHERE `username` = '$name'";

Em um caso normal, isso funcionará. Se enviarmos 'Jack' para isso, ele retornará todos os usuários chamados Jack. No entanto, se um usuário digitar, diga "' OR 1=1", a consulta resultante será
"SELECT * FROM `users` WHERE `username` = '' OR 1=1";

Como 1 sempre é igual a 1, e a cláusula de combinação é OR, isso retornará true em todas as linhas, o que, por sua vez, exibirá TODAS as linhas para o usuário mal-intencionado. Usando esta técnica, alguém pode visualizar todo o seu banco de dados. Considere também se alguém enviar algo como "'; DROP TABLE users ";--, o que resulta em
"SELECT * FROM `users` WHERE `username` = ''; DROP TABLE `users`";--";

Que são duas consultas, uma que não fará nada, a segunda que excluirá o banco de dados de usuários INTEIRO, resultando na perda de seus dados.

O melhor método para evitar injeções de SQL é usar instruções preparadas. Com eles, você envia uma consulta ao banco de dados SQL que diz algo como
"SELECT * FROM `users` WHERE `username` = '?'";

Isso permite que o banco de dados saiba o formato da consulta (ONDE nome de usuário é igual a algum valor), para que não haja confusão quando for fornecida uma consulta de texto simples. Então o banco de dados sabe esperar um valor e onde colocá-lo. Então você passa esse valor para o banco de dados que ele pode usar para pesquisar. Isso também é melhor, pois o banco de dados pode otimizar a consulta para uma pesquisa mais rápida.

Leia as declarações preparadas, que explicarão isso com mais detalhes.