Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
URL中保留的分号是什么?_Url_Uri_Character_Rfc3986 - Fatal编程技术网

URL中保留的分号是什么?

URL中保留的分号是什么?,url,uri,character,rfc3986,Url,Uri,Character,Rfc3986,本规范将分号列为保留(sub-delim)字符: reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" sub-delims = "!" / "$" / "&&quo

本规范将分号列为保留(sub-delim)字符:

reserved    = gen-delims / sub-delims

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

sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="
URI中分号“;”的保留用途是什么?就此而言,其他子delims的用途是什么(我只知道“&”、“+”和“=”)的用途?

-如果方便,URI生成应用程序可以使用不透明的分隔符:

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


第3.3节末尾有一个解释

除了中的点段之外 分层路径,即路径段 一般认为不透明的 语法。URI生成应用程序 经常使用保留字符 允许在段中进行定界 特定计划或 特定于解引用处理程序的 子组件。例如 分号(;)和等号(=) 通常使用保留字符 定义参数和参数的步骤 适用于该段的值。 逗号(“,”)保留字符为 经常用于相似的目的。 例如,一个URI生产者可能 使用段uch作为“名称;v=1.1” 指示对版本1.1的引用 “名字”,而另一个可能 使用诸如“名称,1.1”之类的段来 表示相同。参数类型 可根据具体方案进行定义 语义,但在大多数情况下 参数的语法特定于 URI的实现 解引用算法

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

foo;bar;baz%3bqux

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

如果您回到规范的第二部分,意图会更清楚:

  path_segments = segment *( "/" segment )
  segment       = *pchar *( ";" param ) 
每个路径段可以包括一个路径段 参数序列,由分号“;”字符表示


我相信它起源于美国。

关于它当前的用法,有一些惯例很有趣。这说明何时使用分号或逗号。摘自《RESTfulWeb服务》一书:

使用标点符号在同一层次上分隔多个数据段。当项目顺序重要时,请使用逗号。。。如果顺序不重要,请使用分号


自2014年以来,已知路径段有助于实现这一目标。假设我们有一个易受攻击的API,它反映了我们发送给它的内容:

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

{"results":["q", "rfd\"||calc||","I love rfd"]}
现在,这在浏览器中是无害的,因为它是JSON,所以它不会被呈现,但是浏览器会提供下载作为文件的响应。现在,以下是路径段的帮助(针对攻击者):

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

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

预防:

  • 清理API的输入(在这种情况下,它们应该只允许字母数字);逃避是不够的
  • 添加
    内容配置:附件;filename=“whatever.txt”
    在不呈现的API上;谷歌丢失了
    文件名
    部分,这实际上使攻击变得更容易
  • X-Content-Type-Options:nosniff
    标题添加到API响应

我发现了以下用例:

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

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

Apache Tomcat 7(或更新版本?!)将其作为路径参数使用:

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

URI方案通过它分割MIME和数据:

它可以包含一个可选的字符集参数,与 以分号(;)开头的部分


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

将此保护绕过的文件扩展名列入黑名单可能是:。。。 通过在禁止的扩展名和 在允许的文件之前(例如“file.asp;.jpg”)

结论:

不要在URL中使用分号,否则它们可能会意外生成
https://google.com/s;/setup.bat;?q=rfd%22||calc||
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUA
AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />