7

这个问题类似,但我不太关心哪些字符会/不会导致错误触发。我很好奇我可以调用什么方法来检查自己,如果当前字符串会触发上述错误消息。

为了提供一些背景知识,当用户忘记密码并需要重置时,我正在创建随机密码。&#不幸的是,随机密码生成器最近“不小心”在其中创建了一个。当用户尝试使用它登录时,这会导致页面中断。

正如围绕该主题的大量帖子中所提到的,ValidateRequest=false(或<httpRuntime requestValidationMode="2.0" />对于 .NET 4.0)可用于关闭 .NET 检查这些漏洞,但当我是一个首先创建字符串。<并且简单地告诉随机生成器在不完整的列表( ,等)上重新随机化&#似乎不是最干净的解决方案,所以我想使用相同的方法来检查 .NET 正在使用的方法。

微软在此处解释了哪些漏洞存在问题以及正在采取哪些措施来防范它们。

这家伙谈到IsDangerousString在用反射器挖掘后找到一个调用的函数,但我找不到这个函数来使用它。他还指的是 .NET 1.1,而我正在使用 .NET 3.5

4

2 回答 2

8

验证请求的 ASP.NET 类是System.Web.CrossSiteScriptingValidation,而您想要的方法是IsDangerousString。不幸的是,两者都标记为internal,因此您无法直接访问它们。你有几个选择:

选项 1:IsDangerousString通过反射调用。但是,Microsoft 可以随时更改方法,这会破坏您的应用程序。

选项2:反编译IsDangerousString并将其复制到您自己的应用程序中。请参阅下面的代码。

选项 3:调用Membership.GeneratePassword。这将返回一个保证通过请求验证的密码。

ASP.NET 类的摘录CrossSiteScriptingValidation(通过 .NET Reflector):

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

Javascript 函数基于@Michael Liu 的回答中的选项 2:

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