所以我有一些运行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)”并删除最后一个“。”时,一切正常。
任何人都可以告诉我为什么或者可能会指出错误的做法?对于我的生活,我无法弄清楚发生了什么。
答案 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;
}