问题简介
最近我正在研究一些请求签名算法,结果发现关于在随后签名的部分中包含查询字符串的观点是“多样化的”。
长话短说,反对在签名字符串中包含查询字符串的人的论点是可以更改查询字符串(例如,可以更改值,可以删除/添加参数,可以更改顺序)。
此外,我从未在代理或负载平衡器中经历过这种行为,即使我经历过隐藏Authorization
标头(例如通过 Apache/WSGI)、更改请求方法(通过负载平衡器,可能是亚马逊的服务器做这样的事情)。我知道可以使用一些自定义脚本/规则在反向代理或负载平衡器上启用这种行为,但它可以通过请求的任何部分来完成。
基于应该包含查询字符串的假设已经完成了很多工作,而且不签署请求的最重要部分之一看起来很愚蠢。因此,我需要知道以原始形式包含查询字符串(因为它在 URL 中传递)将来是否会成为问题。
真题
所以我的问题是:
任何代理或负载均衡器更改查询字符串是否很常见?这对我来说似乎很愚蠢。您知道默认情况下执行此操作的任何代理或负载平衡器(软件或其安装)吗?
我确信在这种情况下我们可以在代理/负载平衡器级别处理签名验证,但如果这在我们无法控制的中介中很常见,这可能是一个可行的论点。
请让我知道你对它的了解。如果您有任何问题,请告诉我。
作为澄清,我所说的查询字符串?arg1=val1&arg2=val2
是指以下 URL 的“”部分:
http://example.com/something/else?arg1=val1&arg2=val2
通过“改变查询字符串”,我的意思是任何可能使客户端和服务器看起来不同的操作(服务器看到的查询字符串与客户端使用的不同)。
许多现代反向代理可以改变查询字符串。但我看不出为什么负载均衡器或代理会默认这样做。
也许它使用 URI 进行粘性会话负载平衡,但那真的很愚蠢。
所以:不,我不知道任何负载均衡器,默认情况下会更改 uri 和参数。
我还没有看到执行此操作的代理,但如果您不能按 IP 执行此操作并且即使用户禁用了 cookie,您也希望它工作,它可以成为会话粘性的可行解决方案。