Je me demandais s'il était possible de spécifier des noms de colonne renvoyés en utilisant des instructions préparées. J'utilise MySQL et Java.Noms de colonnes variables utilisant des instructions préparées
Quand je l'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 reçois ce type de déclaration (impression juste 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, comme discuté here, mais je me demandais s'il y avait un moyen de le faire pour la colonne des noms.
Si ce n'est pas le cas, alors je vais devoir essayer de m'assurer que je désinfecte l'entrée afin qu'elle n'aboutisse pas à des vulnérabilités d'injection SQL.
Eh bien, l'utilisateur n'a pas réellement besoin de connaître les noms des colonnes, mais les noms de colonnes nécessaires sont déduits en fonction des formulaires soumis par l'utilisateur. Cela est géré du côté client, donc je voulais voir s'il y avait un moyen de garantir la sécurité des données. Devrais-je simplement déplacer tout le lot vers le serveur, pour que les données de la colonne ne soient pas endommagées? – KLee1
Manipulez-le du côté serveur à la place. Ne faites pas les affaires du côté client. – BalusC
@BalusC: _ "vous ne pouvez pas définir les noms de colonnes comme des valeurs PreparedStatement" _ - elles sont entièrement composées. L'utilisation de noms de colonne à l'intérieur de listes de valeurs d'instructions préparées est bien sûr possible - mais cela ne signifie pas qu'il devrait être utilisé de cette façon, il s'agit toujours d'un mauvais design. – specializt