当前位置: 首页 > 科技观察

网络安全攻防:Web安全之URL结构

时间:2023-03-20 16:20:04 科技观察

本文简单介绍了URL(UniformResourceLocator)的结构和URL的编解码。为什么需要对URL进行编码,对它们进行编码有什么好处?首先,URL是一个UniformResourceIdentifier,通常所说的URL只是URI的一部分。一个典型的URL格式如图1所示。图1URL格式下面说的URL编码实际上应该是指URI编码。需要编码的部分通常不方便传输或造成歧义。原因有很多。对于URL,编码是必需的,因为URL中的某些字符会导致歧义。比如在传输过程中,通常采用键值对的方式,username=12345;这个方法很容易让人理解,这是一个赋值的过程,但是接收到URL的服务器并不知道“=”这个字符是字符串数据的一部分还是需要赋值,所以这里的字符需要进行编码在传输过程中。再比如,URL的编码格式采用ASCII码而不是Unicode,也就是说URL中不能包含任何非ASCII字符,比如中文。否则,如果客户端浏览器和服务器浏览器支持不同的字符集,中文可能会出现问题。所以,URL编码的原则就是用安全的字符来表示那些不安全的字符,比如百分号编码。1.百分比编码在介绍百分比编码之前,需要了解一下URL需要对哪些字符进行编码。RFC3986文档规定URL中只能包含英文字母(a~z、A~Z)、数字(0~9)、“-”、“_”、“.”、“~”以及所有保留字符。所谓保留字符,就是分隔URL、分隔不同组成部分的字符。RFC3986规定以下字符为保留字符,如图2所示。图2RFC3986保留字符百分号的编码方式很简单,用百分号(%)加两个字符(0123456789ABCDEF),表示为一个字节十六进制。URL编码默认使用的字符集是ASCII。例如井号(#)对应的十六进制值为0x23,那么它的URL编码就是%23。对于非ASCII字符,需要使用ASCII字符集的超集进行编码得到对应的字节,然后对每个字节进行百分号编码。2.URL解析在传输之前,浏览器对URL进行编码。接收URL的服务器主要负责解析接收到的URL。在使用URL的过程中,由于Internet上的大多数网页都会引用与其在同一台服务器上甚至同一目录下的文件,所以会用到相对URL的概念。引入URL编码时,显示的是绝对URL,相当于计算机中相对路径和绝对路径的区别。所以在解析的时候,服务器需要区分相对URL和绝对URL。根据规范,区分两者非常简单。如果URL字符串不是后跟冒号(:)或双斜杠(//)的有效协议名称,则它是需要引用的相对URL。事实上,在实际应用中,相对URL的解析是标准化的,因为不同浏览器的具体实现差异很大,有效协议名的字符集也不同,还有各种可选的双斜杠(//)分隔符方法,因此,下一步是对相对URL的解析进行分类。(1)有协议名,但没有授权信息(http:abc.txt)。这是一个比较知名的漏洞,是RFC3986规范中的疏忽造成的。这些地址在规范中被描述为无效的绝对地址,但是在提供的解析算法中解析这些地址是错误的。因此,这种形式的URL会被理解为一个相对地址,以便在执行过程中进行处理。例如,在某些情况下,http:abc.txt将被解释为相对地址,而https:example.com将被解释为绝对地址。(2)没有协议名,但是有授权信息(//example.com)。这种写法在规范中给予了更完整的处理。面对这样的网址,浏览器会自动补全网址。(3)没有协议名,没有授权信息,但是有路径(../robots.txt)。这是一个比较常见的用法。协议和授权信息是从引用URL中复制过来的,然后相对地址就完成了。(4)没有协议名,没有授权信息,没有路径,但是有查询字符串(?username=abc)。在这种情况下,协议、授权信息和路径都是从原始引荐来源网址原封不动地复制过来的。查询字符串和字段ID来自相对URL。(5)只有片段ID(#bunnies)。这个方法也是一样的,其他部分都是原封不动的从原来的引用URL中复制过来,只替换了字段ID部分。