2010-11-22 6 views
3

Dans ADO.NET, vous pouvez ajouter des paramètres à un objet de commande pour ajouter en toute sécurité une entrée utilisateur à une requête SQL. Quel est l'équivalent pour les autres prédicats communs à une requête SQL? J'écris un programme qui est essentiellement un mappeur O-R très limité et un générateur SQL (il se concentre fortement autour d'une base de données avec des méta-informations et d'autres bases de données conformes à ces méta-données). En conséquence, je dois pouvoir appeler des choses comme:Comment créer de manière sécurisée des requêtes dans ADO.NET où les tables sélectionnées sont modifiées?

string sql = "select " + USER_SELECTED_COLUMNS + 
      " from " + USER_SELECTED_TABLE + 
      " where " + USER_CRITERIA; 

Certaines d'entre elles (comme le criteria) est littéralement entré dans mon programme par des utilisateurs de confiance (autres développeurs dans mon entreprise), tandis que d'autres données sont saisies Je souhaite que ce programme soit sécurisé, et je suis conscient que ce qui précède ne l'est pas. Actuellement, j'ai le USER_SELECTED_COLUMNS remplacé par les paramètres de commande, mais je n'ai pas été en mesure de trouver l'équivalent pour le CRITERIA et TABLEs. (Ou les colonnes order-by). Existe-t-il des fonctionnalités ADO.NET similaires à SqlParameter que je peux utiliser pour les prédicats de non-sélection?

+1

Ceci est un cauchemar d'injection SQL, procéder soigneusement et obtenir un test de stylo décent fait sur votre application. – Jamiec

+0

Oui, je sais. Ainsi la question. D'un autre côté, nos clients utilisent depuis maintenant 16 ans une version 100% sensible aux attaques par injection. C'est la belle chose à propos de la relation entreprise-client. Mais: depuis que je l'ai migré de VB6/ADO à C#/ADO.NET, j'ai pensé qu'une sécurité supplémentaire ne ferait pas de mal. – Crisfole

Répondre

5

Je ne pense pas que je pourrais vous dire comment éviter une injection SQL dans 1 réponse, cependant, le pointeur principal que je peux vous donner est la suivante:

UTILISATION NON, listes blanches listes noires. C'est-à-dire, lors de la désinfection de l'entrée des utilisateurs pour USER_SELECTED_TABLE, l'entrée possible ne devrait être que les tables possibles.

De même, l'entrée USER_SELECTED_COLUMNS doit être limitée aux colonnes possibles pour USER_SELECTED_TABLE.

+0

+1 pour les listes blanches. Amen! – Steven

+0

Donc, je comprends qu'il n'y a pas de véritable moyen de désinfecter les paramètres autres que les colonnes sélectionnées? – Crisfole

2

lorsque vous créez les écrans qui permettent à l'utilisateur de sélectionner la table et les colonnes n'utilisent pas les noms réels. Sorte de comment vous auriez un UserID mais montrer le UserName. Utilisez l'ID_objet et l'ID_colonne (comme le formulaire sys.tables.object_id et sys.columns.object_id + column_id). Pas ceux dans votre procédure et de construire votre SQL en utilisant uniquement les identifiants numériques qui se joignent aux vues du système:

sys.tables (Transact-SQL)
sys.columns (Transact-SQL)

vous pouvez concaténer les noms de table de chaînes et de colonne, mais ils viendront du système vues et non de l'entrée de l'utilisateur.

1

Exécutez toutes les variables que vous avez indiquées ci-dessus via Microsoft Web Protection Library. Il fournira la sécurité des attaques SQL et XSS. Il y a des exemples dans le téléchargement pour vous montrer comment l'utiliser dans codebehind.

Questions connexes