Tout ce que j'ai vu sur les attaques par injection SQL semble suggérer que les requêtes paramétrées, en particulier celles dans les procédures stockées, sont le seul moyen de se protéger contre de telles attaques. Pendant que je travaillais (à l'époque des ténèbres), les procédures stockées étaient considérées comme une mauvaise pratique, principalement parce qu'elles étaient considérées comme moins maintenables; moins testable; fortement couplé; et verrouillé un système dans un seul fournisseur; ( cette question couvre d'autres raisons).
Bien que lorsque je travaillais, les projets ignoraient pratiquement la possibilité de telles attaques; diverses règles ont été adoptées pour sécuriser la base de données contre toute forme de corruption. Ces règles peuvent être résumées comme suit:
- Aucun client / application n'avait un accès direct aux tables de la base de données.
- Tous les accès à toutes les tables se faisaient via des vues (et toutes les mises à jour des tables de base ont été effectuées via des déclencheurs).
- Tous les éléments de données avaient un domaine spécifié.
- Aucun élément de données ne pouvait être annulé - cela avait des implications qui obligeaient parfois les DBA à grincer des dents; mais a été appliquée.
- Les rôles et les autorisations ont été configurés de manière appropriée - par exemple, un rôle restreint pour donner uniquement aux vues le droit de modifier les données.
Un ensemble de règles (appliquées) comme celui-ci (mais pas nécessairement cet ensemble particulier) est-il donc une alternative appropriée aux requêtes paramétrées pour empêcher les attaques par injection SQL? Sinon, pourquoi pas? Une base de données peut-elle être sécurisée contre de telles attaques par des mesures spécifiques à la base de données (uniquement)?
ÉDITER
L'accent mis sur la question a légèrement changé, à la lumière des premières réponses reçues. Question de base inchangée.
EDIT2
L'approche consistant à s'appuyer sur des requêtes paramétrisées ne semble être qu'une étape périphérique de la défense contre les attaques de systèmes. Il me semble que des défenses plus fondamentales sont à la fois souhaitables et peuvent rendre la dépendance à de telles requêtes inutile, ou moins critique, même pour se défendre spécifiquement contre les attaques par injection.
L'approche implicite dans ma question était basée sur le "blindage" de la base de données et je ne savais pas si c'était une option viable. Des recherches supplémentaires ont suggéré qu'il existe de telles approches. J'ai trouvé les sources suivantes qui fournissent quelques indications sur ce type d'approche:
http://database-programmer.blogspot.com
http://thehelsinkideclaration.blogspot.com
Les principales caractéristiques que j'ai tirées de ces sources sont:
- Un vaste dictionnaire de données, combiné avec un vaste dictionnaire de données de sécurité
- Génération de déclencheurs, requêtes et contraintes à partir du dictionnaire de données
- Minimisez le code et maximisez les données
Bien que les réponses que j'ai reçues jusqu'à présent soient très utiles et mettent en évidence les difficultés résultant du non-respect des requêtes paramétrées, elles ne répondent finalement pas à ma ou mes questions d'origine (désormais soulignées en gras).