記錄--post為什麼會發送兩次請求?

来源:https://www.cnblogs.com/smileZAZ/archive/2023/08/22/17649359.html
-Advertisement-
Play Games

這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 在前段時間的一次面試中,被問到了一個如標題這樣的問題。要想好好地去回答這個問題,這裡牽扯到的知識點也是比較多的。 那麼接下來這篇文章我們就一點一點開始引出這個問題。 同源策略 在瀏覽器中,內容是很開放的,任何資源都可以接入其中,如 Jav ...


這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助

在前段時間的一次面試中,被問到了一個如標題這樣的問題。要想好好地去回答這個問題,這裡牽扯到的知識點也是比較多的。

那麼接下來這篇文章我們就一點一點開始引出這個問題。

同源策略

在瀏覽器中,內容是很開放的,任何資源都可以接入其中,如 JavaScript 文件、圖片、音頻 / 視頻等資源,甚至可以下載其他站點的可執行文件。

但也不是說瀏覽器就是完全自由的,如果不加以控制,就會出現一些不可控的局面,例如會出現一些安全問題,如:

  • 跨站腳本攻擊(XSS)
  • SQL 註入攻擊
  • OS 命令註入攻擊
  • HTTP 首部註入攻擊
  • 跨站點請求偽造(CSRF)
  • 等等......

如果這些都沒有限制的話,對於我們用戶惡言,是相對危險的,因此需要一些安全策略來保障我們的隱私和數據安全。

這就引出了最基礎、最核心的安全策略:同源策略。

什麼是同源策略

同源策略是一個重要的安全策略,它用於限制一個源的文檔或者它載入的腳本如何能與另一個源的資源進行交互。

如果兩個 URL 的協議、主機和埠都相同,我們就稱這兩個 URL 同源。

  • 協議:協議是定義了數據如何在電腦內和之間進行交換的規則的系統,例如 HTTP、HTTPS。
  • 主機:是已連接到一個電腦網路的一臺電子電腦或其他設備。網路主機可以向網路上的用戶或其他節點提供信息資源、服務和應用。使用 TCP/IP 協議族參與網路的電腦也可稱為 IP 主機。
  • 埠:主機是電腦到電腦之間的通信,那麼埠就是進程到進程之間的通信。

如下表給出了與 URL http://store.company.com:80/dir/page.html 的源進行對比的示例:

URL結果原因
http://store.company.com:80/dir/page.html 同源 只有路徑不同
http://store.company.com:80/dir/inner/another.html 同源 只有路徑不同
https://store.company.com:80/secure.html 不同源 協議不同,HTTP 和 HTTPS
http://store.company.com:81/dir/etc.html 不同源 埠不同
http://news.company.com:80/dir/other.html 不同源 主機不同

同源策略主要表現在以下三個方面:DOM、Web 數據和網路。

  • DOM 訪問限制:同源策略限制了網頁腳本(如 JavaScript)訪問其他源的 DOM。這意味著通過腳本無法直接訪問跨源頁面的 DOM 元素、屬性或方法。這是為了防止惡意網站從其他網站竊取敏感信息。
  • Web 數據限制:同源策略也限制了從其他源載入的 Web 數據(例如 XMLHttpRequest 或 Fetch API)。在同源策略下,XMLHttpRequest 或 Fetch 請求只能發送到與當前網頁具有相同源的目標。這有助於防止跨站點請求偽造(CSRF)等攻擊。
  • 網路通信限制:同源策略還限制了跨源的網路通信。瀏覽器會阻止從一個源發出的請求獲取來自其他源的響應。這樣做是為了確保只有受信任的源能夠與伺服器進行通信,以避免惡意行為。

出於安全原因,瀏覽器限制從腳本內發起的跨源 HTTP 請求,XMLHttpRequest 和 Fetch API,只能從載入應用程式的同一個域請求 HTTP 資源,除非使用 CORS 頭文件

CORS

對於瀏覽器限制這個詞,要著重解釋一下:不一定是瀏覽器限制了發起跨站請求,也可能是跨站請求可以正常發起,但是返回結果被瀏覽器攔截了。

例如,一個網頁可能通過 AJAX 請求從另一個域的伺服器獲取數據。雖然某些情況下這樣的請求可能會成功,但如果瀏覽器檢測到請求返回的數據可能包含惡意代碼或與同源策略衝突,瀏覽器可能會阻止網頁訪問返回的數據,以確保用戶的安全。

跨源資源共用(Cross-Origin Resource Sharing,CORS)是一種機制,允許在受控的條件下,不同源的網頁能夠請求和共用資源。由於瀏覽器的同源策略限制了跨域請求,CORS 提供了一種方式來解決在 Web 應用中進行跨域數據交換的問題。

CORS 的基本思想是,伺服器在響應中提供一個標頭(HTTP 頭),指示哪些源被允許訪問資源。瀏覽器在發起跨域請求時會先發送一個預檢請求(OPTIONS 請求)到伺服器,伺服器通過設置適當的 CORS 標頭來指定是否允許跨域請求,並指定允許的請求源、方法、標頭等信息。

簡單請求

不會觸發 CORS 預檢請求。這樣的請求為 簡單請求,。若請求滿足所有下述條件,則該請求可視為 簡單請求

  1. HTTP 方法限制:只能使用 GET、HEAD、POST 這三種 HTTP 方法之一。如果請求使用了其他 HTTP 方法,就不再被視為簡單請求。
  2. 自定義標頭限制:請求的 HTTP 標頭只能是以下幾種常見的標頭:AcceptAccept-LanguageContent-LanguageLast-Event-IDContent-Type(僅限於 application/x-www-form-urlencodedmultipart/form-datatext/plain)。HTML 頭部 header field 欄位:DPR、Download、Save-Data、Viewport-Width、WIdth。如果請求使用了其他標頭,同樣不再被視為簡單請求。
  3. 請求中沒有使用 ReadableStream 對象。
  4. 不使用自定義請求標頭:請求不能包含用戶自定義的標頭。
  5. 請求中的任意 XMLHttpRequestUpload 對象均沒有註冊任何事件監聽器;XMLHttpRequestUpload 對象可以使用 XMLHttpRequest.upload 屬性訪問

預檢請求

非簡單請求的 CORS 請求,會在正式通信之前,增加一次 HTTP 查詢請求,稱為 預檢請求

需預檢的請求要求必須首先使用 OPTIONS 方法發起一個預檢請求到伺服器,以獲知伺服器是否允許該實際請求。預檢請求 的使用,可以避免跨域請求對伺服器的用戶數據產生未預期的影響。

例如我們在掘金上刪除一條沸點:

它首先會發起一個預檢請求,預檢請求的頭信息包括兩個特殊欄位:

  • Access-Control-Request-Method:該欄位是必須的,用來列出瀏覽器的 CORS 請求會用到哪些 HTTP 方法,上例是 POST。
  • Access-Control-Request-Headers:該欄位是一個逗號分隔的字元串,指定瀏覽器 CORS 請求會額外發送的頭信息欄位,上例是 content-type,x-secsdk-csrf-token
  • access-control-allow-origin:在上述例子中,表示 https://juejin.cn 可以請求數據,也可以設置為* 符號,表示統一任意跨源請求。
  • access-control-max-age:該欄位可選,用來指定本次預檢請求的有效期,單位為秒。上面結果中,有效期是 1 天(86408 秒),即允許緩存該條回應 1 天(86408 秒),在此期間,不用發出另一條預檢請求。

一旦伺服器通過了 預檢請求,以後每次瀏覽器正常的 CORS 請求,就都跟簡單請求一樣,會有一個 Origin 頭信息欄位。伺服器的回應,也都會有一個 Access-Control-Allow-Origin 頭信息欄位。

上面頭信息中,Access-Control-Allow-Origin 欄位是每次回應都必定包含的。

附帶身份憑證的請求與通配符

在響應附帶身份憑證的請求時:

  • 伺服器不能將 Access-Control-Allow-Origin 的值設為通配符 *,而應將其設置為特定的域,如:Access-Control-Allow-Origin: https://example.com
  • 伺服器不能將 Access-Control-Allow-Headers 的值設為通配符 *,而應將其設置為標頭名稱的列表,如:Access-Control-Allow-Headers: X-PINGOTHER, Content-Type。
  • 伺服器不能將 Access-Control-Allow-Methods 的值設為通配符 *,而應將其設置為特定請求方法名稱的列表,如:Access-Control-Allow-Methods: POST, GET。
  • 對於附帶身份憑證的請求(通常是 Cookie),

這是因為請求的標頭中攜帶了 Cookie 信息,如果 Access-Control-Allow-Origin 的值為 *,請求將會失敗。而將 Access-Control-Allow-Origin 的值設置為 https://example.com,則請求將成功執行。

另外,響應標頭中也攜帶了 Set-Cookie 欄位,嘗試對 Cookie 進行修改。如果操作失敗,將會拋出異常。

參考文章

總結

預檢請求是在進行跨域資源共用 CORS 時,由瀏覽器自動發起的一種 OPTIONS 請求。它的存在是為了保障安全,並允許伺服器決定是否允許跨域請求。

跨域請求是指在瀏覽器中向不同功能變數名稱、不同埠或不同協議的資源發送請求。出於安全原因,瀏覽器預設禁止跨域請求,只允許同源策略。而當網頁需要進行跨域請求時,瀏覽器會自動發送一個預檢請求,以確定是否伺服器允許實際的跨域請求。

預檢請求中包含了一些額外的頭部信息,如 Origin 和 Access-Control-Request-Method 等,用於告知伺服器實際請求的方法和來源。伺服器收到預檢請求後,可以根據這些頭部信息,進行驗證和授權判斷。如果伺服器認可該跨域請求,將返回一個包含 Access-Control-Allow-Origin 等頭部信息的響應,瀏覽器才會繼續發送實際的跨域請求。

使用預檢請求機制可以有效地防範跨域請求帶來的安全風險,保護用戶數據和隱私。

整個完整的請求流程有如下圖所示:

本文轉載於:

https://juejin.cn/post/7269952188927017015

如果對您有所幫助,歡迎您點個關註,我會定時更新技術文檔,大家一起討論學習,一起進步。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 中台框架後端項目 Admin.Core 的介紹與配置說明 > 中台admin是前後端分離許可權管理系統,Admin.Core為後端項目,基於.NET 7.0開發。 > 支持多租戶、數據許可權、動態 Api、任務調度、OSS 文件上傳、滑塊拼圖驗證、多資料庫,分散式緩存、分散式事務等 - 介面文檔一 ...
  • [toc] # 模擬Linux文件管理員系統-shell實現 **註:此腳本僅供學習使用,具體需要根據實際情況進行測試調整。** ## 1 系統要求 ![](https://img2023.cnblogs.com/blog/3262925/202308/3262925-202308211934402 ...
  • 1、LDAP介紹 LDAP是一個基於X.500標準的輕量目錄訪問協議,與X.500不同,LDAP協議支持TCP/IP連接。全稱為Lightweight Directory Access Protocol(輕量目錄訪問協議),是用戶、設備和客戶端與目錄伺服器通信的標準協議。LDAP協議幫助用戶對IT資 ...
  • Shell編程是一種在命令行環境中編寫程式的技術,常用於Linux和Unix系統。它主要使用Shell腳本語言來編寫程式。Shell編程常用於系統管理、自動化任務、批處理等領域。 常用的Shell腳本語言包括Bash、Csh、Tcsh和Zsh等。Bash是最常用的Shell編程語言,它是大多數Li... ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230821150719320-729006736.png) # 1. 創建數據表 ## 1.1. sql ```sql CREATE TABLE person (person ...
  • 當使用了多個資料庫來提供服務時,最為關鍵的點是如何讓每一個資料庫比較均勻的承擔壓力,而不至於其中的某些資料庫壓力過大,某些資料庫沒什麼壓力。這其中的關鍵點之一就是拆分鍵的設計 ...
  • 近日,第14屆中國資料庫技術大會(DTCC2023)在北京國際會議中心順利舉行。大會以“數智賦能 共築未來”為主題,邀請了上百位行業專家,一起探討新時代下各類型資料庫的最新動態和應用實踐,帶來一場資料庫領域的年度盛宴。在上午的主會場,華為雲資料庫服務產品部總經理蘇光牛圍繞“打造最可信資料庫,華為雲G ...
  • MySQL服務端配置對使用方來說是不可更改的,需要聯繫DBA進行操作。這些配置操作對我們來說是一個黑盒,但是瞭解核心配置可以幫助我們快速定位資料庫問題原因。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...