依赖 URL 查询参数的顺序是不是合法或安全?

Posted

技术标签:

【中文标题】依赖 URL 查询参数的顺序是不是合法或安全?【英文标题】:Is it legal or safe to depend on the ordering of URL query parameters?依赖 URL 查询参数的顺序是否合法或安全? 【发布时间】:2014-10-30 11:30:23 【问题描述】:

依赖 URL 查询参数的顺序是否合法或安全?具体来说,我是否能够编写代码,并相信该代码将始终有效,并且基于这两个查询字符串具有不同的行为:

?a=10&add=5&multiply=3    # might mean (10 + 5) * 3
?a=10&multiply=3&add=5    # might mean (10 * 3) + 5

(我的例子当然是人为的,我知道像这样构建一个计算器很可笑。:))

【问题讨论】:

旁注:如果你不指定括号我建议依靠PEMDAS,至少你会有正确的数学 【参考方案1】:

这些查询字符串是完全合法且不同的。根据RFC 3986,查询字符串无非就是

...用于在 URI 方案和命名权限范围内标识资源的非分层数据

html 表单必须如何生成application/x-www-form-urlencoded 格式的key=value 对的规则在in the W3C HTML spec 中有详细说明。特别感兴趣的是如何解析application/x-www-form-urlencoded 内容的规则:

要解码application/x-www-form-urlencoded 有效载荷,应使用以下算法....

该算法的输出是一个排序的名称-值对列表。

因此,application/x-www-form-urlencoded 查询字符串内容可能被正确地视为键/值对的排序列表。

但是,请记住,并非所有 Web 框架都能捕获此信息。相反,它们可能会为您提供从查询字符串解析的属性名称和值的无序字典。例如,Node.js 中的url.parse 方法将解析后的查询字符串作为对象返回(其属性为键/值对),而 javascript 对象始终是无序的。

【讨论】:

以上是关于依赖 URL 查询参数的顺序是不是合法或安全?的主要内容,如果未能解决你的问题,请参考以下文章

领域查询顺序是不是一致?

如何调试spring依赖顺序?

普鲁米确保依赖顺序

多线程程序下载的文件顺序不是恒定的

多列 BRIN 列顺序是不是重要?

CMake和静态库顺序