【问题标题】:how to disable 400 Bad request's message body in Asp.Net Core web API in production environment?如何在生产环境中禁用 Asp.Net Core Web API 中的 400 Bad request 消息正文?
【发布时间】:2020-12-05 15:12:54
【问题描述】:

我有一个 Web API 项目,在 asp.net 核心中有很多控制器、验证器、服务和存储库

出于安全考虑,我将在生产模式下禁用所有 400 个错误请求消息正文(验证模型中的属性或...)

如何在 asp.net core 2.2 中做到这一点?

【问题讨论】:

  • 这可以很容易地完成,但是如果不是 HTTP400 无效输入,您将返回什么?这是非常常见的事情,我认为更改它绝对不会带来安全上的好处
  • 相信我,这完全无法想象对安全性产生积极影响。它只会惹恼任何试图在您的实时服务器上重现错误的人。并让你看起来像一个不知道自己在做什么的人,对未来接管该项目的人来说。
  • @CamiloTerevinto 谢谢你的回复。实际上我是第一个反对这个想法的人,但他们给了我这个任务,我必须做。我多次警告他们,让 Web API 更安全一点都不是好主意。只是对消息正文的一个错误请求:出了点问题! .你能帮忙吗?
  • @Franz Gleichmann 感谢您的回复。我相信你,你是对的。几年前我和你提到的同样的问题也处于同一阶段。处于混乱状态...

标签: c# asp.net-core error-handling asp.net-core-webapi bad-request


【解决方案1】:

正如其他人在 cmets 中指出的那样,这可能不是一个好主意,如果您的错误消息设计得当,也不太可能提高安全性。

但如果您仍然希望这样做,一种方法是实现 MVC 操作过滤器:

public class BadRequestEmptyBodyFilter : IActionFilter, IOrderedFilter
{
    public void OnActionExecuting(ActionExecutingContext context)
    {
        if (context.Result == null && !context.ModelState.IsValid)
        {
            context.Result = new ObjectResult(null)
            {
                StatusCode = StatusCodes.Status400BadRequest
            };
        }
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        if (context.Exception != null || context.Result == null)
        {
            return;
        }

        var statusCodeResult = context.Result as IStatusCodeActionResult;
        if (statusCodeResult?.StatusCode == StatusCodes.Status400BadRequest)
        {
            context.Result = new ObjectResult(null)
            {
                StatusCode = StatusCodes.Status400BadRequest
            };
        }
    }

    // Set this to a large negative number so it runs early in the pipeline
    public int Order => -1000000;
}

然后在Startup 中注册。此外,您应该将 ApiBehaviorOptions.SuppressModelStateInvalidFilter 设置为 true 以禁用默认的错误请求过滤器:

services.AddMvc(options =>
    {
        options.Filters.Add<BadRequestEmptyBodyFilter>();
    })
    .SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
    .ConfigureApiBehaviorOptions(options =>
    {
        options.SuppressModelStateInvalidFilter = true;
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2014-11-18
    • 2011-08-01
    • 2021-12-18
    相关资源
    最近更新 更多