在ASP.NET中防止XSS攻击的通用方法是什么?

在ASP.NET中防止XSS攻击的通用方法是什么?,asp.net,security,httprequest,xss,Asp.net,Security,Httprequest,Xss,我需要一种在ASP.NET中防止XSS攻击的通用方法。我提出的方法是一个ValidateRequest方法,该方法评估HttpRequest是否存在任何潜在问题,如果发现问题,则将用户重定向到同一页面,但不影响应用程序。(下面是源代码) 虽然我知道这种方法可以防止大多数XSS攻击,但我不确定我是否能够充分防止所有可能的攻击,同时将误报降至最低。所以 充分防止所有可能的攻击,同时最大限度地减少误报的最有效方法是什么?我是否应该对下面的helper类进行更改,或者是否有其他方法或第三方库提供更具说服

我需要一种在ASP.NET中防止XSS攻击的通用方法。我提出的方法是一个
ValidateRequest
方法,该方法评估
HttpRequest
是否存在任何潜在问题,如果发现问题,则将用户重定向到同一页面,但不影响应用程序。(下面是源代码)

虽然我知道这种方法可以防止大多数XSS攻击,但我不确定我是否能够充分防止所有可能的攻击,同时将误报降至最低。所以 充分防止所有可能的攻击,同时最大限度地减少误报的最有效方法是什么?我是否应该对下面的helper类进行更改,或者是否有其他方法或第三方库提供更具说服力的内容?

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);
   }
}
公共静态类XssSecurity
{
public const string potentialxsatckexpression=“(http(s)*(%3a |:))|(ftp(s)*(%3a |:)|(javascript)|((\\\%3C))”;
私有静态只读正则表达式PotentialXssAttackRegex=新正则表达式(PotentialXssAttackExpression,RegexOptions.IgnoreCase);
公共静态布尔值IsPotentialXSattack(此HttpRequest请求)
{
if(请求!=null)
{
字符串查询=request.QueryString.ToString();
if(!string.IsNullOrEmpty(查询)和&potentialxstatckregex.IsMatch(查询))
返回true;
if(request.HttpMethod.Equals(“post”,StringComparison.InvariantCultureIgnoreCase))
{
string form=request.form.ToString();
if(!string.IsNullOrEmpty(form)和&potentialxstatckregex.IsMatch(form))
返回true;
}
如果(request.Cookies.Count>0)
{
foreach(request.Cookies中的HttpCookie cookie)
{
if(PotentialXssAttackRegex.IsMatch(cookie.Value))
{
返回true;
}
}
}
}               
返回false;
}
公共静态void ValidateRequest(此HttpContext上下文,字符串redirectToPath=null)
{
if(context==null | |!context.Request.ispotentialxsattack())返回;
//使所有cookie过期
foreach(context.Request.Cookies中的HttpCookie cookie)
{
cookie.Expires=DateTime.Now.Subtract(TimeSpan.FromDays(1));
context.Response.Cookies.Set(cookie);
}
//重定向到安全路径
bool重定向=错误;
if(重定向路径!=null)
{
尝试
{
redirectToPath,true;
重定向=真;
}
抓住
{
重定向=错误;
}
}
如果(重定向)
返回;
string safeUrl=context.Request.Url.AbsolutePath.Replace(context.Request.Url.Query,string.Empty);
context.Response.Redirect(safeUrl,true);
}
}

它甚至不是第三方库,微软制造了一个AnitXss。此外,当在标记中使用asp.net 4+时,实际上可以将其设置为asp.net 4+的默认编码

可以找到一些使用它的基本说明

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

白名单+模式。只允许您想要允许的数据,然后对其进行编码,以适合于预期端点的传输(例如,如果您正在使用SQL中的输入,您可能希望使用为转义潜在危险的SQL代码而构建的库来转义它-而不是说您无论如何都不应该在没有存储过程或等效程序的情况下将原始输入放入SQL中。)


不要尝试将其列入黑名单,除非这是一项额外检查,以确保谨慎。你会错过一些东西,并使自己暴露在攻击之下。

你为什么要寻找警报?这与利用xss无关,攻击者永远不会使用此功能来帮助利用xss。试图编写安全系统来抵御您从未利用过的攻击是一个严重错误。安全系统应该非常简单。XSS应该通过一个简单的编码例程来防止。@rook,我为其编写此代码的站点的客户端正在测试该站点,它使用警报作为其测试“攻击”之一。@rook,如果HP WebInspect I使用警报来测试您的代码,我希望看到一个示例或对OneInspect的引用,而这是不阻止它的一个重要原因。您的系统很可能极易受到xss攻击,因为您在愚弄您的工具,而没有解决问题的根源。我应该提到,它需要与ASP.NET 2.0兼容。你看到我发布的代码有问题吗?我相信这个版本可以工作。你尝试的技术效果不好。正则表达式几乎总是会遗漏一些东西。一些维护良好的库试图做到这一点,但在它们中发现了缺陷。有充分的理由认为,你或我拼凑起来的东西会糟糕得多。@imichaelmiers这里是1.5版的链接,它比你链接到的要新