2011-11-13 73 views
-1

我需要一个通用的方法来防止ASP.NET中的XSS攻击。我想出的办法是ValidateRequest方法评估HttpRequest任何潜在的问题,如果发现问题,将用户重定向到同一个页面,但在没有威胁到应用程序了。 (下面的源代码)什么是防止ASP.NET中的XSS攻击的通用方法?

虽然我知道这种方法可以防止大多数XSS攻击,我不能肯定,我充分地预防所有可能的攻击,同时也最大限度地减少误报。所以, 什么是最有效的方式来充分防止所有可能的攻击,同时最大限度地减少误报?我是否应该对下面的帮手类进行更改,还是有其他方法或第三方库提供更令人信服的东西?

public static class XssSecurity 
{ 

public const string PotentialXssAttackExpression = "(http(s)*(%3a|:))|(ftp(s)*(%3a|:))|(javascript)|(((\\%3C) <)[^\n]+((\\%3E) >))"; 

private static readonly Regex PotentialXssAttackRegex = new Regex(PotentialXssAttackExpression, RegexOptions.IgnoreCase); 

public static bool IsPotentialXssAttack(this HttpRequest request) 
{ 
    if(request != null) 
    { 
     string query = request.QueryString.ToString(); 
     if(!string.IsNullOrEmpty(query) && PotentialXssAttackRegex.IsMatch(query)) 
      return true; 
     if(request.HttpMethod.Equals("post", StringComparison.InvariantCultureIgnoreCase)) 
     { 
      string form = request.Form.ToString(); 
      if (!string.IsNullOrEmpty(form) && PotentialXssAttackRegex.IsMatch(form)) 
       return true; 
     } 
     if(request.Cookies.Count > 0) 
     { 
      foreach(HttpCookie cookie in request.Cookies) 
      { 
       if(PotentialXssAttackRegex.IsMatch(cookie.Value)) 
       { 
        return true; 
       } 
      } 
     } 
    }    
    return false; 
} 

    public static void ValidateRequest(this HttpContext context, string redirectToPath = null) 
    { 
     if(context == null || !context.Request.IsPotentialXssAttack()) return; 

     // expire all cookies 
     foreach(HttpCookie cookie in context.Request.Cookies) 
     { 
      cookie.Expires = DateTime.Now.Subtract(TimeSpan.FromDays(1)); 
      context.Response.Cookies.Set(cookie); 
     } 

     // redirect to safe path 
     bool redirected = false; 
     if(redirectToPath != null) 
     { 
      try 
      { 
       context.Response.Redirect(redirectToPath,true); 
       redirected = true; 
      } 
      catch 
      { 
       redirected = false; 
      } 
     } 
     if (redirected) 
      return; 

     string safeUrl = context.Request.Url.AbsolutePath.Replace(context.Request.Url.Query, string.Empty); 
     context.Response.Redirect(safeUrl,true); 
    } 
} 
+0

你为什么要寻找警报?这与利用xss无关,攻击者永远不会使用这个函数来帮助开发。 – rook

+1

试图编写针对您从未被利用过的攻击的安全系统是一个严重的错误。安全系统应该非常简单。 XSS应该通过简单的编码程序来防止。 – rook

+1

@rook,我写这个网站的客户正在使用[HP WebInspect](https://www.fortify.com/products/web_inspect.html)对网站进行测试,该网站使用警报作为其中一项测试“攻击” – smartcaveman

回答

1

什么是最有效的方法来充分防止所有可能的 攻击,同时最大限度地减少误报?

白名单+模式。只准许你想要允许的数据,然后对它进行编码,以便适合于预期的终点(例如,如果你在SQL中使用输入,你可能想用逃避潜在危险的SQL代码构建库 - 不,你应该把原始输入到SQL反正没有一个存储过程或当量...)

尝试黑名单,除非它是一个额外支票适当谨慎。您错过的东西,你会暴露自己的攻击。

2

它甚至不是一个第三方库,微软作出了AnitXss library。而且,实际上你可以将其设置为asp.net的默认编码4+时<%%>在您的标记作为概述herehere

使用它的一些基本指令可以发现here

+0

我应该提到它需要与ASP.NET 2.0兼容。你看到我发布的代码存在问题吗? – smartcaveman

+1

我相信这个版本会起作用。 http://www.microsoft.com/download/en/details.aspx?id=17389 的技术,你正试图doen't工作做好。正则表达式的几乎总是会漏掉一些东西。一些试图做到这一点的维护良好的库在其中发现了缺陷。有理由认为你或我扔在一起的事情会更糟。 – imichaelmiers

+0

@imichaelmiers这是1.5版的链接,它比链接到http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=22285的链接更新 – LamonteCristo