2009-08-12 5 views
3

J'écris donc un gestionnaire qui filtre un DataTable mis en cache basé sur AppRelativeCurrentExecutionFilePath à l'aide de la propriété DataView RowFilter. Quelle est la meilleure façon d'encoder l'entrée pour empêcher une attaque par injection?Attaques d'injection contre .NET DataView RowFilter

Est-ce suffisant? Y a-t-il un moyen meilleur/plus élégant?

dataView.RowFilter = String.Format("Name LIKE '{0}%'", EncodeString(query)); 

private string EncodeString(string s) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < s.Length; i++) 
    { 
     char c = s[i]; 
     if (c == '*' || c == '%' || c == '[' || c == ']') 
      sb.Append("[").Append(c).Append("]"); 
     else if (c == '\'') 
      sb.Append("''"); 
     else 
      sb.Append(c); 
    } 

    return sb.ToString(); 
} 
+0

je ne pense pas que vous pouvez injecter sql ici ... seulement provoquer une exception. Mais, oui c'est à peu près exactement ce que je fais. – dotjoe

+0

Si vous utilisez des données en mémoire, pourquoi utiliser 'DataTable' et pas n'importe quelle collection? Vous seriez en mesure de filtrer avec «Où» et ne pas se soucier des injections. –

+0

@SergRogovtsev - J'ai posé la question en '09 donc c'était probablement une application .NET 1.1. Les entreprises sont lentes à mettre à niveau. – MyItchyChin

Répondre

0

Vous ne pouvez pas injecter sql dans un RowFilter.

Edit: Comme l'a souligné, il est possible d'obtenir toutes les lignes de la table par injection, pourrait quelque chose comme les travaux suivants:

dataTable.AsEnumerable() 
    .Where(r => r.Field<string>("StringColumn").Contains(userInput)) 
    .ToList().ForEach(r => Console.WriteLine(r.Field<string>("StringColumn"))); 
+0

RowFilter est une chaîne très similaire à une clause SQL Where et exploitable par injection si vous construisez la chaîne de filtrage à partir de l'entrée de l'utilisateur. Dans mon exemple, je filtre un DataTable basé sur l'URL (par exemple http: // site/handler/stringUsedInFilter) et le filtre est une comparaison LIKE, donc quelque chose après "handler /" doit être nettoyé sinon quelque chose comme "% 25% 25% 25% 25% 25 "court-circuite la longueur minimum et vérifie les chaînes vides pour renvoyer le contenu entier de la table. "'" provoquerait l'invalidité du filtre et déclencherait une exception. etc ... – MyItchyChin

+0

Oui, afin de ne pas retourner la table complète, vous devez garder. Y at-il un cas où la table entière est retournée ou est-ce quelque chose que vous pouvez protéger? –

+0

@Yuriy: Et si l'entrée sur laquelle ils cherchent à filtrer est vraiment %%%%%? Cela ne leur ferait pas beaucoup de bien. Et si l'entrée est O'Brien? Cela provoquerait une exception SyntaxErrorException. L'entrée doit être filtrée. – MyItchyChin