2012-07-06 55 views
5

this question类似,但我不太在乎字符是否会导致错误触发。我更加好奇我可以调用什么方法来检查自己,如果当前字符串会触发上述错误消息。如何检查字符串是否会触发“检测到有潜在危险的Request.Form值...”错误

为了给出一些背景知识,我在创建随机密码时,用户忘记了他们的需要重置。不幸的是,最近随机密码生成器“偶然地”在&#中创建了一个。当用户试图用它登录时,这导致页面中断。

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

微软对什么漏洞存在疑问的解释以及如何防范这些漏洞here

This guy有关在使用Reflector进行挖掘后找到名为IsDangerousString的函数的讨论,但我无法找到此函数来使用它。另外他指的是.NET 1.1,我正在使用.NET 3.5

+0

有趣的问题,但我不明白了一个道理,为什么你会包括这些不起眼的角色。我可能会使用RandomNumberGenerator类填充一个字节[],然后使用z-base32编码器将字节编码为一个字符串。 – Shelakel 2012-07-06 22:33:20

+2

你知道你想要的“漏洞”字符,为什么不能在发布之前对它们进行编码,然后html将它们解码回 – HatSoft 2012-07-06 22:35:16

+0

@Shelakel当然,还有很多其他方法可以生成随机密码。然而不幸的是,我们坚持需要用这个项目的密码完成4个字符规则(小写字母,大写字母,数字,特殊字符)中的所有4个。当然,我可以删除违规的“模糊”字符,但由于规范不是很清楚,我想使用系统要检查的相同功能。 – Mercurybullet 2012-07-06 23:39:39

回答

5

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

选项1:通过反射致电IsDangerousString。但是,微软可能随时更改该方法,这会破坏您的应用程序。

选项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'))); 
} 
+3

感谢您的信息。由于函数是内部的,我将无法直接访问它进行更新,是否有任何理由不使用以下正则表达式(使用ignoreCase)? '\ <[a-z!/?] |&#' – Mercurybullet 2012-07-09 17:54:36

+0

正则表达式相当于选项2,只是更加简洁。 :-)这可能是你现在可以做的最好的。但是,在下一个版本的ASP.NET中,您可以通过使用[HttpRequest.Unvalidated](http://msdn.microsoft.com/zh-cn/library/system.web)跳过某些字段的验证.httprequest.unvalidated(v = VS.110).aspx)属性。 – 2012-07-09 18:52:37

相关问题