2010-09-06 2 views
0

Je développe une application qui est destinée à la surveillance SQL, c'est juste une application console qui s'exécutera toutes les 5 minutes sur un tas de serveurs. Il a un fichier de configuration avec une chaîne de connexion et une requête sql. La chose est que je voudrais que le programme n'accepte que les requêtes SELECT.Force SqlCommand-class SELECT uniquement?

Un de mes collègues m'a dit qu'il pensait que je pouvais mettre quelque chose dans la classe SqlCommand, mais que je fais des recherches Google sans succès. Quelqu'un at-il une solution propre à mon problème? J'ai réfléchi à la recherche de mots différents dans la requête, mais cela peut aller mal.

Toutes les suggestions sont les bienvenues!

Répondre

-2

octroi de privilèges serait la meilleure façon d'aller, mais vous pouvez toujours analyser l'instruction, même si sa une série de commandes SQL, en utilisant quelque chose comme ceci:

bool OkToRun = true; 
foreach(string s in TheQueryString.Split(";".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)) 
    if (!s.Trim().ToUpper().StartsWith("SELECT ")) 
     OkToRun = false; 
+0

Accepter que les privilèges d'octroi seraient la meilleure solution, mais dans ce cas, le fichier config donne le programme à l'utilisateur .. Je vais aller avec votre exemple de code jusqu'à ce que je trouve quelque chose de mieux! Merci – Tiax

+1

Toutes les requêtes SELECT ne mèneront pas avec le mot-clé 'SELECT' par exemple. ceux qui emploient un CTE. – onedaywhen

0

Cela ne sera pas possible à moins que votre application génère l'instruction SELECT entière elle-même. Le problème est que même si vous vous assurez que le premier mot est SELECT, rien n'empêche un utilisateur malicieux de terminer la commande et d'émettre une instruction EXEC ou UPDATE également. La meilleure solution consiste à s'assurer que le compte d'utilisateur référencé dans votre chaîne de connexion a des autorisations limitées sur les objets SQL et que seul le SELECT des objets pris en charge fonctionnera.

+0

C'est ce que je Ment par « Je J'ai pensé à chercher dans la requête pour trouver des mots différents, mais c'est trop de choses qui peuvent mal tourner. =/ – Tiax

2

La table de base de données elle-même peut être restreinte.
vous pouvez révoquer toutes les autorisations mais sélectionner parmi l'utilisateur de votre application.
rechercher les commandes REVOKE/GRANT pour SQL-SERVER.

+0

Étant donné que le fichier de configuration inclut la chaîne de connexion, l'application elle-même ne fournit pas d'utilisateur. – Tiax

+0

Cela n'a rien à voir avec l'application. Cette commande REVOKE devrait fonctionner sur la base de données elle-même. L'application utilise toujours un utilisateur pour connecter la base de données. –