Мне нужен универсальный метод для предотвращения атак 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);
}
}