2010-05-05 7 views
4

J'ai une mauvaise situation ici. Je suis coincé avec le serveur de commerce, qui ne fait pas beaucoup de désinfection/paramétrage.Requêtes paramétrées/sans/en utilisant les requêtes

Je tente de créer mes requêtes pour empêcher l'injection SQL, mais certaines choses comme la clause search/where sur l'objet de recherche doivent être construites, et il n'y a pas d'interface paramétrée.

Fondamentalement, je ne peux pas paramétrer, mais j'espérais pouvoir utiliser le même moteur pour BUILD mon texte de requête si possible. Existe-t-il un moyen de le faire, en dehors de l'écriture de mon propre moteur de paramétrage qui ne sera probablement pas aussi bon que les requêtes paramétrées?

Mise à jour: Exemple

La clause where doit être construit comme une requête SQL where essentiellement:

CatalogSearch search = /// Create Search object from commerce server 
search.WhereClause = string.Format("[cy_list_price] > {0} AND [Hide] is not NULL AND [DateOfIntroduction] BETWEEN '{1}' AND '{2}'", 12.99m, DateTime.Now.AddDays(-2), DateTime.Now); 

* exemple ci-dessus est la façon dont vous affiner la recherche, mais nous avons fait quelques tests, cette chaîne est PAS DÉSINFECTUE.

C'est là que réside mon problème, parce que n'importe laquelle de ces entrées dans le format .Format pourrait être saisie par l'utilisateur, et bien que je puisse nettoyer facilement mes entrées de boîtes de texte, je vais la nature des choses. Je n'ai pas l'option ici pour utiliser une requête paramétrée parce que Commerce Server a une logique descendante folle dans la façon dont il gère l'ensemble extensible de champs (schéma) & les mots de recherche en texte libre sont pré-compilés quelque part. Cela signifie que je ne peux pas aller directement aux tables sql

Ce que je/amour/à voir est quelque chose le long des lignes de:

SqlCommand cmd = new SqlCommand("[cy_list_price] > @MinPrice AND [DateOfIntroduction] BETWEEN @StartDate AND @EndDate"); 
cmd.Parameters.AddWithValue("@MinPrice", 12.99m); 
cmd.Parameters.AddWithValue("@StartDate", DateTime.Now.AddDays(-2)); 
cmd.Parameters.AddWithValue("@EndDate", DateTime.Now); 

CatalogSearch search = /// constructor 
search.WhereClause = cmd.ToSqlString(); 
+0

(c'était une bonne idée de souligner votre scénario, et pourquoi vous ne pouvez pas utiliser les paramètres, merci) –

+1

Pouvez-vous nous donner un exemple de ce que/comment vous essayez d'accomplir avec cela? –

Répondre

1

Il semble que vous devrez aller vieille école et validez les données vous-même avant de construire la requête. Je ne suis pas un gars .NET mais dans le monde de CGI je désinfectez l'entrée avec quelque chose comme:

$foo =~ s/[^a-zA-Z0-9*%]//g 

Cela va contrecarrer toute injection SQL je peux penser et laisser encore wildcards. Le seul problème est que les regex sont chères.