Maison >base de données >tutoriel mysql >Comment puis-je récupérer des données avec des noms de colonnes dynamiques à l'aide d'instructions préparées dans MySQL et Java ?
Récupération dynamique de noms de colonnes dans MySQL et Java à l'aide d'instructions préparées : une approche plus sûre
De nombreux développeurs MySQL et Java ont exploré l'utilisation d'instructions préparées pour récupérer des données avec des noms de colonnes générés dynamiquement. Cependant, la substitution directe des noms de colonnes dans les paramètres d'une instruction préparée n'est pas prise en charge et introduit des risques de sécurité importants. Une refonte du schéma de base de données est généralement la meilleure solution.
Tenter d'utiliser des instructions préparées de cette manière, comme indiqué ci-dessous, entraîne une erreur :
<code class="language-java">String columnNames = "d,e,f"; String query = "SELECT a,b,c,?" + " FROM " + name + " WHERE d=?"; // This results in "SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'", not the desired result.</code>
La requête traite l'espace réservé ?
comme une chaîne littérale, et non comme un nom de colonne.
Pour éviter les vulnérabilités d'injection SQL, une méthode plus robuste consiste à stocker les noms de colonnes dynamiques dans la base de données elle-même. Considérons un tableau comme "user_data" avec ces colonnes :
id
(clé primaire)user_name
column_names
(une chaîne de noms de colonnes séparés par des virgules)La requête SQL peut ensuite être construite en concaténant les column_names
récupérés de cette table :
<code class="language-java">String query = "SELECT a,b,c," + columnNames + " FROM " + name + " WHERE d=?";</code>
Cette approche garantit que les noms de colonnes ne sont pas traités comme des paramètres susceptibles aux attaques par injection. Bien qu'il utilise la concaténation de chaînes, la partie vulnérable (les noms de colonnes) est déjà nettoyée en étant récupérée de la base de données. N'oubliez pas de toujours nettoyer toutes les données fournies par l'utilisateur et utilisées dans la construction des requêtes, même si elles ne font pas directement partie de l'instruction SQL. Cette approche révisée offre une solution plus sûre et plus gérable pour gérer les noms de colonnes dynamiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!