2015-09-11 9 views
0

Наш магазин имеет некоторый обобщенный код регистрации ошибок, который для веб-страниц включает в себя ведение журнала свойств запроса. Этот журнал ошибок стабилен в течение многих лет. В последнее время мы получили несколько ошибок, когда входной сигнал формы пользователя не мог быть обработан, а затем логгер также бомбил при попытке изучить поля формы. Он успешно зарегистрировал Request.Headers непосредственно перед попыткой Request.Form. Опуская некоторые форматирования вещи, которые, вероятно, не имеет отношения, это в основном сводится к:ASP.Net: итерация по коллекции Request.Form приводит к исключению нулевой ссылки

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()); 
} 

Как же может быть пустой ссылкой исключения при доступе к форме [ключ] где ключ пришел из коллекции Form.Keys? Или поочередно, как может Form.Keys включать нулевое значение или быть нулевым? Если вы скажете мне, что это невозможно, я могу опубликовать более полную версию, чтобы узнать, не пропустил ли я что-нибудь, что добавит вульверность к разыменованию.

У нас также были инциденты в последнее время, когда поля формы, которые должны были быть проверены, опустели. Может быть, у нас есть какой-то обобщенный гремлин в нашем состоянии формы.

+0

Что такое стек следа, за исключением? Предоставляет ли он какой-либо номер строки или исходную информацию? – Dai

ответ

1

Я собираюсь поставить это проблема:

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

Вполне возможно, что Request.Form.Keys содержит null ключевое значение, поэтому попытка разыменования его, чтобы преобразовать его в нижний регистр здесь вызовет ЯРД.

BTW, используйте ToUpperInvariant() вместо ToUpper, ToLower или ToLowerInvariant нормализовать строки из-за правил обсадных в ряде различных языков, в этой статье, почему: https://msdn.microsoft.com/en-us/library/bb386042.aspx

+0

«Возможно, что Request.Form.Keys содержит значение нулевого ключа» ... Я удивлен, что это может быть правдой. Но я просто попробовал добавить такой элемент на страницу: '' и, конечно же, нуль в коллекции ключей. По-прежнему остается загадкой, как рабочее приложение может вернуть такую ​​страницу, но, по крайней мере, это приводит к ошибке в область возможного. Что касается ToLowerInvariant, мы контролируем имена ключей, и они не будут использовать какие-либо международные символы. –

 Смежные вопросы

  • Нет связанных вопросов^_^