首页 > 解决方案 > 如何通过仅允许在 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 核心不提供更简单的处理吗?

笔记:

此要求的原因是,在独立评估员进行的漏洞评估下,强调了我的端点

接受请求正文中的附加参数

评估引用如下:

  • 测试类别:批量分配;
  • 进行的测试:向请求添加其他参数
  • 结果:请求正文接受的附加参数

建议:

  • 如果可能,请避免使用自动将客户端输入绑定到代码变量或内部对象的函数。
  • 仅将应由客户端更新的属性列入白名单。
  • 如果适用,为输入数据有效负载显式定义和实施模式。

标签: c#asp.net-coreasp.net-core-mvcasp.net-core-webapi

解决方案


我认为拒绝包含更多数据的请求并没有太多好处。

如果这是某种要求,您可以尝试以下方法:

ModelBinder我认为您可能需要按照此处描述的示例实现自己的:

https://docs.microsoft.com/en-US/aspnet/core/mvc/advanced/custom-model-binding?view=aspnetcore-5.0

默认模型绑定的工作方式 - 从模型的角度出发,在请求中搜索匹配的字段并将值分配给相关的模型属性。

一旦可以构建所需的模型并通过它的所有内部约束 - 它就是有效的。


推荐阅读