J'ai construit un système prototype avec quelques requêtes de base de données. Comme c'était juste un prototype et que j'étais très nouveau dans les bases de données, j'ai juste utilisé une chaîne directe. Ceci est la chaîne je et il fonctionne très bien:VB.NET - Problèmes avec les requêtes paramétrées
command = New OleDbCommand("SELECT * FROM " + prefix + "CanonicForms WHERE Type=1 AND Canonic_Form='" + item + "'", dictionary_connection)
Maintenant, en le mettant dans un système réel, je voulais utiliser la méthode paramétré plus sûre, donc après quelques googler je suis venu avec ceci:
command = New OleDbCommand("SELECT * FROM @prefix WHERE Type=1 AND [email protected]", dictionary_connection)
command.Parameters.AddWithValue("@prefix", prefix + "CanonicForms")
command.Parameters.AddWithValue("@form", item)
Mais tout ce que j'obtiens est une erreur pour une clause de requête incomplète. Qu'ai-je fait différemment entre les deux?
Vraiment? Si vous avez un nom de table qui dépend d'une sorte d'entrée, cela ne vous ouvre-t-il pas autant les problèmes d'injection que de ne pas utiliser un paramètre? Si j'utilise simplement la concaténation pour la table, je veux dire – cost
Je dirais que cela pourrait vous ouvrir. Vous pourriez vouloir "assainir" le nom de la table - je pense que c'est quelque chose qui est assez commun. Personne n'aime concaténer une déclaration SQL, mais il y a des moments où vous n'avez pas vraiment le choix. –
@cost: l'injection SQL est le résultat de la concaténation d'une entrée UNVERIFIED/aseptisée. Si vous vérifiez l'entrée, vous n'êtes pas ouvert à l'injection SQL. Dans ce cas, la méthode préférée pour vérifier l'entrée consisterait à mapper ce que l'utilisateur entre dans un nom de table connu (sans utiliser directement l'entrée des utilisateurs). Si cela n'est pas possible, vérifiez d'abord que le nom de la table existe avant de concaténer il (c'est-à-dire utiliser une requête paramétrée contre information_schema.tables). Donc, oui, il est ouvert à l'injection, mais il ne doit pas être * vulnérable * à l'injection. – jmoreno