C# Asp.Net MVC ActionFilter验证xss的查询参数

C# Asp.Net MVC ActionFilter验证xss的查询参数,c#,asp.net-mvc,xss,action-filter,C#,Asp.net Mvc,Xss,Action Filter,我曾经遇到过这样的情况:我想对所有MVC流执行查询参数(而不是表单参数)xss处理*(因此ActionFilter是理想的);但即使是在微软文档上,我也找不到一个很好的实现(我认为这是一个非常典型的场景) 因此,创建这个wiki格式的Q&A(将我的代码作为答案发布)来发布解决我的场景的实现 *当我说xss处理时,我希望代码重定向到登录页面(而不是让ASP.NET MVC将其重定向到错误页面,我们可以通过web.config customErrors mode=“On”)控制错误页面 using

我曾经遇到过这样的情况:我想对所有MVC流执行查询参数(而不是表单参数)xss处理*(因此ActionFilter是理想的);但即使是在微软文档上,我也找不到一个很好的实现(我认为这是一个非常典型的场景)

因此,创建这个wiki格式的Q&A(将我的代码作为答案发布)来发布解决我的场景的实现


*当我说xss处理时,我希望代码重定向到登录页面(而不是让ASP.NET MVC将其重定向到错误页面,我们可以通过web.config customErrors mode=“On”)控制错误页面

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}
                });
        }
    }
}