当前位置: 首页 > 知识库问答 >
问题:

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

赫连开畅
2023-03-14

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

测试用例输入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、连字符(-)、下划线(ux)、句点(.)和波浪号(~)。百分比使用%XY对所有其他字符进行编码,其中X和Y是十六进制字符(0-9和大写A-F)。

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

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

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

附加角色的

有人能解释一下吗?提前多谢!

共有1个答案

葛炜
2023-03-14

我想我可能已经弄明白了。分解查询字符串@#$%^

  1. @#$%^,值无
  2. ,值/,?

基于https://stackoverflow.com/a/1746566/3108853,没有关于如何处理重复键的标准,所以看起来亚马逊只是选择了忽略或覆盖(用这个测试用例无法判断,因为重复键的值是相同的)。

最后,考虑到第二次出现@#$%^之前的=,我认为它被解析为带有null键值的键/值对,因此它被一起删除。

 类似资料:
  • 问题内容: 说我有一个网址 并且我有一个用户输入的查询,例如: 随机词银行 我希望结果是正确编码的URL: 实现此目标的最佳方法是什么?我尝试创建URI / URL对象,但没有一个是正确的。 问题答案: 应该是要走的路。你只需要记住只对单个查询字符串参数名称和/或值进行编码,而不对整个URL 进行编码,请确保对查询字符串参数分隔符和参数名称-值分隔符都不进行编码。 请注意,查询参数中的空格由+而不

  • 假设我有一个URL 并且我有一个用户输入的查询,例如: 随机字500英镑银行$ 我希望结果是一个正确编码的URL: 实现这一点的最佳方法是什么?我尝试了并创建URI/URL对象,但结果都不是很对。

  • 问题内容: 我有一个网址 并且我有一个用户输入的查询,例如: 我希望结果是正确编码的URL: 实现此目标的最佳方法是什么?我尝试创建URI / URL对象,但是没有一个是正确的。 问题答案: 可以使用 。您只需要记住只对单个查询字符串参数名称和/或值进行编码,而不对整个URL 进行编码,请确保对查询字符串参数分隔符&和参数名称-值分隔符都不进行编码=。 请注意,查询参数中的空格由而不是表示,这是合

  • 问题内容: 我收到一个json数据对象,然后从中提取一个字符串 然后我尝试使该字符串适合在URL中使用 但它不起作用 如果我对newCountryString进行了硬编码,它将起作用,为什么呢? 问题答案: 用这个 - 此代码将使用给定的编码返回接收方的表示形式,以确定将接收方转换为合法URL字符串所需的转义百分比。 有关更多详细信息:https : //developer.apple.com/d

  • 这个编码规范是给TypeScript开发团队在开发TypeScript时使用的。 对于使用TypeScript的普通用户来说不一定适用,但是可以做为一个参考。 命名 使用PascalCase为类型命名。 不要使用I做为接口名前缀。 使用PascalCase为枚举值命名。 使用camelCase为函数命名。 使用camelCase为属性或本地变量命名。 不要为私有属性名添加_前缀。 尽可能使用完整的

  • 以下是 Electron 项目的编码规范,您可以运行 npm run lint来显示 cpplint和 eslint检测到的任何规范问题 C++ 和 Python 对于C ++和Python,我们遵循Chromium的编码风格. 您可以使用clang-format自动格式化C ++代码.也可以使用 script/cpplint.py 来检验文件是否符合要求. 我们目前使用的 Python 版本是