33

RFC 3986 URI:通用语法规范将分号列为保留(子分隔符)字符:

reserved    = gen-delims / sub-delims

gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

“;”的保留用途是什么 URI 中的分号?就此而言,其他子分隔符的用途是什么(我只知道“&”、“+”和“=”的用途)?

4

6 回答 6

40

第 3.3 节末尾有解释。

除了层次路径中的点段之外,路径段被通用语法认为是不透明的。生成 URI 的应用程序通常使用段中允许的保留字符来分隔特定于方案或特定于解引用处理程序的子组件。例如,分号 (";") 和等号 ("=") 保留字符通常用于分隔适用于该段的参数和参数值。逗号 (",") 保留字符通常用于类似目的。例如,一个 URI 生产者可能使用诸如“name;v=1.1”之类的段来指示对“name”版本 1.1 的引用,而另一个 URI 生产者可能使用诸如“name,1.1”之类的段来指示相同。参数类型可以由特定于方案的语义定义,

换句话说,它是保留的,以便那些想要在 URL 中分隔列表的人可以安全地;用作分隔符,即使部分包含;,只要内容是百分比编码的。换句话说,您可以这样做:

foo;bar;baz%3bqux

并将其解释为三个部分:foo, bar, baz;qux. 如果分号不是保留字符,则;and%3b将是等效的,因此 URI 将被错误地解释为四个部分:foo, bar, baz, qux

于 2010-01-29T17:41:40.170 回答
9

如果您回到规范的旧版本,意图会更清楚:

  path_segments = segment *( "/" segment )
  segment       = *pchar *( ";" param ) 

每个路径段可以包括一系列参数,用分号“;”表示 特点。

我相信它起源于FTP URI

于 2010-01-29T17:50:10.363 回答
5

第 3.3 节介绍了这一点——它是一个不透明的分隔符,如果方便,生成 URI 的应用程序可以使用:

除了层次路径中的点段之外,路径段被通用语法认为是不透明的。生成 URI 的应用程序通常使用段中允许的保留字符来分隔特定于方案或特定于解引用处理程序的子组件。例如,分号 (";") 和等号 ("=") 保留字符通常用于分隔适用于该段的参数和参数值。逗号 (",") 保留字符通常用于类似目的。例如,一个 URI 生产者可能使用诸如“name;v=1.1”之类的段来指示对“name”的 1.1 版本的引用,而另一个 URI 生产者可能使用诸如“name,1.1”之类的段来指示相同。参数类型可以由特定于方案的语义定义,

于 2010-01-29T17:40:56.473 回答
4

围绕其当前用法有一些有趣的约定。这些说明何时使用分号或逗号。来自“RESTful Web Services”一书:

使用标点符号分隔同一层次结构中的多条数据。当项目的顺序很重要时使用逗号,... 当顺序无关紧要时使用分号。

于 2013-07-04T18:56:10.220 回答
3

自 2014 年以来,已知路径段会导致反射文件下载攻击。假设我们有一个易受攻击的 API,它反映了我们发送给它的任何内容:

https://google.com/s?q=rfd%22||calc||

{"results":["q", "rfd\"||calc||","I love rfd"]}

现在,这在浏览器中是无害的,因为它是 JSON,所以它不会被渲染,但浏览器宁愿提供将响应下载为文件。现在这里的路径段来帮助(攻击者):

https://google.com/s;/setup.bat;?q=rfd%22||calc||

分号 ( ;/setup.bat;)之间的所有内容都不会发送到 Web 服务,而是浏览器会将其解释为文件名...以保存 API 响应。

现在,将下载并运行一个名为的文件setup.bat,而无需询问运行从 Internet 下载的文件的危险(因为它的"setup"名称中包含该词)。内容将被解释为 Windows 批处理文件,并calc.exe运行命令。

预防:

  • 清理 API 的输入(在这种情况下,它们应该只允许字母数字);逃避是不够的
  • 添加Content-Disposition: attachment; filename="whatever.txt"不会被渲染的 API;谷歌错过了filename实际上使攻击更容易的部分
  • X-Content-Type-Options: nosniff标头添加到 API 响应
于 2014-10-21T14:29:53.663 回答
0

我发现了以下用例:

它是 HTML 实体的最后一个字符:

XML 和 HTML 字符实体引用列表

要在 HTML 或 XML 文档中使用这些字符实体引用之一,请输入一个 & 号,后跟实体名称和一个分号,例如 & 表示 & 号 (“&”)。

Apache Tomcat 7(或更新版本?!)我们将其作为path parameter

三个分号漏洞

Apache Tomcat 是支持“路径参数”的 Web 服务器的一个示例。路径参数是文件名后的额外内容,以分号分隔。分号后的任何任意内容都不会影响 Web 浏览器的登录页面。这意味着 http://example.com/index.jsp;derp仍将返回 index.jsp,而不是一些错误页面。

URI 方案由它拆分 MIME 和数据:

数据 URI 方案

它可以包含一个可选的字符集参数,用分号 (;) 与前面的部分分隔。

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />

并且 IIS 5 和 IIS 6 中存在绕过文件上传限制的错误:

无限制的文件上传

将文件扩展名列入黑名单 这种保护可以通过以下方式绕过: ...通过在禁止的扩展名之后和允许的扩展名之前添加一个分号字符(例如“file.asp;.jpg”)

结论:

不要在 URL 中使用分号,否则它们可能会意外生成 HTML 实体或 URI 方案。

于 2017-02-17T13:39:21.303 回答