c# - 如何使用动作过滤器更改输入参数
问题描述
的背景:
我正在尝试修复一个潜在的安全问题,以删除作为字符串参数注入到我的 WebAPI 方法中的单引号(这需要在整个应用程序中完成)。
我试图通过创建一个执行必要操作的操作过滤器来实现这一点
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 中所做的参数更改似乎没有反映出来。有人可以指导我做错了什么吗?
解决方案
您没有更新参数字典中的值,而只是替换了传递给 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;
}
这将获取所有字符串参数并将其替换为安全版本。
推荐阅读
- java - 为什么使用 synchronized 关键字而不是不使用它时 Java 代码块更快?
- android - 如何在 Kotlin 中使用 Retrofit 解析 JSON 中的无限对象列表
- c++ - 有没有办法让 OpenCL C++ 绑定为所有错误抛出异常?
- kubernetes - 如何让预安装钩子等待前一个钩子完成?
- android - 如何在同一个视图上实现触摸监听器和捏缩放?
- webrtc - 哪个参数用于唯一标识 WebRTC 中的“调用”?
- c - 访问 .rodata 部分中的特定数据时应用程序崩溃
- python - 如何使用 Xpath 从脚本中提取电话号码
- docker - 无法更改容器中的 Jupyter Lab 主题
- google-app-engine - 上游从上游读取响应标头时过早关闭连接,客户端: