如何检查字符串是否会触发"检测到潜在危险的Request.Form值..."错误

Mer*_*let 6 .net c# asp.net validation

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

为了给出一些背景知识,当用户忘记他们并需要重置时,我会创建随机密码.不幸的是,随机密码生成器"意外地" &#最近在其中创建了一个.当用户尝试使用它登录时,这会导致页面中断.

正如围绕这个主题的大量帖子所提到的,ValidateRequest=false(或者<httpRuntime requestValidationMode="2.0" />对于.NET 4.0)可以用来关闭这些漏洞利用的.NET检查,但是当我是这样的时候,我认为没有任何理由失去这个额外的安全层一个创建字符串的人.简单地告诉随机生成器重新随机化一个不完整的列表(<,&#等)似乎不是最干净的解决方案所以我想使用相同的方法来检查.NET正在使用.

微软对哪些漏洞有问题的解释以及在这里采取了哪些措施来防范它们.

这个人谈到IsDangerousString在使用Reflector挖掘之后找到一个函数,但是我无法找到这个函数来使用它.他也指的是.NET 1.1,我正在使用.NET 3.5

Mic*_*Liu 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')));
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢(你的)信息.由于该函数是内部的,我无法直接访问它以进行更新,是否有任何理由不使用以下正则表达式(使用ignoreCase)?`\ <[AZ /!?] |&#` (4认同)