URL-根据 Amazon AWS 规范编码的查询字符串

URL-encoded Query String according to Amazon AWS specs

我目前正在实施一个应用程序来生成 Amazon AWS Signature Version 4 签名(有关签名过程的详细信息,请参阅此页面:http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html)。 方便的是,亚马逊还为这些签名提供了一个测试套件。但是,有一个测试用例,我真的搞不懂。 请注意,我的问题仅涉及签名过程的第一步(生成规范请求),特别是规范查询字符串的创建。

测试用例输入 HTTP 请求如下所示:

POST /?@#$%^&+=/,?><`";:\|][{} =@#$%^&+=/,?><`";:\|][{}  http/1.1
Date:Mon, 09 Sep 2011 23:36:00 GMT
Host:host.foo.com

这是规范请求的预期结果:

POST
/
%20=%2F%2C%3F%3E%3C%60%22%3B%3A%5C%7C%5D%5B%7B%7D&%40%23%24%25%5E=
date:Mon, 09 Sep 2011 23:36:00 GMT
host:host.foo.com

date;host
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

规范请求中的第三行表示 url 编码的查询字符串。但我真的不知道他们是如何从输入中得到的,即使遵循 Sig V4 文档中规定的规则也是如此:

要构造规范查询字符串,请完成以下步骤:

根据以下规则对每个参数名称和值进行 URI 编码:

不要对 RFC 3986 定义的任何未保留字符进行 URL 编码:

A-Z、a-z、0-9、连字符 (-)、下划线 (_)、句点 (.) 和波浪号 (~)。 使用 %XY 对所有其他字符进行百分比编码,其中 X 和 Y 是十六进制字符(0-9 和大写 A-F)。

例如,space 字符必须编码为 %20(不像某些编码方案那样使用“+”)并且扩展的 UTF-8 字符必须采用 %XY%ZA% 的形式BC.

按字符代码(即严格的 ASCII 顺序)对编码后的参数名称进行排序。例如,以大写字母 F(ASCII 代码 70)开头的参数名称位于以小写字母 b(ASCII 代码 98)开头的参数名称之前。

从排序列表中的第一个参数名称开始构建规范查询字符串。

对于每个参数,附加 URI 编码的参数名称,后跟字符“=”(ASCII 代码 61),然后是 URI 编码的参数值。 对没有值的参数使用空字符串。

除了列表中的最后一个值外,在每个参数值后附加字符“&”(ASCII 代码 38)。

谁能解释一下? 提前致谢!

我想我可能已经明白了。将查询字符串 @#$%^&+=/,?><``";:\|][{} =@#$%^&+=/,?><``";:\|][{} 分解为 key/value 对(按出现顺序):

  1. @#$%^,值None
  2. +,值 /,?><``";:\|][{}
  3. @#$%^,值None
  4. +,值 /,?><``";:\|][{}

根据 ,没有关于如何处理重复键的标准,所以看起来亚马逊只是选择忽略或覆盖(无法用这个测试用例来判断,因为重复键的值相同)。

最后,考虑到 @#$%^ 第二次出现之前的 =,我认为它被解析为具有 null 键值的 key/value 对,所以它正在一起被丢弃。