Usar parâmetros vinculados é suficiente em casos comuns e é uma boa prática para evitar injeção de SQL.
Mas um parâmetro em uma instrução preparada pode ser usado apenas para um valor em uma expressão SQL. Em outras palavras, onde você normalmente escreveria um literal de string entre aspas, um literal de data entre aspas ou um literal numérico. E um parâmetro ==um valor (sem listas).
Você deve usar parâmetros vinculados para esses casos. Se você está fazendo essa pergunta porque acha que pode querer pular o uso de parâmetros vinculados se alguém responder que eles não são suficientes, desculpe, você não será dispensado das práticas de programação seguras.
No entanto, existem outros casos (talvez menos comuns) para os quais os parâmetros vinculados não funcionam. Se você precisar escrever uma consulta com um nome de tabela dinâmica, nome de coluna ou outro identificador, ou uma expressão inteira ou uma palavra-chave SQL, precisará de outro método. Esses casos devem ser corrigidos na sintaxe SQL em prepare tempo, então eles não podem ser parametrizados.
Por exemplo, aqui está uma consulta com partes dinâmicas denotadas pelo uso de variáveis, que não podem ser parâmetros:
$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc";
Você deve usar a lista de permissões para esses casos . Em outras palavras, certifique-se de que uma string que você interpolar em sua consulta como um nome de tabela dinâmica seja, na verdade, uma das tabelas que existem em seu banco de dados. Certifique-se de que as palavras-chave SQL sejam palavras-chave legítimas.
Nunca pegue a entrada do usuário literalmente e interpole-a em SQL (ou qualquer outro código que seja analisado em tempo de execução, como o argumento que você alimenta para
eval()
ou shellexec()
). E não é apenas a entrada do usuário que pode ser um conteúdo inseguro. Veja também minha apresentação Mitos e falácias de injeção de SQL para mais explicações.