如何仿造一個websocket請求?

bbbf8ce7d92ca6aa402d74465bb2a68a.gif

之前兩次singnalr、 websocket實時推送相關:

  • ??.NET WebSockets 核心原理初體驗[1]

  • ??SignalR 從開發到生產部署避坑指南[2]

tag:瀏覽器--->nginx--> server

其中提到nginx默認不會為客戶端轉發UpgradeConnection標頭, 因為為了讓被代理的后端服務器知道客戶端要升級協議,故要在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請求是不是都該報錯了。

fb3a515115643b32cdfa2e5a6b829317.png

是實際看,所有的請求(websocket、http)都沒有報錯,都按照指定預期返回。

刨一下

利用asp.netcore默認腳手架項目:

已知http://localhost:5000/WeatherForecast是http請求,返回一大坨json數據;
WeatherForecast添加斷言日志:

0a4f3b3fa5ecd87f14bd1794b941aa0b.png

模擬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請求?

從服務端認定websocket請求的源碼[3]

b660b5aeb57f174e16b17896f41bb0f7.png

依次判斷;

  • ??HttpMethod: GET

  • ??Sec-WebSocket-Version標頭==13

  • ??Connection標頭==Upgrade

  • ??Upgrade標頭==websocket

  • ??有效的Sec-WebSocket-Key標頭

這樣我們就明白了,雖然websocket協議基于http,添加了httpConnectionUpgrade標頭,但是瀏覽器實際會給我們帶上Sec-WebSocket-Key[4]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()告知客戶端開始切換協議[5],并在原tcp上發起全雙工通信。

前后對比, 困惑得解:雖然nginx為http請求轉發了ConnectionUpgrade標頭, 但是服務器并不認可這是websocket升級協議,依舊當成帶了Connection和Upgrade特殊標頭的http協議,走原來的http業務處理邏輯是沒有問題的。

總結

  1. 1.?本文記錄了nginx在轉發websocket請求時要添加的配置

  2. 2. websocket以http協議為藍本,添加了特定的htp標頭來要求切換協議;為了與常規http區分,瀏覽器自動增加了Sec-websocket-key等標頭, 讓服務端認為這是一個有效的websocket請求。

引用鏈接

[1]?.NET WebSockets 核心原理初體驗:?https://www.cnblogs.com/JulianHuang/p/14681331.html
[2]?SignalR 從開發到生產部署避坑指南:?https://www.cnblogs.com/JulianHuang/p/15434137.html
[3]?服務端認定websocket請求的源碼:?https://github.com/dotnet/aspnetcore/blob/main/src/Middleware/WebSockets/src/WebSocketMiddleware.cs#L219
[4]?Sec-WebSocket-Key:?https://www.rfc-editor.org/rfc/rfc6455#section-11.3.1
[5]?開始切換協議:?https://github.com/dotnet/aspnetcore/blob/main/src/Middleware/WebSockets/src/WebSocketMiddleware.cs#L134

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/283920.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/283920.shtml
英文地址,請注明出處:http://en.pswp.cn/news/283920.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【轉】為什么自動車完全不可以犯錯誤

為什么自動車完全不可以犯錯誤 有人跟我講,我對Google的自動車要求太苛刻了。人無完人,所以Google的產品也不需要是完美的,只要“夠好用”就有市場。世界上有那么多糟糕的司機,酒后駕車的,開車時發短信的,打…

從“互聯網+教育”到“教育+互聯網”——互聯網文化基因視域下的審思

作者信息 朱敬/廣西師范大學教育學部教授,教育學博士,博士生導師; 蔡建東/河南大學教育學部教授,教育學博士。 本文摘要 近年來國務院與教育部文件逐漸使用“教育互聯網”一詞,從“互聯網教育”到“教育互聯網”&a…

Node.js Stream - 基礎篇

背景 在構建較復雜的系統時,通常將其拆解為功能獨立的若干部分。這些部分的接口遵循一定的規范,通過某種方式相連,以共同完成較復雜的任務。譬如,shell通過管道|連接各部分,其輸入輸出的規范是文本流。 在Node.js中&am…

Axure RP使用攻略--動態面板的用途(8)

寫了幾個Axure教程之后發現,可能教程的起點有些高了,過分的去講效果的實現,而忽略了axure功能以及基礎元件的使用,那么從這個教程開始,把這些逐漸的展開講解。 關于動態面板 動態面板是axure原型制作中使用非常頻繁的一…

ABP 6.0.0-rc.1的新特性

2022-07-26官方發布ABP 6.0.0-rc.1版本,本文挑選了幾個新特性進行了介紹,主要包括LeptonX Lite默認主題、OpenIddict模塊,以及如何將Identity Server遷移到OpenIddict。據ABP官方公眾號介紹,ABP 6.0.0穩定版的計劃發布日期為2022-…

Java并發包--線程池框架

轉載請注明出處:http://www.cnblogs.com/skywang12345/p/3509903.html 線程池架構圖 線程池的架構圖如下: 1. Executor 它是"執行者"接口,它是來執行任務的。準確的說,Executor提供了execute()接口來執行已提交的 Runna…

c 試水解碼jpeg圖片比特流(已成功解碼)

找到一張采用霍夫曼通用DC,AC編碼表的圖片,提取出此圖片的比特流準備對它解碼,再反推怎樣編碼。 下圖是此圖片比特流前100個字節。解碼是每次讀一字節,對這8比特解碼,如8比特不能解碼,再讀入一字節。因為霍夫曼表最多…

Raft算法詳解

Raft算法屬于Multi-Paxos算法,它是在Multi-Paxos思想的基礎上,做了一些簡化和限制,比如增加了日志必須是連續的,只支持領導者、跟隨者和候選人三種狀態,在理解和算法實現上都相對容易許多 從本質上說,Raft算…

淘寶彈性布局方案lib-flexible研究

1. lib-flexible不能與響應式布局兼容 先說說響應式布局的一些基本認識: 響應式布局的表現是:網頁通過css媒介查詢判斷可視區域的寬度,在不同的范圍應用不同的樣式,以便在不同尺寸的設備上呈現最佳的界面效果。典型的例子是&#…

[No0000DB]C# FtpClientHelper Ftp客戶端上傳下載重命名 類封裝

using System; using System.Diagnostics; using System.IO; using System.Text; using Shared;namespace Helpers {public static class FileHelper{#region Methods/// <summary>/// 向文本文件的尾部追加內容/// </summary>/// <param name"filePa…

WPF效果第一百九十四篇之伸縮面板

前面一篇玩耍了一下登錄實現效果;今天在原來的基礎上來玩耍一下伸縮面板的效果;閑話不多扯直接看效果:1、關于前臺簡單布局:2、左側面板伸縮動畫&#xff1a;<Storyboard x:Key"ShowConfigSb"><ThicknessAnimationUsingKeyFrames Storyboard.TargetProperty…

你不知道的JavaScript(二)

第三章 原生函數 JS有很多原生函數&#xff0c;為基本的數據類型值提供了封裝對象&#xff0c;String&#xff0c;Number&#xff0c;Boolean等。我們可以通過{}.call.toString()來查看所有typeof返回object的對象的內置屬性[[class]],這個屬性無法直接訪問。我們基本類型調用的…

[轉]guava快速入門

Guava工程包含了若干被Google的 Java項目廣泛依賴 的核心庫&#xff0c;例如&#xff1a;集合 [collections] 、緩存 [caching] 、原生類型支持 [primitives support] 、并發庫 [concurrency libraries] 、通用注解 [common annotations] 、字符串處理 [string processing] 、I…

數據庫編程1 Oracle 過濾 函數 分組 外連接 自連接

【本文謝絕轉載原文來自http://990487026.blog.51cto.com】<大綱>數據庫編程1 Oracle 過濾 函數 分組 外連接 自連接本文實驗基于的數據表:winsows安裝好Oracle11g之后,開始實驗SQLplus 登陸 ORaclesqlplus 退出的方式查看用戶之下有什么表查看表的所有記錄&#xff0c;不…

【.NET 6】開發minimal api以及依賴注入的實現和代碼演示

前言&#xff1a;.net 6 LTS版本發布已經有一段時間了。此處做一個關于使用.net 6 開發精簡版webapi&#xff08;minimal api&#xff09;的入門教程演示。1、新建一個項目。此處就命名為 SomeExample:2、選擇 .net6版本&#xff0c;并且此處先去掉HTTPS配置以及去掉使用控制器…

(轉載)VS2010/MFC編程入門之四(MFC應用程序框架分析)

上一講雞啄米講的是VS2010應用程序工程中文件的組成結構&#xff0c;可能大家對工程的運行原理還是很模糊&#xff0c;理不出頭緒&#xff0c;畢竟跟C編程入門系列中的例程差別太大。這一節雞啄米就為大家分析下MFC應用程序框架的運行流程。 一.SDK應用程序與MFC應用程序運行過…

個人博客開發-開篇

邁出第一步&#xff1a; 很久以前就有這個想法&#xff0c;自己動手開發一套個人博客系統&#xff0c;終于&#xff0c;現在開始邁出了第一步。做這件事一點是做一個有個人風格的博客系統&#xff0c;第二點是對做這件事所使用的技術棧進行學習&#xff0c;所謂最好的學習就是實…

2022年中國中小學教育信息化行業研究報告

教育信息化丨研究報告 核心摘要&#xff1a; 背景篇 目前&#xff0c;我國中小學教育主要呈現信息時代教育的特征&#xff0c;智能時代教育特征初露端倪&#xff1b;中小學教育信息化正從量變邁向質變&#xff0c;創新引領與生態變革成為行業縱深的主旋律&#xff1b; 2021年…

使用curl指令發起websocket請求

昨日的文章沒指出websocket請求協商切換的精髓&#xff0c;刪除重發。前文相關&#xff1a;? .NET WebSockets 核心原理初體驗[1]? SignalR 從開發到生產部署避坑指南[2]tag&#xff1a;瀏覽器--->nginx--> server其中提到nginx默認不會為客戶端轉發Upgrade、Connectio…

Yii 2 的安裝 之 踩坑歷程

由于剛接觸yii2 ,決定先裝個試試&#xff1b;可是這一路安裝差點整吐血&#xff0c;可能還是水平有限吧&#xff0c; 但還是想把這個過程分享出來&#xff0c;讓遇到同樣問題的同學有個小小的參考&#xff0c;好了言歸正傳&#xff01;&#xff01; <(~.~)> 下面是安裝流…