【问题标题】:Why must we read the request body before doing a subrequest using OpenResty / nginx lua?为什么我们必须在使用 OpenResty / nginx lua 进行子请求之前阅读请求正文?
【发布时间】:2015-11-06 20:19:13
【问题描述】:

我们将部分 nginx 访问控制委托给一个单独的服务,我们使用 access_by_lua_file 和 lua-resty-hawk 以及子请求来对请求进行身份验证。

docs 说:

在启动子请求之前,您应该始终阅读请求正文(通过调用 ngx.req.read_body 或配置 lua_need_request_body)。

最初我们错过了这个细节,事情似乎在起作用。我试图找到有关此要求的更多背景信息,但一无所获。

最好在读取正文之前授权请求,因为如果客户端只是尝试上传各种垃圾并填满我们的磁盘,我们可能能够提前终止连接并防止一种 DoS 攻击。

为什么会有这个限制?

【问题讨论】:

  • auth_request 用于预认证,无需全文阅读。还可以缓存身份验证响应,以防止来自经过身份验证的用户的冗余请求

标签: nginx lua openresty


【解决方案1】:

由于没有人回答这个问题,我想通过引用官方文档来澄清原因。

always_forward_body 设置为 true 时,如果未指定 body 选项,则当前(父)请求的请求正文将始终转发到正在创建的子请求。 ngx.req.read_body() 或 lua_need_request_body on 读取的请求体将直接转发给子请求,在创建子请求时不会复制整个请求体数据(无论请求体数据缓冲在内存缓冲区还是临时文件中) .默认情况下,该选项为false,不指定body选项时,仅当子请求采用PUT或POST请求方式时,才会转发当前(父)请求的请求体。

简而言之,如果未指定选项正文,则可能使用当前请求的正文,因此您需要先阅读请求正文。

如您所见,这不是强制性的,因此您的情况似乎有效。

【讨论】:

    猜你喜欢
    • 2018-08-25
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多