我需要一个通用的方法来防止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);
}
}
你为什么要寻找警报?这与利用xss无关,攻击者永远不会使用这个函数来帮助开发。 – rook
试图编写针对您从未被利用过的攻击的安全系统是一个严重的错误。安全系统应该非常简单。 XSS应该通过简单的编码程序来防止。 – rook
@rook,我写这个网站的客户正在使用[HP WebInspect](https://www.fortify.com/products/web_inspect.html)对网站进行测试,该网站使用警报作为其中一项测试“攻击” – smartcaveman