【问题标题】:ASP.Net System.ArgumentOutOfRangeExceptionASP.Net System.ArgumentOutOfRangeException
【发布时间】:2013-11-04 18:03:23
【问题描述】:

所以我有一些代码运行 IP 检查以确保 ADMIN 帐户无法从我的网络外部访问。

string strIP = Request.ServerVariables["REMOTE_ADDR"];
if (
    (strIP.Substring(0, 9) != "XXX.XX.X.")
&&  (strIP.Substring(0, 10) != "XXX.XX.XX.")
&&  (strIP.Substring(0, 6) != "XX.XX.")
&&  (strIP.Substring(0, 6) != "XX.XX.")
)
{
..// Check user for being an ADMIN // ....
}

这段代码运行了好几个星期,但突然开始一直出错。错误信息是:

例外

异常类型:系统。 ArgumentOUTOfRangeException

异常消息:索引和长度必须引用字符串中的位置。参数名称:长度。

当我删除带有“Substring(0,10)”的行时,一切正常。此外,当我将“Substring(0,10)”行更改为“Substring(0,9)”并删除最后一个“.”时,一切正常。

谁能告诉我为什么或者可能指示什么做错了?对于我的一生,我无法弄清楚发生了什么。

【问题讨论】:

  • strIP 的长度是多少?如果小于 10,则预计 strIP.Substring(0, 10) 将通过异常。

标签: asp.net security substring indexoutofboundsexception request.servervariables


【解决方案1】:

问题是 strIP 没有 10 个字符,因为您的配置由于某种原因发生了更改。你可以这样做:

(strIP.Length >= 9 && strIP.Substring(0, 9) != "XXX.XX.X.")
||  (strIP.Length >= 10 && strIP.Substring(0, 10) != "XXX.XX.XX.")
||  (strIP.Length >= 6 && strIP.Substring(0, 6) != "XX.XX.")

请注意,第四行与第三行重复。

【讨论】:

  • 似乎是个有道理的船长。如果解决了问题,我会报告!
  • @AnalyticLunatic - 并不是说​​这个答案是错误的,但我觉得我的答案中的 switch 语句更具可读性和可维护性,但请使用适合您的任何东西。 :-)
  • @KarlAnderson,感谢您的意见 :) 对于这么小的东西,根据我的喜好,Switch 语句会有点过分。 Musical_coder 有最容易实现的想法,以防我们有一天将其他 IP 包含在要检查的标准中。
  • 抱歉,我之前没有想到这一点(现在是星期五!),但实际上,检查字符串是否代表 IP 地址的最佳方法是 IPAddress.TryParse()。看看你能不能做到这一点。
【解决方案2】:

在尝试进行任何子字符串比较之前,通过检查 strIP 的长度来避免出现越界错误,如下所示:

if (strIP.Length == 10)
{
    if ((strIP.Substring(0, 9) != "XXX.XX.X.")
        &&  (strIP.Substring(0, 10) != "XXX.XX.XX.")
        &&  (strIP.Substring(0, 6) != "XX.XX.")
        &&  (strIP.Substring(0, 6) != "XX.XX."))
    {
        ..// Check user for being an ADMIN // ....
    }
}
else
{
    // Do something here, error, message to user, deny access, etc.
}

更新:

如果您只想根据字符串的长度应用检查,则使用switch 语句,如下所示:

switch (strIP.Length)
{
    case 6:
        if(strIP.Substring(0, 6) != "XX.XX.")
        {
            // Check user for being an ADMIN
        }
        break;
    case 9:
        if(strIP.Substring(0, 9) != "XXX.XX.X.")
        {
            // Check user for being an ADMIN
        }
        break;
    case 10:
        if(strIP.Substring(0, 10) != "XXX.XX.XX.")
        {
            // Check user for being an ADMIN
        }
        break;
    default:
        // IP string is not in format expected, do something here
        // Most likely would want to err on the side of caution and deny access
        break;
}

【讨论】:

  • 这将阻止整个检查的发生,除非字符串正好是 10 个字符,但似乎并非总是如此。
  • @musical_coder - 那么你不能将你的条件和(&&)结合起来。我偏离了你提供的逻辑。
  • @KarlAnderson - 我正在检索 IP 地址,然后检查以确保返回的 IP 的特定子字符串不符合我设置的条件(防止 ADMIN 从外部位置登录)。我无法知道返回的 IP 字符串是 10 还是任何数字。我想如果返回的 IP 小于 10 会导致上面提到的行抛出错误,但是我应该如何解决这个问题呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 1970-01-01
相关资源
最近更新 更多