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 对(按出现顺序):
- 键
@#$%^
,值None
- 键
+
,值 /,?><``";:\|][{}
- 键
@#$%^
,值None
- 键
+
,值 /,?><``";:\|][{}
根据 ,没有关于如何处理重复键的标准,所以看起来亚马逊只是选择忽略或覆盖(无法用这个测试用例来判断,因为重复键的值相同)。
最后,考虑到 @#$%^
第二次出现之前的 =
,我认为它被解析为具有 null
键值的 key/value 对,所以它正在一起被丢弃。
我目前正在实施一个应用程序来生成 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 对(按出现顺序):
- 键
@#$%^
,值None - 键
+
,值/,?><``";:\|][{}
- 键
@#$%^
,值None - 键
+
,值/,?><``";:\|][{}
根据 ,没有关于如何处理重复键的标准,所以看起来亚马逊只是选择忽略或覆盖(无法用这个测试用例来判断,因为重复键的值相同)。
最后,考虑到 @#$%^
第二次出现之前的 =
,我认为它被解析为具有 null
键值的 key/value 对,所以它正在一起被丢弃。