如何仿造websocket请求?
之前两次singnalr、 websocket实时推送相关:
tag: 浏览器--->nginx--> server
其中提到nginx默认不会为客户端转发Upgrade
、Connection
标头, 因为为了让被代理的后端服务器知道客户端要升级协议,故要在nginx上显式转发标头:
location /realtime/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
事情本该就就这么简单, 但devops总会有各种奇怪的姿势。
小动作引起的头脑风暴
但是运维在给nginx配置的时候,给/
根路径配置了webcoket协议升级标头。
按照字面理解,导致所有的客户端转发请求都在要求切换到websocket协议,但是除了/chat路径, 服务器其他http路径并没有做websocket协议的逻辑,其他http请求是不是都该报错了。
是实际看,所有的请求(websocket、http)都没有报错,都按照指定预期返回。
刨一下
利用asp.netcore默认脚手架项目:
已知http://localhost:5000/WeatherForecast
是http请求,返回一大坨json数据;
在WeatherForecast
添加断言日志:
模拟ops的错配效果,我们给这个请求添加websocket协议升级标头。
第一次:curl 'http://localhost:5000/WeatherForecast' -H 'Upgrade: websocket' -H 'Connection: Upgrade' --verbose
,正常返回大坨json数据。
日志记录:
该请求是不是webcocket请求:False,headers:[Accept, */*], [Connection, Upgrade], [Host, localhost:5000], [User-Agent, curl/7.79.1], [Upgrade, websocket]
以上说明,服务端并不认为是websocket请求, 这也印证了ops虽然错配,但对于常规的http请求没造成影响。
那服务端到底是怎么认定websocket请求?
依次判断;
- HttpMethod: GET
- Sec-WebSocket-Version标头==13
- Connection标头==Upgrade
- Upgrade标头==websocket
- 有效的Sec-WebSocket-Key标头
这样我们就明白了,虽然websocket协议基于http,添加了httpConnection
、Upgrade
标头,但是浏览器实际会给我们带上Sec-WebSocket-Key
、Sec-WebSocket-Version
标头,以向服务器证明这是一个有效的websocket握手。
于是我们可以使用
curl 'http://localhost:5000/WeatherForecast' -H 'Upgrade: websocket' -H 'Connection: Upgrade' -H 'Sec-WebSocket-Version: 13' -H 'Sec-webSocket-Key: eeZn6lg/rOu8QbKwltqHDA==' --verbose
仿造客户端websocket请求。
日志记录:
该请求是不是webcocket请求:True,headers:[Accept, */*], [Connection, Upgrade], [Host, localhost:5000], [User-Agent, curl/7.79.1], [Upgrade, websocket], [Sec-WebSocket-Version, 13], [Sec-WebSocket-Key, eeZn6lg/rOu8QbKwltqHDA==]
对于这个websocket请求,服务端还是按照http代码逻辑返回200ok和JSON数据,从这个层面上看,http协议是兼容websocket的。
真正要让服务端按照websocket姿势, 要使用HttpContext.WebSockets.AcceptWebSocketAsync()
告知客户端开始切换协议,并在原tcp上发起全双工通信。
前后对比, 困惑得解: 虽然nginx为http请求转发了Connection
、Upgrade
标头, 但是服务器并不认可这是websocket升级协议,认为是携带了特殊标头的http请求,走原来的http业务处理逻辑是没有问题的。
总结
- 本文记录了nginx在转发websocket请求时要添加的配置
- websocket以http协议为蓝本,添加了特定的htp标头来要求切换协议;为了与常规http区分,浏览器自动增加了Sec-websocket-key等标头, 让服务端认为这是一个有效的websocket请求。
如何仿造websocket请求?的更多相关文章
- HttpLitener处理http请求和Websocket请求
HttpLitener处理http请求和Websocket请求的案例具体步骤如下 1.新建控制台项目TestClientWebsocket 2.选择项目右键添加类HttpAndWebsocket,代码 ...
- JAVA获得websocket请求路径前缀
/** * 获得websocket请求路径前缀(线程安全 速度相对慢) * @param request * @return */ public static String getWebsocketU ...
- 火币网API文档——Websocket 请求与订阅示例
1. 访问地址 Pro 站行情请求地址为:wss://api.huobipro.com/ws HADAX 站行情请求地址为:wss://api.hadax.com/ws 2. 数据压缩 WebSock ...
- WebSocket请求过程分析及实现Web聊天室
WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实现了浏览器与服务器全双工(full-duplex ...
- 用python实现websocket请求遇到的问题及解决方法。
想要实现python的ws库功能,实时获取对方服务器ws协议返回的数据,查了下百度,用如下流程: ws = create_connection("wss://ws.xxxxxxx.info/ ...
- Django配置websocket请求接口
1.settings.py INSTALLED_APPS = [ '...', 'channels', '...', ] ASGI_APPLICATION = 'server.routing.appl ...
- HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端
HTTPS请求HTTP接口被浏览器阻塞,python实现websocket客户端,websocket服务器,跨域问题,dwebsocket,https,拦截,服务端 发表时间:2020-03-05 1 ...
- WebSocket - ( 一.概述 )
说到 WebSocket,不得不提 HTML5,作为近年来Web技术领域最大的改进与变化,包含CSS3.离线与存储.多媒体.连接性( Connectivity )等一系列领域,而即将介绍的 WebSo ...
- 借助Nodejs探究WebSocket
文章导读: 一.概述-what's WebSocket? 二.运行在浏览器中的WebSocket客户端+使用ws模块搭建的简单服务器 三.Node中的WebSocket 四.socket.io 五.扩 ...
随机推荐
- 好客租房24-react中的事件处理(事件绑定)
3.1事件绑定 React事件绑定语法和DOM事件语法相似 语法:on+事件名称={事件处理程序} 比如οnclick={()=>{}} //导入react import React f ...
- 使用 oh-my-posh 美化 windows terminal,让其接近oh-my-zsh
本文旨在快速让你进行美化,少踩一些坑,原文出自我的博客:prettier-windows-terminal-with-oh-my-posh 为了同 iterm2 下的 oh-my-zsh 保持基本一致 ...
- 个人冲刺(五)——体温上报app(一阶段)
任务:完成了体温录入.体温记录删除.体温修改以及历史记录查询操作 体温录入 public void insertDB(View view) { MyDBHelper mydbh=new MyDBHel ...
- 【Unity Shader学习笔记】Unity光照基础-漫反射光照
本代码只适用于平行光. 1.逐顶点漫反射光照 1.1漫反射光照原理 1.2代码实现 在Properties语义块中声明一个漫反射颜色属性 Properties { //漫反射参数,用于调整漫反射效果 ...
- 【Java面试】什么是幂等?如何解决幂等性问题?
一个在传统行业工作了7年的粉丝私信我. 他最近去很多互联网公司面试,遇到的很多技术和概念都没听过. 其中就有一道题是:"什么是幂等.如何解决幂等性问题"? 他说,这个概念听都没听过 ...
- swap函数模板
在许多应用程序中,都有交换相同类型的两个变量内容的需要.例如,在对整数数组进行排序时,将需要一个函数来交换两个变量的值,如下所示: void swap(int &a, int &b) ...
- vue-cli2.x配置build命令构建测试包&正式包
项目开发中常分为开发环境.测试环境.正式环境 通过vue-cli或者@vue/cli脚手架搭建的项目默认提供了开发环境和正式环境的配置.可通过js获取当前域名或其他信息来判断当前为测试环境还是正式环境 ...
- 【Redis】客观下线
在sentinelHandleRedisInstance函数中,如果是主节点,需要做如下处理: void sentinelHandleRedisInstance(sentinelRedisInstan ...
- Java中Double类型数据比较大小
方法一:转成字符串之后比较 如果要比较的两个double数据的字符串精度相等,可以将数据转换成string然后借助string的equals方法来间接实现比较两个double数据是否相等.注意这种方法 ...
- ppt/word公式LaTeX环境配置
PPT使用Latex说明 一.下载IguanaTex_v1_57 http://www.jonathanleroux.org/software/iguanatex/download.html Inst ...