FlawOpen

flawopen.com/SQL Injection/Qu'est-ce qu'une requête paramétrée ?

Qu'est-ce qu'une requête paramétrée, en termes simples ?

Page de référence
En termes simples

Imagine un formulaire à champs étiquetés : le programme garde les instructions fixes et demande à la bibliothèque de base de données de placer chaque valeur dans le champ correspondant. La bibliothèque peut utiliser une préparation native côté serveur ou l’émuler côté client, mais le code ne doit pas réécrire les instructions avec des données utilisateur.

Le mécanisme

Avec une requête préparée nativement côté serveur, le pilote prépare le SQL contenant les marqueurs et fournit les valeurs liées lors de l’exécution. Le protocole et le moment varient selon la base et le pilote. Certains pilotes peuvent émuler la préparation côté client ; PDO documente explicitement ce mode. L’appel d’API ne suffit donc pas à déterminer comment la valeur est transmise. Gardez la structure SQL fixe, utilisez l’API de liaison documentée par le pilote et vérifiez si le mode natif ou émulé est actif.

Pourquoi c'est différent de simplement « échapper avec soin »

L’échappement manuel demande au code de l’application d’encoder correctement les valeurs avant leur concaténation ; cette approche est fragile et dépend du contexte. Une API de paramètres délègue le traitement des valeurs au pilote. Avec une préparation native côté serveur, les valeurs passent par des paramètres distincts dans le protocole ; avec l’émulation, le pilote traite les marqueurs côté client. N’intégrez pas les entrées utilisateur dans des chaînes SQL construites par l’application et vérifiez le comportement de liaison documenté par le pilote.

FAQ

Est-ce la même chose qu'une « requête préparée » ?

Très proche — une requête préparée est l'objet côté base de données créé à partir de la structure fixe de la requête ; la paramétrisation est la pratique consistant à y lier des valeurs séparément. Les termes sont souvent employés indifféremment.

Cela fonctionne-t-il pour toutes les parties d'une requête ?

Seulement pour les valeurs (données), pas pour les identifiants comme les noms de tables ou de colonnes — ceux-ci exigent une autre défense, généralement une liste d'autorisation.

Références

À voir aussi Injection SQL (CWE-89) : fonctionnement et prévention dans chaque langage — flawopen.com Prisma $queryRaw protège-t-il contre les injections SQL ? L’interpolation dans where() de Rails est-elle sûre ? Sequelize query() protège-t-il contre les injections SQL ? SQLAlchemy text() protège-t-il contre les injections SQL ? La vérification des requêtes sqlx à la compilation empêche-t-elle les injections SQL ? Les procédures stockées empêchent-elles l’injection SQL ?