• 关于HTTP 请求方式: GET和POST的比较的本质


    什么是HTTP?

    超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议。

    HTTP在客户端和服务器之间以request-responseprotocol(请求-回复协议)工作。

    GET方法:

    使用GET方法时,查询字符串(键值对)被附加在URL地址后面一起发送到服务器:

    /test/demo_form.jsp?name1=value1&name2=value2

    特点:

    ·        GET请求能够被缓存

    ·        GET请求会保存在浏览器的浏览记录中

    ·        以GET请求的URL能够保存为浏览器书签

    ·        GET请求有长度限制

    ·        GET请求主要用以获取数据

    POST方法:

    使用POST方法时,查询字符串在POST信息中单独存在,和HTTP请求一起发送到服务器:

    POST/test/demo_form.jsp HTTP/1.1

    Host:w3schools.com

    name1=value1&name2=value2

    特点:

    ·        POST请求不能被缓存下来

    ·        POST请求不会保存在浏览器浏览记录中

    ·        以POST请求的URL无法保存为浏览器书签

    ·        POST请求没有长度限制

    GET和POST的区别:

     

    GET

    POST

    点击返回/刷新按钮

    没有影响

    数据会重新发送(浏览器将会提示用户“数据被从新提交”)

    添加书签

    可以

    不可以

    缓存

    可以

    不可以

    编码类型(Encoding type)

    application/x-www-form-urlencoded

    application/x-www-form-urlencoded or multipart/form-data. 请为二进制数据使用multipart编码

    历史记录

    没有

    长度限制

    没有

    数据类型限制

    只允许ASCII字符类型

    没有限制。允许二进制数据

    安全性

    查询字符串会显示在地址栏的URL中,不安全,请不要使用GET请求提交敏感数据

    因为数据不会显示在地址栏中,也不会缓存下来或保存在浏览记录中,所以看POST求情比GET请求安全,但也不是最安全的方式。如需要传送敏感数据,请使用加密方式传输

    可见性

    查询字符串显示在地址栏的URL中,可见

    查询字符串不会显示在地址栏中,不可见

    其他HTTP请求方式

    方式

    描述

    HEAD

    与GET请求类似,不同在与服务器只返回HTTP头部信息,没有页面内容

    PUT

    上传指定URL的描述

    DELETE

    删除指定资源

    OPTIONS

    返回服务器支持的HTTP方法

    CONNECT

    转换为透明TCP/IP隧道的连接请求

    本质上,这些并不是HTTP的GET和POST两者请求的区别,这些区别是建立在HTML标准对于HTTP协议的用法的约定之上的。

    1. GET和POST与数据如何传递没有关系

    GET和POST是由HTTP协议定义的。在HTTP协议中,Method和Data(URL, Body, Header)是正交的两个概念,也就是说,使用哪个Method与应用层的数据如何传输是没有相互关系的。

    HTTP没有要求,如果Method是POST数据就要放在BODY中。也没有要求,如果Method是GET,数据(参数)就一定要放在URL中而不能放在BODY中。

    那么,网上流传甚广的这个说法是从何而来的呢?我在HTML标准中,找到了相似的描述。这和网上流传的说法一致。但是这只是HTML标准对HTTP协议的用法的约定。怎么能当成GET和POST的区别呢?

    而且,现代的Web Server都是支持GET中包含BODY这样的请求。虽然这种请求不可能从浏览器发出,但是现在的Web Server又不是只给浏览器用,已经完全地超出了HTML服务器的范畴了。

    2. HTTP协议对GET和POST都没有对长度的限制

    HTTP协议明确地指出了,HTTP头和Body都没有长度的要求。而对于URL长度上的限制,有两方面的原因造成:

    1.    浏览器。据说早期的浏览器会对URL长度做限制。据说IE对URL长度会限制在2048个字符内(流传很广,而且无数同事都表示认同)。但我自己试了一下,我构造了90K的URL通过IE9访问live.com,是正常的。网上的东西,哪怕是Wikipedia上的,也不能信。

    2.   服务器。URL长了,对服务器处理也是一种负担。原本一个会话就没有多少数据,现在如果有人恶意地构造几个几M大小的URL,并不停地访问你的服务器。服务器的最大并发数显然会下降。另一种攻击方式是,把告诉服务器Content-Length是一个很大的数,然后只给服务器发一点儿数据,嘿嘿,服务器你就傻等着去吧。哪怕你有超时设置,这种故意的次次访问超时也能让服务器吃不了兜着走。有鉴于此,多数服务器出于安全啦、稳定啦方面的考虑,会给URL长度加限制。但是这个限制是针对所有HTTP请求的,与GET、POST没有关系。

    安全不安全和GET、POST没有关系

    我觉得这真是中国特色。我讲个小段子,大家应该可以体会出这个说法多么的可笑。

    觉得POST数据比GET数据安全的人会说

    “防君子不防小人;中国小白多,能防小白用户就行了。”

    “哼,”我不以为然,“那你怎么不说,URL参数都Encode过了,或是Base64一下,小白也看不懂啊。”

    那人反驳道,“Encode太简单了,聪明点儿的小白很容易就可以Decode并修改掉。”

    我笑道,“五十步笑百步耳,再聪明点儿的小白还会截包并重发呢,Opera就有这功能。”

    那人阴险地祭出神器——最终解释权,说,“这个不算小白。”

    我日啊。

  • 相关阅读:
    深入理解TCP协议及其源代码
    Socket与系统调用深度分析
    构建调试Linux内核网络代码的环境MenuOS系统
    创新产品的需求分析:未来的图书会是什么样子?
    socket通信的原理与实践
    案例分析:设计模式与代码的结构特性
    网络相关的命令工具研究报告:ssh
    业务领域建模Domain Modeling
    ubuntu 设置静态ip,但显示scope global secondary ens33
    解决Python查询Mysql中文乱码问题
  • 原文地址:https://www.cnblogs.com/doubleqsweet/p/7201099.html
Copyright © 2020-2023  润新知