依赖URL查询参数的顺序是否合法或安全?具体来说,我是否能够编写代码,并相信该代码将始终有效,具有基于这两个查询字符串的不同行为:
?a=10&add=5&multiply=3 # might mean (10 + 5) * 3
?a=10&multiply=3&add=5 # might mean (10 * 3) + 5
(我的例子当然是做作的,我知道建立一个像这样的计算器是荒谬的。:))
答案 0 :(得分:5)
这些查询字符串既完全合法又不同。根据{{3}},查询字符串只不过是
...用于识别URI方案和命名权限范围内的资源的非分层数据
HTML表单必须以key=value
格式生成application/x-www-form-urlencoded
对的规则详细RFC 3986。特别感兴趣的是如何解析application/x-www-form-urlencoded
内容的规则:
要解码
application/x-www-form-urlencoded
有效负载,应使用以下算法....此算法的输出是排序名称 - 值对列表。
因此,application/x-www-form-urlencoded
查询字符串内容可以被正确地视为键/值对的排序列表。
但是,请记住并非所有Web框架都会捕获此信息。它们可能会为您提供从查询字符串解析的属性名称和值的无序字典。例如,Node.js中的in the W3C HTML spec方法将解析后的查询字符串作为对象(其属性为键/值`对)返回,并且JavaScript对象始终是无序的。