再次理解HTTP GET协议
概述:
在上学的时候,以及在工作的这几年中,我一直错误了理解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协议的更多相关文章
- 再次理解HTTP请求过程[概念原理篇]
我曾多次阅读http协议,但是理解依然不深,在此,再次阅读,再次理解.加深两点:解析头部信息\r\n,分解头部和主体用\r\n\r\n.之所以一次请求会看到网络里有很多请求,是因为浏览器代替访问了多次 ...
- 再次理解WCF以及其通信(附加一個編程小經驗)
一.概述 Windows Communication Foundation(WCF)是由微软发展的一组数据通信的应用程序开发接口,可以翻译为Windows通讯接口,它是.NET框架的一部分.由 .NE ...
- 理解SSL/TLS协议
理解SSL/TLS协议 背景 早期我们在访问web时使用HTTP协议,该协议在传输数据时使用明文传输,明文传输带来了以下风险: 1.信息窃听风险,第三方可以获取通信内容 2.信息篡改风险,第三方可以篡 ...
- http协议的再次理解
1.Tomcat是根据server.xml的配置启动的.根目录下conf/server.xml. 2.Tomcat是根据server.xml的配置启动的.根目录下conf/server.xml. 3. ...
- 深入理解http/https协议
深入理解HTTP协议(转) http协议学习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(Wo ...
- 深入浅出理解 TCP/IP 协议 (一)
文章转自:https://www.cnblogs.com/onepixel/p/7092302.html TCP/IP 协议栈是一系列网络协议的总和,是构成网络通信的核心骨架,它定义了电子设备如何连入 ...
- 深入理解OAuth2.0协议
1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...
- 帮你深入理解OAuth2.0协议
1. 引言 如果你开车去酒店赴宴,你经常会苦于找不到停车位而耽误很多时间.是否有好办法可以避免这个问题呢?有的,听说有一些豪车的车主就不担心这个问题.豪车一般配备两种钥匙:主钥匙和泊车钥匙.当你到酒店 ...
- 我所理解的HTTP协议
前言 对于HTTP协议,想必大家都不陌生,在工作中经常用到,特别是针对移动端和前端开发人员来说,要获取服务端数据,基本走的网络请求都是基于HTTP协议,特别是RESTFUL + JSON 这种搭配特别 ...
随机推荐
- TF随笔-11
#!/usr/bin/env python2 # -*- coding: utf-8 -*- import tensorflow as tf my_var=tf.Variable(0.) step=t ...
- loadrunner11 中文破解版安装教程
loadrunner11的安装:http://pan.baidu.com/share/link?shareid=316642707&uk=1395568298 汉化包(下载之后有可能是ISO格 ...
- keras 报错 ValueError: Tensor conversion requested dtype int32 for Tensor with dtype float32: 'Tensor("embedding_1/random_uniform:0", shape=(5001, 128), dtype=float32)'
在服务器上训练并保存模型,复制到本地之后load_model()报错: ValueError: Tensor conversion requested dtype int32 for Tensor w ...
- caffe学习4——net
参考文献 1 The net jointly defines a function and its gradient by composition and auto-differentiation. ...
- WPF 中使用附加属性,将任意 UI 元素或控件裁剪成圆形(椭圆)
不知从什么时候开始,头像流行使用圆形了,于是各个平台开始追逐显示圆形裁剪图像的技术.WPF 作为一个优秀的 UI 框架,当然有其内建的机制支持这种圆形裁剪. 不过,内建的机制仅支持画刷,而如果被裁剪的 ...
- 深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分)
深耕 WPF 开发的各位程序员大大们一定避不开使用 Dispatcher.跨线程访问 UI 当然免不了用到它,将某个任务延迟到当前任务之后执行也会用到它.Dispatcher.Invoke.Dispa ...
- 携程阿波罗(Apollo)配置中心
携程阿波罗(Apollo) https://www.cnblogs.com/xiaxiaolu/p/10025597.html 一.瞎扯点什么 1.1 阿波罗 阿波罗是希腊神话中的光明之神.文艺之 ...
- WebLogic11g-常用运维操作
转:http://www.codeweblog.com/weblogic11g-%e5%b8%b8%e7%94%a8%e8%bf%90%e7%bb%b4%e6%93%8d%e4%bd%9c/ 希望这篇 ...
- JavaScript年月日和时间戳互转
/** 一丶将日期单位转为时间戳 / 毫秒 **/ var str="2017年06月2日" var time = str.replace(/年/i,"-"). ...
- 【加密算法】PFX文件提取公钥私钥
方法1: 原版PFX证书 openssl pkcs12 -in myssl.pfx -nodes -out server.pem 提取私钥 openssl rsa -in server.pem -ou ...