NginX:如何重写响应主体和标头?

NginX:如何重写响应主体和标头?

语境

我有一组由某个我无法控制的应用程序生成的静态 HTML 页面(约 10k 页)。这些页面由 NginX 从一个location块中提供。

页面可能包含敏感数据。我希望能够根据用户身份和页面中的“标志”阻止页面显示。

这些标志可以通过元素来实现<meta name=keyword content="flag1 flag2 flagn">。当存在这样的元素时,应该检查“凭证”。

我的想法是在将请求响应返回给用户之前对其进行扫描。为此,我需要

  • 一种将完整响应(标头 + 正文)传递给某些自定义代码的方法,以便可以解析 <head> 元素如果没有标志,则返回不加更改的响应
    如果有标志并且用户没有凭据,则会要求他进行身份验证
    如果有标志并且用户有权查看,则返回不加更改的响应
    如果有标志并且用户无权查看,则返回错误页面而不是响应


    最终,标志<meta>元素被删除以避免泄露过滤提示。

  • 通过某种方式将有关当前凭证(用户名、挑战值、任何有用信息,如识别时间戳等)的信息传递给该用户代码

用户代码将依赖于包含用户权限的“数据库”(该术语并不一定意味着使用真正的数据库引擎)并实现超时功能。

用户代码是否可以作为 FastCGI 脚本实现?如果可以,那么传递完整响应的指令是什么?

初步审判

目前,用户身份识别无法有条件:auth_basic在 中启用时location,用户必须识别自己,即使要访问公共页面也是如此。我可以通过设置访客/访客用户/密码来缓解此问题,但在请求凭据之前我无法设置警告页面。

因此,身份验证始终是必需的。之后,Authorization: Basic some_hash将随请求发送标头。身份验证时需要捕获此哈希,以便将来访问用户的特权属性。

我该怎么做?

我知道,在目前的状态下,此规范根本没有提供任何真正的安全性(容易受到重放攻击等)。我想在继续之前创建一个概念证明。我的目标有意义吗?

有没有更简单的方法来处理它?XSLT?(尽管必须将当前用户凭证输入到模式中)

答案1

我认为实现这一点的唯一方法是使用一些前端控制器来检查访问逻辑要求,然后从磁盘发送 HTML 文件。

您无需使用任何auth来自 nginx 的指令。身份验证过程将由前端控制器处理。

前端控制器可以通过多种方式实现,例如 Node.JS 应用程序、PHP、Ruby on Rails 和 Python。

相关内容