Instruções preparadas são muito úteis para evitar injeção de MySQL.
Instruções preparadas são usadas para executar múltiplas instruções SQL idênticas com mais eficiência.
As declarações preparadas funcionam da seguinte forma:
Pré-processamento: Crie modelos de instruções SQL e envie-os para o banco de dados. Os valores reservados são marcados com o parâmetro "?". Por exemplo:
INSERT INTO MyGuests (nome, sobrenome, e-mail) VALUES(?, ?, ?)
Análise de banco de dados, compilação, otimização de consultas em modelos de instruções SQL e armazenamento de resultados sem saída.
Execução: Finalmente, o valor vinculado ao aplicativo é passado para o parâmetro (marca "?") e o banco de dados executa a instrução. O aplicativo pode executar a instrução várias vezes se os valores dos parâmetros forem diferentes.
Em comparação com a execução direta de instruções SQL, as instruções preparadas têm duas vantagens principais:
As instruções preparadas reduzem bastante o tempo de análise, pois apenas uma consulta é feita (embora a instrução seja executada diversas vezes).
A vinculação de parâmetros reduz a largura de banda do servidor, você só precisa enviar os parâmetros da consulta em vez da instrução inteira.
Instruções preparadas são muito úteis para injeção de SQL porque diferentes protocolos são usados após o envio dos valores dos parâmetros, garantindo a validade dos dados.
O exemplo a seguir usa instruções preparadas no MySQLi e vincula os parâmetros correspondentes:
Analise cada linha de código para o exemplo a seguir:
"INSERT INTO MyGuests (nome, sobrenome, e-mail) VALORES (?, ?, ?)"Na instrução SQL, usamos ponto de interrogação (?), aqui podemos substituir o ponto de interrogação por número inteiro, string, ponto flutuante de precisão dupla e valor booleano.
A seguir, vamos dar uma olhada na função bind_param():
$stmt->bind_param("sss", $nome, $sobrenome, $email);Esta função vincula parâmetros SQL e informa ao banco de dados o valor dos parâmetros. A coluna de parâmetro "sss" trata dos tipos de dados dos parâmetros restantes. O caractere s informa ao banco de dados que o parâmetro é uma string.
Existem quatro tipos de parâmetros:
i - inteiro (tipo inteiro)
d - double (tipo de ponto flutuante de precisão dupla)
s - corda
b - BLOB (objeto binário grande: objeto binário grande)
Cada parâmetro requer um tipo especificado.
Ao informar ao banco de dados o tipo de dados do parâmetro, você pode reduzir o risco de injeção de SQL.
Nota: Caso queira inserir outros dados (entrada do usuário), a validação dos dados é muito importante. |
No exemplo a seguir, usamos instruções preparadas e parâmetros de ligação no PDO: