À proprement parler, aucun échappement n'est nécessaire, car la valeur du paramètre n'est jamais interpolée dans la chaîne de requête.
La façon dont les paramètres de requête fonctionnent est que la requête est envoyée au serveur de base de données lorsque vous appelez prepare()
, et les valeurs des paramètres sont envoyées plus tard, lorsque vous appelez execute()
. Ils sont donc séparés de la forme textuelle de la requête. Il n'y a jamais d'opportunité d'injection SQL (à condition que PDO::ATTR_EMULATE_PREPARES
est faux).
Alors oui, les paramètres de requête vous aident à éviter cette forme de faille de sécurité.
Sont-ils à 100 % à l'abri de toute faille de sécurité ? Non bien sûr que non. Comme vous le savez peut-être, un paramètre de requête ne remplace qu'une seule valeur littérale dans une expression SQL. Vous ne pouvez pas remplacer un seul paramètre par une liste de valeurs, par exemple :
SELECT * FROM blog WHERE userid IN ( ? );
Vous ne pouvez pas utiliser un paramètre pour rendre les noms de table ou les noms de colonne dynamiques :
SELECT * FROM blog ORDER BY ?;
Vous ne pouvez pas utiliser un paramètre pour tout autre type de syntaxe SQL :
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
Il y a donc pas mal de cas où vous devez manipuler la requête comme une chaîne, avant le prepare()
appel. Dans ces cas, vous devez toujours écrire le code avec soin pour éviter l'injection SQL.