Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

quão seguras são as declarações preparadas pelo DOP


Estritamente falando, não há necessidade de escapar, porque o valor do parâmetro nunca é interpolado na string de consulta.

A maneira como os parâmetros de consulta funcionam é que a consulta é enviada ao servidor de banco de dados quando você chama prepare() , e os valores dos parâmetros são enviados posteriormente, quando você chama execute() . Portanto, eles são mantidos separados da forma textual da consulta. Nunca há uma oportunidade para injeção de SQL (desde que PDO::ATTR_EMULATE_PREPARES é falso).

Então, sim, os parâmetros de consulta ajudam você a evitar essa forma de vulnerabilidade de segurança.

Eles são 100% à prova de qualquer vulnerabilidade de segurança? Não, claro que não. Como você deve saber, um parâmetro de consulta só substitui um único valor literal em uma expressão SQL. Você não pode fazer um único parâmetro substituto para uma lista de valores, por exemplo:
SELECT * FROM blog WHERE userid IN ( ? );

Você não pode usar um parâmetro para tornar dinâmicos nomes de tabelas ou nomes de colunas:
SELECT * FROM blog ORDER BY ?;

Você não pode usar um parâmetro para nenhum outro tipo de sintaxe SQL:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;

Portanto, existem alguns casos em que você precisa manipular a consulta como uma string, antes do prepare() ligar. Nesses casos, você ainda precisa escrever o código com cuidado para evitar injeção de SQL.