URL 中保留的分号是啥?

Posted

技术标签:

【中文标题】URL 中保留的分号是啥?【英文标题】:What is the semicolon reserved for in URLs?URL 中保留的分号是什么? 【发布时间】:2011-01-10 22:50:03 【问题描述】:

RFC 3986 URI: Generic Syntax 规范将分号列为保留(子分隔符)字符:

reserved    = gen-delims / sub-delims

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

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

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

【问题讨论】:

【参考方案1】:

Section 3.3 covers this - 这是一个不透明的分隔符,如果方便,生成 URI 的应用程序可以使用:

除了点段 层次路径,路径段是 被泛型认为是不透明的 句法。 URI 生成应用程序 经常使用保留字符 允许在段中分隔 特定方案或 取消引用处理程序特定 子组件。例如, 分号 (";") 和等于 ("=") 保留字符通常用于 分隔参数和参数 适用于该段的值。这 逗号 (",") 保留字符是 经常用于类似目的。为了 例如,一个 URI 生产者可能使用 段如“name;v=1.1”到 表示对 1.1 版的引用 “名称”,而另一个可能使用 段如“name,1.1”来表示 相同。参数类型可能是 由特定于方案的语义定义, 但在大多数情况下,a 的语法 参数是特定于 URI 的实现 解引用算法。

【讨论】:

什么是“不透明分隔符”?它以什么方式不透明?【参考方案2】:

3.3节末尾有说明。

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

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

foo;bar;baz%3bqux

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

【讨论】:

简而言之,保留,但没有什么特别的。我们使用它来编码 RESTful 查询中的一些信息。 感谢您的示例,这真的很有帮助。 有人可以分享一个在真实网络服务中使用的例子吗? HTTP URL 中; 的一些特殊含义? @Winny 我的路径包括在路径结束之前过滤的段。例如:some.com/path/filter;arguments;here/products/12345 在不影响路径本身的情况下,将元数据添加到路径的整个分支也很有用。例如:some.com/blog;paid_user/2018/Jun/That-time-I-did-that-thingmyshop.com/product;referred_by_facebook/category/123【参考方案3】:

如果你回到规范的older versions,意图会更清楚:

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

每个路径段可能包含一个 参数序列,用分号“;”表示字符。

我相信它起源于FTP URIs。

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

自 2014 年以来,已知路径段对Reflected File Download attacks 有贡献。假设我们有一个易受攻击的 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 的输入(在这种情况下,它们应该只允许使用字母数字);转义是不够的 在不会渲染的 API 上添加 Content-Disposition: attachment; filename="whatever.txt"; Google 缺少 filename 部分,这实际上使攻击更容易 在 API 响应中添加 X-Content-Type-Options: nosniff 标头

【讨论】:

【参考方案6】:

我发现了以下用例:

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

List of XML and HTML character entity references

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

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

Three Semicolon Vulnerabilities

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

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

Data URI scheme

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

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

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

Unrestricted File Upload

将文件扩展名列入黑名单 此保护可能会被以下人员绕过: ... 通过在禁止扩展后添加分号字符和 在允许的之前(例如“file.asp;.jpg”)

结论:

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

【讨论】:

以上是关于URL 中保留的分号是啥?的主要内容,如果未能解决你的问题,请参考以下文章

15、pandas的设置数字格式,小数位数、百分号、千位分隔符

价格格式化--小数保留两位,整数部分用千分号分割

urlbase64 编码规则

web-URL参数解析

保留/自动释放已保留财产的额外好处是啥?

我的进程中所有这些未提交的保留内存是啥?