ASP.Net System.ArgumentOutOfRangeException

时间:2013-10-25 14:43:34

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

所以我有一些运行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)”的行时,一切正常。此外,当我将“子串(0,10)”行更改为“子串(0,9)”并删除最后一个“。”时,一切正常。

任何人都可以告诉我为什么或者可能会指出错误的做法?对于我的生活,我无法弄清楚发生了什么。

2 个答案:

答案 0 :(得分: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.")

请注意,第四行是第三行的副本。

答案 1 :(得分:0)

在尝试进行任何子字符串比较之前,通过检查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;
}