c# - 如何使用 Action 过滤器更改输入参数

标签 c# linq asp.net-web-api action-filter

背景:

我正在尝试解决一个潜在的安全问题,以删除作为字符串参数注入(inject)到我的 WebAPI 方法中的单引号(这需要在整个应用程序中完成)。

我试图通过创建一个执行必要操作的 Action Filter 来实现这一点

public class ValidateActionParametersAttribute : ActionFilterAttribute, IActionFilter
    {
        public override void OnActionExecuting(HttpActionContext actionExecutedContext)
        {          
            var parameters = actionExecutedContext.ActionArguments;
            var parameterList = parameters.Values.ToList();
            parameterList.Where(x => x.GetType() == typeof(string)).ToList().ForEach(y => y = y.ToString().Replace("\'", ""));            
            base.OnActionExecuting(actionExecutedContext);
        }
    }

并在我的 WebApiConfig 中全局注册

config.Filters.Add(new ValidateActionParametersAttribute());

但是当我在代码中放置一个断点后检查时,在 ActionFilter 中完成的参数更改似乎没有反射(reflect)出来。有人可以指导我做错了什么吗?

最佳答案

您没有更新 arguments 字典中的值,而只是替换了传递给 ForEach 的 lambda 函数的 y 参数。

由于 ActionArguments 是一本字典,您可以执行以下操作:

var stringArgs = context.ActionArguments.Where(pair => pair.Value is string).ToList();

foreach (var keyValue in stringArgs)
{
    var safeValue = ((string)keyValue.Value).Replace("\'", "");
    context.ActionArguments[keyValue.Key] = safeValue;
}

这将获取所有字符串参数并将它们替换为安全版本。

关于c# - 如何使用 Action 过滤器更改输入参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52856320/

相关文章:

http - 如何阻止 chrome 缓存来自 WebApi 的 REST 响应?

c# - Razor 代码块在 ASP.NET Core 3.1 中不起作用

c# - 如何使用 oledb 将记录插入 Access 表?

azure - 使用自托管 Azure Service Fabric 调用 Web API 时出错

c# - 获取 claim 电子邮件地址

c# - 使用抽象类型的反射从表中获取实体

c# - 从后面的代码中检索 javascript var 值

c# - C#中的队列实现

c# - LINQ 按特定术语过滤列表中的列表

c# - 为什么要引用 LambdaExpression?