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