Что такое общий подход к предотвращению атак XSS в ASP.NET? - PullRequest
0 голосов
/ 13 ноября 2011

Мне нужен универсальный метод для предотвращения атак XSS в ASP.NET.Подход, который я придумал, - это метод ValidateRequest, который оценивает HttpRequest для любых потенциальных проблем, и, если проблемы обнаружены, перенаправьте пользователя на ту же страницу, но на расстоянии, которое не угрожает приложению.(Исходный код ниже)

Хотя я знаю, что этот метод предотвратит большинство атак 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);
   }
}

Ответы [ 2 ]

2 голосов
/ 14 ноября 2011

Это даже не сторонняя библиотека, Microsoft делает AnitXss библиотеку .Более того, вы можете установить его в качестве кодировки по умолчанию для asp.net 4+, когда в вашей разметке используется <%%>, как указано здесь и здесь

Некоторые основные инструкции по его использованию можно найти здесь

1 голос
/ 14 ноября 2011

Каков наиболее эффективный способ адекватного предотвращения всех возможных атак при минимизации ложных срабатываний?

Белый список + схемы.Разрешите только те данные, которые вы хотите разрешить, затем закодируйте их для передачи, соответствующей предполагаемой конечной точке (например, если вы используете ввод в SQL, вы можете захотеть избежать его, используя библиотеки, созданные для избежания потенциально опасного кода SQL- не то, чтобы вы все равно помещали необработанный ввод в SQL без сохраненного процесса или эквивалента ...)

Не пытайтесь НЕ пытаться занести в черный список, если это не extra проверьте на должную осторожность.Вы будете пропускать что-то, и вы будете подвергать себя атаке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...