2015-09-11 1 views
0

Notre magasin dispose d'un code généralisé de journalisation des erreurs qui, pour les pages Web, inclut la consignation des propriétés de requête. Cet enregistreur d'erreurs est stable depuis des années. Dernièrement, nous avons eu quelques erreurs où l'entrée de formulaire de l'utilisateur n'a pas pu être traitée, puis l'enregistreur a également bombardé en essayant d'examiner les champs de formulaire. Il a réussi à identifier Request.Headers juste avant d'essayer Request.Form. Laissant certaines choses de mise en forme est probablement pas pertinente, elle se résume essentiellement à:ASP.Net: l'itération sur la collection Request.Form génère une exception de référence nulle

try 
{ 
    foreach (string key in HttpContext.Current.Request.Form.Keys) 
    { 
     if (IsPrivateField(key.ToLower())) 
      AppendToLog(key + ": " + Regex.Replace(HttpContext.Current.Request.Form[key], @"[a-zA-Z0-9]", "*")); 
     else 
      AppendToLog(key + ": " + HttpContext.Current.Request.Form[key]); 
    } 
} 
catch (Exception ex) 
{ 
    AppendToLog("Error: " + ex.Message.ToString()); 
} 

Comment peut-il y avoir une exception de référence null lors de l'accès Form [touche] où la clé est venue de la collection Form.Keys? Ou alternativement, comment Form.Keys pourrait inclure une valeur nulle, ou être nul lui-même? Si vous me dites que c'est impossible, je peux poster la version la plus complète pour voir si j'ai raté quelque chose qui ajoute de la crédibilité à un déréférencement nul.

Nous avons récemment eu des incidents où les champs de formulaire qui auraient dû être validés sont vides. Peut-être que nous avons une sorte de gremlin généralisé dans notre état de forme.

+0

Quelle est la pile trace de l'exception? Est-ce qu'il donne un numéro de ligne ou des informations sur la source? – Dai

Répondre

1

Je vais parier c'est le problème:

foreach (string key in HttpContext.Current.Request.Form.Keys) 
{ 
    if (IsPrivateField(key.ToLower())) // <-- this line here 

Il est possible que Request.Form.Keys contient une valeur clé null, afin de tenter de le déréférencer pour le convertir en minuscules ici causerait la NRE.

BTW, utilisez ToUpperInvariant() au lieu de ToUpper, ToLower ou ToLowerInvariant pour normaliser les chaînes en raison des règles de l'enveloppe dans un certain nombre de langues différentes, consultez cet article pourquoi: https://msdn.microsoft.com/en-us/library/bb386042.aspx

+0

"Il est possible que Request.Form.Keys contienne une valeur de clé nulle" ... Je suis surpris que cela puisse être vrai. Mais j'ai juste essayé d'ajouter un contrôle comme celui-ci à une page: '' et bien sûr, un null dans la collection de clés. Il est toujours un mystère comment une application de travail pourrait éventuellement retourner une telle page, mais au moins cela déplace l'erreur dans le domaine du possible. En ce qui concerne ToLowerInvariant, nous avons le contrôle des noms de clés et ils n'utiliseront pas de caractères internationaux. –