0

所以我有一些代码运行 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 // ....
}

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

例外

异常类型:系统。参数OUTOfRangeException

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

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

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

4

2 回答 2

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.")

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

于 2013-10-25T14:54:24.730 回答
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;
}
于 2013-10-25T14:51:59.493 回答