在上一节介绍了URL的基本概念,但其实URL中还有一个非常重要的概念没有介绍-URL中的参数。
比如一个完整的URL应当是如下格式:
“?id=1”就是URL中的参数,用于表示客户端要向网站传送的数据。
这个参数是通过Get方法传递给网站的,Get方法以及Post方法是我们接下来要重点学习的两个概念。
Get方法
在最早版本的HTTP协议中只提供了Get方法,也就是只允许客户端从网站获取(Get)数据。在绝大多数情况下,客户端浏览网站中的网页,的确只是在从网站中Get数据。
比如URLhttp://www.test.com就表示客户端请求访问网站的首页(index.php),此时数据只是从网站发给客户端,而客户端并没有向网站传送数据。
但在某些情况下,客户端也需要向服务器传送一些数据,比如要登录某个网站,那么客户端就需要向网站传送用户名和密码等数据。所以后来就对Get方法的功能进行了扩展,允许客户端通过Get方法向网站传送少量数据。
Get方法通过URL向网站传送数据,所以使用Get方法传递的数据会显示在浏览器地址栏中。
比如URL“http://www.test.com/index.php?id=1”就表示客户端请求访问网站的index.php页面,并用Get方法向网站传递数据“id=1”。
id是在服务器端事先定义好的一个参数,数值1就是客户端所传送的数据。
如果要同时传递多个参数,参数之间以&分隔,如id=1&name=admin。
客户端在使用Get方法时,是否需要向网站传送数据,这需要由网站开发人员根据实际需求来进行设置。
对于目前广泛使用的动态页面,页面的框架通常都是固定的,然后客户端向网站传送相应的参数,网站根据用户传递的不同参数在这个页面中显示相应的信息。
比如打开我们之前搭建的DVWA网站,选择其中的“SQL Injection”漏洞,在“User ID”中输入1,点击Submit,然后就在URL中通过Get方法将这两个参数传送给了网站。
然后在UserID中输入2或者3,可以发现随着参数的变化,页面中会随之显示相应ID的信息。但我们始终访问的是index.php这个页面,整个页面的架构没有变,变化的只是不同的参数所查询出来的数据。
Post方法
虽然客户端能够通过Get方法向网站传送数据,但是Get方法也有很多缺陷,主要体现在以下两个方面:
一是由于浏览器对URL的长度会有限制,所以Get方法通常只能用于向网站发送少量数据。如果要传送的数据量比较大,那么Get方法就无法满足要求了。
二是利用Get方法传送的数据会直接显示在浏览器地址栏中,这样就容易造成信息泄露,所以对于像用户密码这类数据就不适合使用Get方法来传送。
为了解决Get方法存在的上述问题,后来又引入了Post方法,从名字中就可以看出,这是一个专门用于客户端向网站传送数据的方法。
Post方法将要传送的数据放在HTTP请求报文的正文中,所以这些数据不会显示在浏览器地址栏中,不会造成信息泄露。
另外使用Post方法传送的数据也没有容量限制,可以用于向网站发送大量数据,所以在诸如用户登录、文件上传、留言提交等场景都会使用Post方法。
典型的Post请求报文如下图所示。