【问题标题】:Asp.Net MVC ActionFilter to validate query params for xssAsp.Net MVC ActionFilter 验证 xss 的查询参数
【发布时间】:2021-05-20 00:36:00
【问题描述】:

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

因此,创建这种 wiki 格式的问答(将发布我的代码作为答案)以发布解决我的场景的实现

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

【问题讨论】:

    标签: c# asp.net-mvc xss action-filter


    【解决方案1】:

    这是适用于我在问题中提到的用例的实现

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      相关资源
      最近更新 更多