Strengt taget er der faktisk ikke behov for at undslippe, fordi parameterværdien aldrig interpoleres i forespørgselsstrengen.
Måden forespørgselsparametre fungerer på er, at forespørgslen sendes til databaseserveren, når du kaldte prepare()
, og parameterværdier sendes senere, når du kaldte execute()
. Så de holdes adskilt fra forespørgslens tekstform. Der er aldrig en mulighed for SQL-injektion (forudsat PDO::ATTR_EMULATE_PREPARES
er falsk).
Så ja, forespørgselsparametre hjælper dig med at undgå denne form for sikkerhedssårbarhed.
Er de 100 % bevis mod enhver sikkerhedssårbarhed? Nej selvfølgelig ikke. Som du måske ved, træder en forespørgselsparameter kun i stedet for en enkelt bogstavelig værdi i et SQL-udtryk. Du kan ikke få en enkelt parameter til at erstatte en liste med værdier, for eksempel:
SELECT * FROM blog WHERE userid IN ( ? );
Du kan ikke bruge en parameter til at gøre tabelnavne eller kolonnenavne dynamiske:
SELECT * FROM blog ORDER BY ?;
Du kan ikke bruge en parameter til nogen anden type SQL-syntaks:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
Så der er en del tilfælde, hvor du skal manipulere forespørgslen som en streng, før prepare()
opkald. I disse tilfælde skal du stadig skrive kode omhyggeligt for at undgå SQL-injektion.