7

この質問に似ていますが、どのキャラクターがエラーを発生させるか、または引き起こさないかについてはあまり気にしません。現在の文字列が上記のエラーメッセージを表示するかどうかを確認するために、どのメソッドを呼び出すことができるかについてもっと知りたいです。

少し背景を説明するために、ユーザーがパスワードを忘れてリセットが必要になったときにランダムなパスワードを作成しています。残念ながら、ランダムパスワードジェネレータは「誤って」&#それを含むものを最近作成しました。これにより、ユーザーがログインしようとしたときにページが壊れました。

このトピックに関する多くの投稿で言及されているように、ValidateRequest=false(または<httpRuntime requestValidationMode="2.0" />.NET 4.0の場合)これらのエクスプロイトの.NETチェックをオフにするために使用できますが、私がそもそも文字列を作成するもの。<また、ランダムジェネレーターに不完全なリスト( 、など)で再ランダム化するように指示するだけでは&#、最もクリーンなソリューションとは思えないため、.NETが使用しているのと同じ方法でチェックしたいと思います。

問題となっているエクスプロイトと、それらを防ぐために何が行われているのかについてのMicrosoftの説明はここにあります。

この男はReflectorを掘り下げて呼び出された関数を見つけることについて話しますIsDangerousStringが、私はそれを使用するためにこの関数を見つけることができません。また、彼は.NET 1.1について言及しており、私は.NET3.5を使用しています。

4

2 に答える 2

8

要求を検証するASP.NETクラスはSystem.Web.CrossSiteScriptingValidationであり、必要なメソッドはですIsDangerousString。残念ながら、両方にマークが付いinternalているため、直接アクセスすることはできません。いくつかのオプションがあります。

オプション1:IsDangerousStringリフレクションを介して呼び出す。ただし、Microsoftはいつでもメソッドを変更する可能性があり、アプリケーションが破損する可能性があります。

オプション2:逆コンパイルIsDangerousStringして独自のアプリケーションにコピーします。以下のコードを参照してください。

オプション3:を呼び出しMembership.GeneratePasswordます。これにより、リクエストの検証に合格することが保証されているパスワードが返されます。

ASP.NETクラスからの抜粋CrossSiteScriptingValidation(.NETリフレクター経由):

private static char[] startingChars = new char[] { '<', '&' };

internal static bool IsDangerousString(string s, out int matchIndex)
{
    matchIndex = 0;
    int startIndex = 0;
    while (true)
    {
        int num2 = s.IndexOfAny(startingChars, startIndex);
        if (num2 < 0)
        {
            return false;
        }
        if (num2 == (s.Length - 1))
        {
            return false;
        }
        matchIndex = num2;
        char ch = s[num2];
        if (ch != '&')
        {
            if ((ch == '<') && ((IsAtoZ(s[num2 + 1]) || (s[num2 + 1] == '!')) || ((s[num2 + 1] == '/') || (s[num2 + 1] == '?'))))
            {
                return true;
            }
        }
        else if (s[num2 + 1] == '#')
        {
            return true;
        }
        startIndex = num2 + 1;
    }
}

private static bool IsAtoZ(char c)
{
    return (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')));
}
于 2012-07-07T00:52:01.563 に答える
1

@Michael Liuの回答のオプション2に基づくJavascript関数:

function isDangerousString(s) { return s.match(/<[a-zA-Z!/?]|&#/) !== null; }
于 2019-01-28T13:10:55.420 に答える