Question

J'ai une base de données (SQL Server 2005) dans laquelle j'aimerais créer des vues à la volée. Dans mon code, je construis une instruction CREATE VIEW, mais la seule façon de la faire fonctionner est de générer la chaîne de requête complète et de l'exécuter à nu. J'aimerais utiliser des paramètres, mais ceci:

SqlCommand cmd = new SqlCommand("CREATE VIEW @name AS SELECT @body");
cmd.Parameters.AddWithValue("@name", "foo");
cmd.Parameters.AddWithValue("@body", "* from bar");

indique une erreur "près du mot clé VIEW". (probablement le "@ nom") - inutile de dire "CREATE VIEW foo AS SELECT * FROM bar" fonctionne comme un champion.

N’est-ce pas possible? Si ce n'est pas le cas, existe-t-il un meilleur moyen de nettoyer l'entrée avant d'exécuter l'instruction CREATE? Dans certains cas, le corps de la requête pouvait avoir une entrée d'utilisateur et je me sentirais plus en sécurité s'il y avait un moyen de dire "traiter cela comme le corps d'une seule instruction". Peut-être que ce que je demande est tout simplement trop étrange?


SUIVI 4 novembre: Oui, oui, ce que je veux, c'est un peu comme une injection SQL quand on y arrive, mais j'aimerais au moins minimiser (sinon supprimer totalement) la possibilité d'exécuter cette commande et de supprimer une table ou quelque chose du genre. Certes, l'utilisateur qui l'exécute n'a pas l'autorisation de supprimer des tables, mais je pense que vous avez compris l'idée. J'aimerais beaucoup pouvoir dire, en effet, "Cette instruction ne modifiera en aucune manière les données existantes {...}", .

La façon dont il est codé actuellement consiste à effectuer une concaténation de chaînes, comme dans la réponse de Friol , mais cela ne supprime pas du tout la désinfection. Je me sentirais mieux si je pouvais au moins le frotter pour les personnages suspects, comme; ou - ou qu'avez-vous. J'espérais qu'il pourrait y avoir une fonction de bibliothèque pour faire le récurage pour moi, ou quelque chose du genre.

Était-ce utile?

La solution

Peut-être que je ne l'ai pas bien compris, mais ce qui vous empêche de le faire:

viewname="foo";
viewwhere="* from bar";

SqlCommand cmd = new SqlCommand("CREATE VIEW "+viewname+" AS SELECT "+viewwhere);

Autres conseils

Les paramètres ne sont pas simplement des substitutions de chaînes. C'est pourquoi votre code ne fonctionnera pas.

C'est comme vous ne pouvez pas le faire

sql = " select * from orders où orders_id in (?) "

et passez "1,2,3,5" en paramètre.

Les paramètres sont contrôlés par type et ne peuvent contenir que des valeurs scalaires IIRC.

Injection SQL. Vous le voulez, c'est le point. Vous devriez concaténer ce genre de choses.

Il me semble que vous essayez de créer une requête dynamique à l'aide de paramètres, ce qui n'est pas le fonctionnement normal d'une requête paramétrée. Ils ne sont pas simplement concaténés dans la chaîne.

Si vous essayez d'empêcher l'injection SQL, je vérifierais que le nom de la vue ne contient que des caractères alphanumériques et aucun mot-clé T-SQL. Je voudrais aussi faire très attention à la création physique du corps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top