浅谈关于GET和POST两种请求的区别

来源:互联网 发布:博物馆文艺软件 编辑:程序博客网 时间:2024/05/29 18:36

关于GET和POST两种请求的区别

可能php最经典的几个面试问题就有这个,答案无非也是:

GET请求的数据保存在url里、安全性不高、而且有传输大小限制,一般为2083字节
POST请求的数据不可见、安全性相对较高、大小一般设置为2MB,可修改配置来改变大小

用来应付面试,这种程度的答案也许就过关了,但是答案是否全面准确呢?
下面依据http协议来详细的解释下GET和POST两种请求的区别

首先我们要知道 客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

GET请求

GET /books/?sex=man&name=Professional HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive

注意最后一行是空行

POST请求

POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive

name=Professional%20Ajax&publisher=Wiley

1、提交方式在请求中的位置

GET方式提交,把数据在HTTP协议头中,以?分割URL和传输数据,多个参数用&连接;如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密。

POST提交:把提交的数据放置在是HTTP包的包体中。

所以,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会改变。

但是HTTP并没有要求,如果是POST方法,请求数据就要放在BODY中。也没有要求,如果是GET方法,请求数据(参数)就一定要放在URL中而不能放在BODY中。这只是HTML标准对HTTP协议的用法的约定

2、传输数据的大小:首先声明:

HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。所以GET和POST本身没有传输大小的限制,而限制因素主要来源于实际开发
而在实际开发中存在的限制主要有:

GET:特定浏览器和服务器对URL长度有限制,例如 IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。(现在IE是否还有限制不太清楚)。

而服务器对URL长度的限制主要是因为URL长了,对服务器处理也是一种负担。原本一个会话没有多少数据,但如果有人恶意地构造几M大小的URL,并不停地访问你的服务器。服务器的最大并发数显然会下降。另一种攻击方式是,把告诉服务器Content-Length是一个很大的数,然后只给服务器发一点儿数据。哪怕你有超时设置,这种故意的次次访问超时也能让服务器gameover。所以,多数服务器因为安全、稳定等方面的考虑,会给URL长度加限制。但是这个限制是针对所有HTTP请求的,与GET、POST没有关系。
因此对于GET提交时,传输数据就会受到URL长度的 限制。

POST:因为不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。像Apache一般为2MB,可修改。

3、安全性

POST的安全性要比GET的安全性高
比如:通过GET提交数据,请求数据出现在URL上,虽然是经过base64处理过,但因为页面有可能被浏览器缓存,其他人查看浏览器的历史记录,就可以拿到你的个人信息了,除此之外,使用GET提交数据还可能会受到跨站伪造请求攻击。而POST也并不是完全安全的,只是相对GET的安全性更高点,例如截包重发。

4、对资源信息的操作

Http协议定义了很多与服务器交互的方法,最基本的有4种,分别是GET,POST,PUT,DELETE。一个URL地址用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作(类似于数据库的CURD)。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息

**

参考资料

http://www.cnblogs.com/ranyonsue/p/5984001.html**

原创粉丝点击