ASP.Net:迭代 Request.Form 集合产生空引用异常
ASP.Net: iterating over Request.Form collection yields null reference exception
我们的商店有一些通用的错误记录代码,对于网页,包括请求属性的记录。这个错误记录器多年来一直很稳定。最近我们遇到了一些无法处理用户表单输入的错误,然后记录器在尝试检查表单字段时也崩溃了。它在尝试 Request.Form 之前成功记录 Request.Headers。省略一些可能不相关的格式化内容,基本上可以归结为:
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[key]时怎么会出现空引用异常?或者,Form.Keys 怎么可能包含一个空值,或者它本身就是空值?如果你告诉我这是不可能的,我可以 post 更完整的版本,看看我是否遗漏了任何增加 null 取消引用漏洞的内容。
我们最近还发生过本应验证的表单字段变为空的事件。也许我们的表单状态中有某种通用的 gremlin。
我敢打赌这就是问题所在:
foreach (string key in HttpContext.Current.Request.Form.Keys)
{
if (IsPrivateField( key.ToLower() )) // <-- this line here
Request.Form.Keys
可能包含一个 null
键值,因此在此处尝试取消引用它以将其转换为小写会导致 NRE。
顺便说一句,由于许多不同语言的大小写规则,请使用 ToUpperInvariant()
而不是 ToUpper
、ToLower
或 ToLowerInvariant
来规范化字符串,请参阅本文为什么:https://msdn.microsoft.com/en-us/library/bb386042.aspx
我们的商店有一些通用的错误记录代码,对于网页,包括请求属性的记录。这个错误记录器多年来一直很稳定。最近我们遇到了一些无法处理用户表单输入的错误,然后记录器在尝试检查表单字段时也崩溃了。它在尝试 Request.Form 之前成功记录 Request.Headers。省略一些可能不相关的格式化内容,基本上可以归结为:
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[key]时怎么会出现空引用异常?或者,Form.Keys 怎么可能包含一个空值,或者它本身就是空值?如果你告诉我这是不可能的,我可以 post 更完整的版本,看看我是否遗漏了任何增加 null 取消引用漏洞的内容。
我们最近还发生过本应验证的表单字段变为空的事件。也许我们的表单状态中有某种通用的 gremlin。
我敢打赌这就是问题所在:
foreach (string key in HttpContext.Current.Request.Form.Keys)
{
if (IsPrivateField( key.ToLower() )) // <-- this line here
Request.Form.Keys
可能包含一个 null
键值,因此在此处尝试取消引用它以将其转换为小写会导致 NRE。
顺便说一句,由于许多不同语言的大小写规则,请使用 ToUpperInvariant()
而不是 ToUpper
、ToLower
或 ToLowerInvariant
来规范化字符串,请参阅本文为什么:https://msdn.microsoft.com/en-us/library/bb386042.aspx