概述:

在上学的时候,以及在工作的这几年中,我一直错误了理解HTTP GET。

以前我的认知中认为GET/POST的区别在于:

1.GET长度限制

2.GET和POST的请求方式不一样(之前所理解的GET传参在URI中,POST是在DATA中)

...

问题:

最近刚好在使用openstack相关的security,其中API,请求类似如下:

curl  -H 'Content-Type: application/json'  
-X GET
--data '{"username":"foo","password":"bar"}'"http://www.a.com:1234/apiname" | jq .

curl指定GET请求,加了--data参数,也就是说GET请求发送data数据,

监听端口看看请求raw的样子 :

e.g.

和POST无外乎请求方式不一样,但是实际上的内容是一样的。

也就是说GET请求实际上也是可以带DATA来进行发送数据的。

在RFC GET请求中是这样说明的:

  The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI.

并没有说GET一定不能从data来发送数据。

BTW:

为什么大家都是GET URI传参,POST 使用data传参呢?

查了一些资料,目前总结2点是比较重要的:

1. 目前的类库,例如http requests,浏览器/服务器等GET就是通过URI传参,POST通过data,Postman插件的GET也是同理,默认已经达成默契,行业规范是这样做,GET不允许包含消息主体,POST可以。

但是我又这种需求,怎么解决:

Python requests包源码,requests.get跟进:

复用post函数代码,request第一个参数修改get即可。

2.在RCF设计HTTP 请求方式时,规定GET为取数据,POST为发送数据。只不过目前在开发设计中未真正遵循这个规范罢了。

如果非要在GET上加消息请求体,那么和POST又有什么区别了呢...

stackoverflow中有一个很正确的回答:(https://stackoverflow.com/questions/978061/http-get-with-request-body?answertab=active#tab-top)

Yes. In other words, any HTTP request message is allowed to contain a message body, and thus must parse messages with that in mind. Server semantics for GET,
however, are restricted such that a body, if any, has no semantic meaning to the request. The requirements on parsing are separate from the requirements on method semantics. So, yes, you can send a body with GET, and no, it is never useful to do so. This is part of the layered design of HTTP/1.1 that will become clear again once the spec is partitioned (work in progress). ....Roy

关于安全:

既然GET和POST实质上本质并不大,但是我相信国内安全厂商检测肯定是GET取URI的参数,POST取data的内容

例如:

中X菜刀估计国内外的WAF都有拦截。

如果菜刀发送的是GET,内容是在消息体,服务器上的shell接收的是GET,取得是GET中的data数据,那么WAF认为是GET,URI的特征取不到,会不会就绕过了呢?

再次理解HTTP GET协议的更多相关文章

  1. 再次理解HTTP请求过程[概念原理篇]

    我曾多次阅读http协议,但是理解依然不深,在此,再次阅读,再次理解.加深两点:解析头部信息\r\n,分解头部和主体用\r\n\r\n.之所以一次请求会看到网络里有很多请求,是因为浏览器代替访问了多次 ...

  2. 再次理解WCF以及其通信(附加一個編程小經驗)

    一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...

  3. 理解SSL/TLS协议

    理解SSL/TLS协议 背景 早期我们在访问web时使用HTTP协议,该协议在传输数据时使用明文传输,明文传输带来了以下风险: 1.信息窃听风险,第三方可以获取通信内容 2.信息篡改风险,第三方可以篡 ...

  4. http协议的再次理解

    1.Tomcat是根据server.xml的配置启动的.根目录下conf/server.xml. 2.Tomcat是根据server.xml的配置启动的.根目录下conf/server.xml. 3. ...

  5. 深入理解http/https协议

    深入理解HTTP协议(转) http协议学习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(Wo ...

  6. 深入浅出理解 TCP/IP 协议 (一)

    文章转自:https://www.cnblogs.com/onepixel/p/7092302.html TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入 ...

  7. 深入理解OAuth2.0协议

    1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...

  8. 帮你深入理解OAuth2.0协议

    1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...

  9. 我所理解的HTTP协议

    前言 对于HTTP协议,想必大家都不陌生,在工作中经常用到,特别是针对移动端和前端开发人员来说,要获取服务端数据,基本走的网络请求都是基于HTTP协议,特别是RESTFUL + JSON 这种搭配特别 ...

随机推荐

  1. SpringMVC札集(10)——SSM框架整合

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  2. Android程序员学WEB前端(1)-HTML(1)-标准结构常用标签-Sublime

    转载请注明出处:http://blog.csdn.net/iwanghang/article/details/76522043觉得博文有用,请点赞,请评论,请关注,谢谢!~ 8月份了,换工作有2个月了 ...

  3. Mac OS 升级到10.12问题 Android ADT 下载SDK问题 https://dl-ssl.google.com refused...

    缘由: 更新sdk,遇到了更新下载失败问题: Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml Fetch ...

  4. 快速生成树RTSP

    Note: 数据分组:

  5. U盘传送容量与格式问题

    问题 今天想将7.6G的文件拷到U盘里,提示u盘内存不足,其实内存为14+G. 解答 U盘格式对于U盘的传送大小有限制 下面为U盘三种不同格式的应用及优缺点 FAT32格式:为系统默认格式,具有极佳的 ...

  6. AngularX 指令(ngForof)(转载)

    该指令用于基于可迭代对象中的每一项创建相应的模板.每个实例化模板的上下文对象继承于外部的上下文对象,其值与可迭代对象对应项的值相关联. NgForOf 指令语法 * 语法糖 <li *ngFor ...

  7. Java 并发:volatile 关键字解析

    摘要: 在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性.可见性和有序性.只要有一条原则没有被保证,就有可能会导致程序运行不正确.volatile关键字 被用来保 ...

  8. PHP 读取和导出 CSV文件

    PHP 读取和导出 CSV文件,速度比phpexcel快80%,而phpexcel 占内存,在数据大的情况下,5万条只需几秒不到,几乎感觉不出来 如果遇到数字是科学计算法,可以在前面加一个 ' 单引号 ...

  9. ballerina 学习十一 Packages

    ballerina 的包还是比较简单的,实际上就是对于源码文件集合的管理,同时我们可以添加别名,同时可以进行 其他包的引用 import 简单例子 代码 import ballerina/math; ...

  10. Word动态替换文本

    public class WordTest2 { public static void main(String[] args) { /** 此Map存放动态替换的内容,key-Word中定义的变量,v ...