Separar instruções de dados
Uma consulta preparada permite passar valores como parâmetros em vez de os concatenar na instrução SQL. Isso reduz o risco de a entrada alterar a estrutura da consulta. Os parâmetros representam valores; nomes de tabelas ou colunas dinâmicos precisam de uma lista explícita de opções permitidas.
Transações e propriedade
Usa uma transação quando várias alterações precisam de ser confirmadas em conjunto. Aplica também autorização: uma consulta parametrizada continua a poder devolver o registo de outra pessoa se não limitar o proprietário. Segurança da consulta e autorização resolvem problemas diferentes.
Aplicação guiada no trabalho
Uma consulta de notas privadas precisa de duas decisões: separar valores da estrutura SQL e limitar o recurso ao âmbito autorizado. Usa parâmetros para IDs e texto; o utilizador autenticado tem de vir do contexto validado no servidor, não de um owner_id arbitrário enviado no pedido. Para ordenar por title ou created_at, mapeia a opção recebida para uma das colunas fixas permitidas. Não esperes que ORDER BY :column transforme um parâmetro num identificador. Em IN, uma string com vírgulas também não se transforma numa lista de valores: constrói um placeholder por valor validado e define o comportamento de uma lista vazia. Transações agrupam escritas segundo as garantias do motor, mas não conferem permissões nem eliminam automaticamente a concorrência.
$stmt = $pdo->prepare(
"SELECT id, title FROM notes WHERE id = :id AND user_id = :user"
);
$stmt->execute(["id" => $noteId, "user" => $currentUserId]);Um utilizador altera o identificador de uma nota no URL. A aplicação deve procurar a nota dentro da conta autenticada e recusar o acesso a notas de outras contas.
Armadilhas comuns
Ligar nomes de coluna como valores; concatenar listas recebidas; confiar no owner_id do cliente.
Tópicos relacionados: Segurança na fronteira web · Transações e falhas parciais em PDO
Parametriza valores e verifica o proprietário de cada recurso protegido.
Referência: PHP manual: PDO prepared statements · PHP 8.5 reference; DR PHP 2026.3; new fixtures executed on PHP 8.4.4 / SQLite 3.51.2