网络安全基础–url编码

URL基础知识

URL 是“统一资源定位符”(Uniform Resource Locator)的首字母缩写,中文译为“网址”,表示各种资源的互联网地址。所谓资源,可以简单理解成各种可以通过互联网访问的文件,比如网页、图像、音频、视频、JavaScript 脚本等等。只有知道了它们的URL,才能在互联网上获取它们。

URL的一般语法格式为:protocol :// hostname[:port] / path / [;parameters][?query]#fragment

例如: https://www.example.com:8080/path/to/index.html?key1=value1&key2=value2#test

协议(protocol)是浏览器请求服务器资源的方法,上例是https://的部分,表示使用HTTPS协议。互联网支持多种协议,必须指明网址使用哪一种协议,默认是HTTP协议。也就是说,如果省略协议,直接在浏览器地址栏输入www.example.com,那么浏览器默认会访问http://www.example.com。

主机(host)是资源所在的网站名或服务器的名字,又称为域名。一个URL中,也可以使用IP地址作为域名。

同一个域名下面可能同时包含多个网站,它们之间通过端口(port)区分。跟在域名后面的是端口,域名和端口之间使用“:”作为分隔符。端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口80。

路径(path)是资源在网站的位置。比如,/path/to/index.html这个路径,指向网站的/path/to子目录下面的网页文件index.html。路径可能不包含文件名,比如/path/to/,甚至结尾的斜杠都可以省略。这时,服务器通常会默认跳转到该目录里面的index.html文件。

查询参数(parameter)是提供给服务器的额外信息。参数的位置是在路径后面,两者之间使用?分隔,上例是?key1=value1&key2=value2。查询参数可以有一组或多组。每组参数都是键值对(key-value pair)的形式,同时具有键名(key)和键值(value),它们之间使用等号(=)连接。比如,key1=value就是一个键值对,key1是键名,value1是键值。多组参数之间使用&连接,比如key1=value1&key2=value2。

#代表网页中的一个位置。其右面的字符,就是该位置的标识符。比如,http://www.example.com/index.html#print就代表网页index.html的print位置。浏览器读取这个URL后,会自动将print位置滚动至可视区域。

?的作用有2个,一是连接作用:比如

http://www.xxx.com/Show.asp?id=77&nameid=2905210001&page=1

二是清除缓存:比如

http://www.xxxxx.com/index.html

http://www.xxxxx.com/index.html?test123123

两个url打开的页面一样,但是后面这个有问号,说明不调用缓存的内容,而认为是一个新地址,重新读取。

URL编码

对于url来说,之所以要进行编码,是因为url中有些字符会引起歧义。例如url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/sq=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么势必会造成接收url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码。

需要注意的是,对于url中的合法字符,编码和不编码是等价的。正常情况浏览器会自动编码,但是通过burp拦截并修改请求时没有经过浏览器编码,需注意手动编码。

任何基于URL的输入在分配相关变量之前都会在服务器端自动进行URL解码。这意味着,就大多数服务器而言,查询参数中的%22、%3D和%3E等序列分别与“”、“<”和“>”字符同义。换句话说,您可以通过URL注入URL编码的数据,而后端应用程序通常仍能正确解释这些数据。

URL的编码格式采用的是ASCII码(转换成十六进制,并在前面加上“%”),而不是Unicode。URL只允许用ASCII字符集中可打印的字符(0x20--0x7e),其中某些字符在HTTP协议里有特殊的意义,所以有些也不能使用。这里有个需要注意的,”+”加号代表URL编码的空格,%20也是。将需要编码的字符的ASCII转为16进制,前面加上%,编码成%XY格式。例如,空格ASCII码是32,对应16进制是20,那么urlencode编码结果是%20。

URL 编码的原则是使用安全字符去表示那些不安全的字符。URL编码协议规定(RFC3986协议):URL中只允许使用ASCII字符集可以显示的字符,比如英文字母、数字、和- _ . ~ ! *这6个特殊字符。除了无法显示的字符需要编码外,还需要对 URL 中的部分保留字符和不安全字符进行编码。

URL中规定了一些具有特殊意义的字符,常被用来分隔两个不同的 URL 组件,这些字符被称为保留字符。例如:

“:”用于分隔协议和主机组件

“/”用于分隔主机和路径

“?”用于分隔路径和查询参数等。

“=”用于表示查询参数中的键值对。

“&”符号用于分隔查询多个键值对。

下表列出了 URL 中部分保留字符和不安全字符的URL编码

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>