Maison > Java > javaDidacticiel > Les instructions préparées en Java peuvent-elles gérer les noms de colonnes variables en toute sécurité dans MySQL ?

Les instructions préparées en Java peuvent-elles gérer les noms de colonnes variables en toute sécurité dans MySQL ?

Susan Sarandon
Libérer: 2024-12-06 20:09:12
original
302 Les gens l'ont consulté

Can Prepared Statements in Java Handle Variable Column Names Securely in MySQL?

Noms de colonnes variables à l'aide d'instructions préparées

Problème :

Les noms de colonnes variables peuvent-ils être spécifiés lors de l'utilisation d'instructions préparées dans MySQL en utilisant Java pour empêcher l'injection SQL vulnérabilités ?

Explication :

Les instructions préparées sont conçues pour protéger contre l'injection SQL en séparant les paramètres de requête de l'instruction de requête principale. Lorsque vous tentez d'utiliser des instructions préparées, les noms de colonnes ne sont pas reconnus en tant que paramètres et sont plutôt interpolés dans la requête en tant que valeurs littérales. Cela peut entraîner des problèmes de sécurité si les noms de colonnes fournis ne sont pas correctement nettoyés.

Solution :

  • Évitez les noms de colonnes dynamiques : Il est recommandé de reconcevoir le schéma de la base de données pour éliminer le besoin de noms de colonnes spécifiés par l'utilisateur. Envisagez plutôt de créer une colonne distincte pour stocker les noms de colonnes souhaités et de les inclure dans la requête.
  • Construction et nettoyage manuels des requêtes : Si les noms de colonnes dynamiques sont inévitables, vous devrez créez vous-même la chaîne de requête SQL. Utilisez la méthode String#replace() pour échapper aux guillemets incorporés dans les noms de colonnes afin d'empêcher l'injection SQL. Par exemple :
// Sanitize the user-provided column names
String sanitizedColumns = columnNames.replace("'", "\'");

// Build the SQL query string
String query = "SELECT a,b,c,ROW_NUMBER() OVER(), " + sanitizedColumns + " FROM " + name + " WHERE d=?";

// Prepare the statement
stmt = conn.prepareStatement(query);
stmt.setString(1, "x");
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal