Os ataques por injecção de comandos SQL são ataques que visam os sites web apoiando-se em bases de dados relacionais.
Neste tipo de site, os parâmetros são passados à base de dados sob a forma de um pedido SQL. Assim, se o projectista não efectuar nenhum controlo sobre os parâmetros passados no pedido SQL, é possível que um pirata altere o pedido a fim de aceder ao conjunto da base de dados, ou mesmo alterar o conteúdo.
Com efeito, certos caracteres permitem conectar vários pedidos SQL ou ignorar a sequência do pedido. Assim, inserindo este tipo de carácter no pedido, um pirata pode potencialmente executar o pedido à sua escolha.
Vejamos o seguinte pedido, esperando como parâmetro um nome de utilizador:
SELECT * FROM utilisateurs WHERE nom="$nom";
Basta que um pirata introduza um nome como “toto” OR 1=1 OR nome = " titi” para que o pedido se torne no seguinte:
SELECT * FROM utilisateurs WHERE nom="toto" OR 1=1 OR nom ="titi";
Assim, com o pedido acima, a cláusula WHERE sempre é realizada, que significa que devolverá os registos que correspondem a todos os utilizadores.
Além disso, certos sistemas de gestão de bases de dados, como Microsoft SQL Server, possuem procedimentos armazenados que permitem lançar comandos de administração. Estes procedimentos armazenados são potencialmente perigosos, na medida em que podem permitir a um utilizador mal-intencionado executar comandos do sistema, podendo conduzir a uma eventual intrusão.
Diversas regras permitem precaver-se contra os ataques por injecção de comandos SQL: