A ideia é muito simples - a consulta e os dados são enviados ao servidor de banco de dados separadamente .
Isso é tudo.
A raiz do problema de injeção de SQL está na mistura do código e dos dados.
De fato, nossa consulta SQL é um programa legítimo . E estamos criando esse programa dinamicamente, adicionando alguns dados rapidamente. Assim, os dados podem interferir no código do programa e até alterá-lo, como todo exemplo de injeção de SQL mostra (todos os exemplos em PHP / Mysql):
$expected_data = 1;
$query = "SELECT * FROM users where id=$expected_data";
produzirá uma consulta regular
SELECT * FROM users where id=1
enquanto esse código
$spoiled_data = "1; DROP TABLE users;"
$query = "SELECT * FROM users where id=$spoiled_data";
produzirá uma sequência maliciosa
SELECT * FROM users where id=1; DROP TABLE users;
Funciona porque estamos adicionando os dados diretamente ao corpo do programa e ele se torna parte do programa, para que os dados possam alterar o programa e, dependendo dos dados transmitidos, teremos uma saída regular ou uma tabela users
excluída.
Embora, no caso de declarações preparadas, não alteremos nosso programa, ele permanece intacto.
Esse é o ponto.
Estamos enviando um programa para o servidor primeiro
$db->prepare("SELECT * FROM users where id=?");
onde os dados são substituídos por alguma variável chamada parâmetro ou espaço reservado.
Observe que exatamente a mesma consulta é enviada ao servidor, sem dados! E então estamos enviando os dados com a segunda solicitação, essencialmente separados da própria consulta:
$db->execute($data);
portanto, não pode alterar nosso programa e causar algum dano.
Muito simples - não é?
A única coisa que devo acrescentar é que sempre omitido em todos os manuais:
As instruções preparadas podem proteger apenas literais de dados , mas não podem ser usadas com nenhuma outra parte da consulta.
Assim, uma vez que precisamos adicionar, digamos, um identificador dinâmico - um nome de campo, por exemplo - as instruções preparadas não podem nos ajudar. Eu expliquei o assunto recentemente , então não vou me repetir.