c# - 如何通过仅允许在 asp.net 核心 web api 应用程序的模型中分配的属性来验证请求正文
问题描述
我有一个 ASP.NET CORE Web API 应用程序并将模型放置为:
public class SamplePayload
{
public string Attribute1 { get; set; }
public string Attribute2 { get; set; }
}
然后我的控制器看起来像:
[ApiController]
public class SampleController : ControllerBase
{
[HttpPost]
public async Task<string> Add(SamplePayload samplePayload)
{
if (!ModelState.IsValid)
{
//Throw Error
}
return "Hello";
}
}
但是,如果请求正文的有效负载如下(带有附加属性),则操作仍然接受有效负载:
{
"Attribute1":"Value1",
"Attribute2":"Value2",
"EvilAttribute":"EvilValue"
}
如您所见,EvilAttribute
根据模型,它不是一个有效的属性,但控制器仍然接受它,并且尽管我已经在控制器顶部分配了它,但它Model.IsValid
也会返回。true
[ApiController]
我的问题是如何进行验证以检查仅在模型中定义的属性需要在请求正文中传递?ASP.NET 核心不提供更简单的处理吗?
笔记:
此要求的原因是,在独立评估员进行的漏洞评估下,强调了我的端点
接受请求正文中的附加参数
评估引用如下:
- 测试类别:批量分配;
- 进行的测试:向请求添加其他参数
- 结果:请求正文接受的附加参数
建议:
- 如果可能,请避免使用自动将客户端输入绑定到代码变量或内部对象的函数。
- 仅将应由客户端更新的属性列入白名单。
- 如果适用,为输入数据有效负载显式定义和实施模式。
解决方案
我认为拒绝包含更多数据的请求并没有太多好处。
如果这是某种要求,您可以尝试以下方法:
ModelBinder
我认为您可能需要按照此处描述的示例实现自己的:
https://docs.microsoft.com/en-US/aspnet/core/mvc/advanced/custom-model-binding?view=aspnetcore-5.0
默认模型绑定的工作方式 - 从模型的角度出发,在请求中搜索匹配的字段并将值分配给相关的模型属性。
一旦可以构建所需的模型并通过它的所有内部约束 - 它就是有效的。
推荐阅读
- rubygems - 在 OSX 10.15.4 Catalina 上安装 libv8 gem 失败
- instructions - 现代 CPU 可以执行哪些指令?
- json - 使用 GenSON 从 JSON 文件生成 JSON 模式
- python - 最大重试次数超过 URL(由 NewConnection 错误引起)
- vue.js - 令牌应答后 Vuex 初始状态丢失
- kubernetes - 有没有办法隔离 Istio 服务网格中的部署?
- excel - 跨多列和变量行求和
- c# - 在 Azure 上发布 MVC 5 网站后出现“加载资源失败:net::ERR_CONTENT_DECODING_FAILED”错误
- list - Dart:检查列表中的项目
- amazon-web-services - 亚马逊免费套餐,要求选择加入 RDS 服务