Asp.Net MVC ActionFilter 验证 xss 的查询参数
Asp.Net MVC ActionFilter to validate query params for xss
我遇到过这样的情况,我想为我的所有 MVC 流执行查询参数(而不是表单参数)xss 处理*(因此 ActionFilter 是理想的);但即使在 Microsoft 文档上我也找不到很好的实现(我认为这是一个非常典型的场景)
因此创建这种问答维基格式(将post我的代码作为答案)来发布解决我的场景的实现
*当我说 xss 处理时,我希望代码重定向到登录页面(而不是让 ASP.NET MVC 将它重定向到我们可以通过 web.config customErrors 控制的错误页面模式="开启")
这是适用于我在问题中提到的用例的实现
using System;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security.AntiXss;
namespace SomeAttribute
{
public class QueryParamsXssValidate : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
try
{
var qs = filterContext.HttpContext.Request.QueryString;
foreach (var keyRecvd in qs.AllKeys)
{
var keyEncd = AntiXssEncoder.HtmlEncode(keyRecvd);
if (keyEncd != keyRecvd)
{
throw new ArgumentException($"Potentially dangerous keyRecvd: {keyRecvd}");
}
var valRecvd = qs[keyRecvd];
var valEncd = AntiXssEncoder.HtmlEncode(valRecvd);
if (valEncd != valRecvd)
{
throw new ArgumentException($"Potentially dangerous valRecvd: {valRecvd}");
}
}
}
catch (ArgumentException e)
{
//logging
loginRedirect(filterContext); //alternatively, create ExceptionHandlerAttribute and rethrow here
}
}
private void loginRedirect(ActionExecutingContext filterContext)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{"controller", "main"},
{"action", "login"},
{"error", filterContext.HttpContext.Request.QueryString["error"] ?? string.Empty}
});
}
}
}
我遇到过这样的情况,我想为我的所有 MVC 流执行查询参数(而不是表单参数)xss 处理*(因此 ActionFilter 是理想的);但即使在 Microsoft 文档上我也找不到很好的实现(我认为这是一个非常典型的场景)
因此创建这种问答维基格式(将post我的代码作为答案)来发布解决我的场景的实现
*当我说 xss 处理时,我希望代码重定向到登录页面(而不是让 ASP.NET MVC 将它重定向到我们可以通过 web.config customErrors 控制的错误页面模式="开启")
这是适用于我在问题中提到的用例的实现
using System;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Security.AntiXss;
namespace SomeAttribute
{
public class QueryParamsXssValidate : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
try
{
var qs = filterContext.HttpContext.Request.QueryString;
foreach (var keyRecvd in qs.AllKeys)
{
var keyEncd = AntiXssEncoder.HtmlEncode(keyRecvd);
if (keyEncd != keyRecvd)
{
throw new ArgumentException($"Potentially dangerous keyRecvd: {keyRecvd}");
}
var valRecvd = qs[keyRecvd];
var valEncd = AntiXssEncoder.HtmlEncode(valRecvd);
if (valEncd != valRecvd)
{
throw new ArgumentException($"Potentially dangerous valRecvd: {valRecvd}");
}
}
}
catch (ArgumentException e)
{
//logging
loginRedirect(filterContext); //alternatively, create ExceptionHandlerAttribute and rethrow here
}
}
private void loginRedirect(ActionExecutingContext filterContext)
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{"controller", "main"},
{"action", "login"},
{"error", filterContext.HttpContext.Request.QueryString["error"] ?? string.Empty}
});
}
}
}