0

そのため、ADMIN アカウントがネットワークの外部からアクセスできないようにするために、IP チェックを実行するコードがいくつかあります。

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)」に変更し、最後の「.」を削除すると、すべてが機能します。

誰かが私に理由を教えてもらえますか、または何が間違っているかについて教えてもらえますか? 私の人生では、何が起こっているのか理解できません。

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

4 行目が 3 行目の複製であることに注意してください。

于 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 に答える