【问题标题】:Using duplicate parameters in a URL在 URL 中使用重复参数
【发布时间】:2012-07-22 05:12:21
【问题描述】:

我们正在内部构建 API,并且经常传递具有多个值的参数。

他们使用:mysite.com?id=1&id=2&id=3

代替:mysite.com?id=1,2,3

我赞成第二种方法,但我很好奇第一种方法是否真的不正确?

【问题讨论】:

  • 实际上是正确的。而在java中,你只需要调用request.getParameterValues("id")来获取字符串值数组。
  • 你能指出一些说明它是正确的参考吗?很难将 Java 对 URL 的解释作为标准。
  • 是的,它实际上取决于您的 Web 环境,所以我们真的不能将 java 的解释作为标准。查看此内容以获取类似的讨论和替代方案stackoverflow.com/questions/6243051/…
  • 为了安全起见,我只是在connection-string 中实现了两者,以生成一个包含所有值的数组。所以你输入的?a=1&a=2,3,4&a=5 被解析成a = [1 ,2, 3, 4, 5]

标签: standards url-parameters


【解决方案1】:

我不是 HTTP 专家,但据我了解,关于多个值的 URL 的查询部分没有明确的标准,通常取决于处理请求以解析查询字符串的 CGI。

RFC 1738 第 3.3 节提到了 searchpart,它应该在 ? 之后,但似乎没有详细说明其格式。

http://<host>:<port>/<path>?<searchpart>

【讨论】:

  • CGI……过去的爆炸。 ?
【解决方案2】:

在您的第一种方法中,您将获得一个查询字符串值数组,但在第二种方法中,您将获得一个查询字符串值字符串。

【讨论】:

  • 这是一种误导:第一种方法你会得到一个查询字符串值的数组。这完全取决于解析查询字符串的系统来决定如何解释它。例如,在 PHP 中,最后一个值将分配给 $_GET['id']。您必须使用这种格式:mysite.com?id[]=1&id[]=2&id[]=3 来获取数组。
【解决方案3】:

我没有(费心)检查哪个 RFC 标准定义了它。 (任何知道这一点的人请在评论中留下参考。)但实际上,mysite.com?id=1&id=2&id=3 方式已经是当表单包含重复字段(通常是复选框)时浏览器会产生的方式。在w3schools example page 中查看它的实际应用。因此,您使用的任何编程语言很有可能已经提供了一些帮助函数来解析这样的输入并可能返回一个列表。

当然,您可以采用自己的方法,例如 mysite.com?id=1,2,3,在这种特殊情况下这还不错。但是您需要实现自己的逻辑来生成和使用这种格式。现在您可能需要也可能不需要考虑自己处理一些极端情况,例如:如果输入格式不正确怎么办,例如mysite.com?id=1,2,?如果逗号本身也可以是有效输入,例如mysite.com?name=Doe,John|Doe,Jane,您是否需要发明另一个分隔符?您是否会使用 json 字符串作为值,例如 mysite.com?name=["John Doe", "Jane Doe"]?等等等等。您的里程可能会有所不同。

【讨论】:

  • w3schools 链接仍然是第一种方法的有效示例吗?
  • @vdwees 为什么不呢?
  • 当我选中复选框并单击提交时,它说输入被接收为vehicle1=Bike&vehicle2=Car&vehicle3=Boat。我认为问题是关于vehicle=Bike&vehicle=Car&vehicle=Boat?
  • 哦,我明白了。在我写完答案后,他们改变了这个例子。那很不幸,我无法控制那部分。但是您可以继续更改他们示例的在线代码 sn-p,为所有三个复选框输入字段使用相同的名称,然后您将看到预期的效果。这就是复选框应该如何工作。 W3Cschool 搞砸了他们的样本(大概是当他们在样本中引入标签时 - 但无论如何这是一个不同的话题)。
【解决方案4】:

值得补充的是,在服务器上对 URL 中重复参数的不一致处理可能会导致漏洞,特别是 server-side HTTP parameter pollution,有一个实际示例 - Client side Http Parameter Pollution - Yahoo! Classic Mail Video Poc

【讨论】:

    【解决方案5】:

    我想这取决于您使用的技术,以及它如何变得方便。我目前正使用currency=USD,CHFcurrency=USD&currency=CHF 面对同一个问题

    我正在使用 Thymeleaf,使用第二个选项可以轻松工作,然后我可以请求类似:${param.currency.contains(currency.value)}。当我尝试使用第一个选项时,它似乎需要像字符串一样的“数组”,所以我需要先拆分然后再包含,这导致我的代码更加混乱。

    只要我的 50 美分 :-)

    【讨论】:

      猜你喜欢
      • 2010-10-24
      • 2021-01-02
      • 1970-01-01
      • 2013-11-21
      • 2016-06-28
      • 2016-09-08
      • 2015-05-14
      • 2014-09-16
      相关资源
      最近更新 更多