Variable noms de colonne à l'aide de déclarations préparées à l'avance
Je me demandais si il y avait de toute façon à spécifier retourné les noms de colonnes à l'aide de déclarations préparées à l'avance.
Je suis de l'utilisation de MySQL et Java.
Quand je l'ai essayer:
String columnNames="d,e,f"; //Actually from the user...
String name = "some_table"; //From user...
String query = "SELECT a,b,c,? FROM " + name + " WHERE d=?";//...
stmt = conn.prepareStatement(query);
stmt.setString(1, columnNames);
stmt.setString(2, "x");
- Je obtenir ce type de déclaration (en cours d'impression à droite avant l'exécution).
SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'
Je voudrais voir cependant:
SELECT a,b,c,d,e,f FROM some_table WHERE d='x'
Je sais que je ne peux pas le faire pour les noms de table, tel que discuté
ici, mais je me demandais si il y avait moyen de le faire pour les noms de colonne.
Si il n'y est pas, alors, je vais juste essayer et assurez-vous que je désinfecter l'entrée afin de ne pas entraîner les vulnérabilités d'injection SQL.
Vous devez vous connecter pour publier un commentaire.
Cela indique une mauvaise conception bd. L'utilisateur ne devrait pas besoin de connaître les noms de colonne. Créer un véritable DB colonne qui détient de ceux de la colonne "noms" et de stocker les données le long de la place.
À n'importe quel moyen, non, vous ne pouvez pas définir les noms de colonnes comme
PreparedStatement
valeurs. Vous ne pouvez régler la colonne valeurs commePreparedStatement
valeursSi vous souhaitez continuer dans cette direction, vous avez besoin de désinfecter les noms de colonnes et les concaténer/construire la chaîne SQL vous-même. Citation de le séparer les noms de colonnes et de l'utilisation
String#replace()
pour échapper à la même citation à l'intérieur de la colonne nom.Préparer une liste de noms de colonnes. Utiliser le "query" pour rechercher dans la liste blanche pour voir si le nom de la colonne est là. Sinon, rejeter la requête.
Je pense que ce cas ne peut pas fonctionner parce que le point de l'ensemble de l'instruction préparée est d'empêcher l'utilisateur de mettre en sans échappement requête bits - donc, vous allez toujours avoir le texte échappés.
Vous aurez besoin de stériliser cette entrée en Java si vous souhaitez affecter la structure de la requête en toute sécurité.
Utiliser sql injection inconvénient de la Déclaration de l'Interface que l'avantage.
Ex:
Ci-dessous est la solution en java.