同源ip訪問
1. 瀏覽器同源策略
所謂同源是指"協議+域名+埠"三者相同,即便兩個不同的域名指向同一個 ip 地址,也非同源。同源策略/SOP(Same origin policy)是一種約定,由 Netscape 公司 1995 年引入瀏覽器,它是瀏覽器最核心也最基本的安全功能,現在所有支持 javaScript 的瀏覽器都會使用這個策略。如果缺少了同源策略,瀏覽器很容易受到 XSS、 CSFR 等攻擊。
(1)、比如一個web應用,用戶訪問的頁面,處理頁面的請求的controller都是在同一個contextPath下的,無論在頁面上請求AController還是BController,頁面、A、B都是同源的,所處的空間位於同一個contextPath下。
(2)、 同源策略是為了安全,確保一個應用中的資源只能被本應用的資源訪問。否則,豈不是誰都能訪問。
2. Cookie 的同源和同站
原文地址: https://alphahinex.github.io/2021/05/30/same-origin-and-same-site-of-cookie/
description: "Cookie 中的同源,等價於同站?!"
date: 2021.05.30 10:34
categories:
- Web
tags: [Web, HTML]
keywords: origin, site, same origin, cross origin, same site, corss site, CSRF, SOP, port, cookie
存儲在瀏覽器中的數據,如 localStorage 和 IndexedDB ,是以 源(origin) 進行分割的。每個源都擁有自己單獨的存儲空間,一個源中的 JavaScript 腳本不能對屬於其它源的數據進行讀寫操作,即所謂的 同源策略(SOP) 。
然而 Cookie 在受同源策略約束時,使用不同的源的定義方式。
通常來講:
而根據 Cookie 的現行標准規范 HTTP State Management Mechanism (rfc6265) :
即,相同 host,不同埠的服務之間,cookie 是可以共享的!
另外:
由上可知,Cookie 不提供根據 scheme 和 port 的隔離性,也就是說:
Cookie 中同源的定義,等價於不考慮 scheme 的同站(schemelessly same site)定義!
默認情況下,Cookie 可以在 eTLD + 1 相同的站點間進行共享!
另外,服務端可以通過響應的 Set-Cookie Header,對 Cookie 的可用性進行設定,相關的屬性包括 Domain 、 Path 、 Secure 等。
比如通過 Path 屬性,可以指定允許獲得 Cookie 的 URL 路徑前綴。
現行的 rfc6265 標準是 2011 年 4 月開始實行的,在後續的 rfc6265bis 提案的 02 版本中,在 Set-Cookie 的響應頭中增加了 SameSite 屬性,用來約束對 Cookie 的跨站訪問行為,以提升安全性,降低 CSRF 攻擊的風險。
該提案的最新版本為 draft-ietf-httpbis-rfc6265bis-07 (將於 2021 年 6 月 10 日到期),此版本中 SameSite 屬性有三個值:
在此版本提案中,對於同站的定義增加了 scheme 部分,即與最新的 HTML 標准一致: scheme 和 eTLD + 1 同時相同,才能夠認為是同站(same site)。
3. 電信網路裡面常講的『同源同宿』是什麼概念
一般高速網路數據分析系統都是採用多核伺服器,每個cpu核心上會運行一個進程(或線程)並行處理,目前的系統都是由軟體把網卡收到的流量分發到每個CPU核心上的報文緩沖區,分發過程中,要求同一個連接的雙向數據要分到同一個進程中,這就是同源同宿。在一些復雜的應用環境中,同源同宿的要求也會很復雜,可以不是對單個連接的,而是對一個網段的,也就是說,要求把某個網段的所有的數據分流到1個進程。專利號為「200910136299.
2」、發明名稱為「一種格狀網中非同源同宿主備業務資源分離的方法」公開了一種格狀網中非同源同宿主備業務資源分離的方法,其步驟為1.源節點的業務管理模塊接收到第一業務的建立請求,觸發路由計算模塊計算路由,信令控制模塊開始建立第一業務;2.路由泛洪模塊完成資源標識信息更新;3.源節點的業務管理模塊接收第二業務的建立請求,觸發路由計算模塊根據主備業務資源分離策略進行路由計算;4.信令控制模塊開始建立第二業務;5.路由泛洪模塊完成資源標識信息更新。本發明所述方法,能處理主備不同源但同宿、主備同源不同宿、主備不同源也不同宿三種情況下的主備業務資源分離,而且可以應用於格狀網和環網組網共同組成的網路中,也可以用於格狀網單獨組成的網路中,方法可靠性高、穩定性好。專利號為「CN200610086536.5」、發明名稱為「一種負載分流方法和裝置」公開了
一種負載分流方法,包括在互相重疊的各小區所屬的基站之間建立同步;基站檢測到自身小區當前的信道無法滿足負載要求,向與該小區重疊的小區的基站請求空閑信道,並將各小區的基站返回的空閑信道標識發送給各分流用戶設備。本發明同時公開了一種負載分流裝置,包括同步建立模塊,負載檢測模塊,分流負載小區確定模塊和負載分流模塊。本發明解決了無線通信系統中的小區負載過大而造成的頻譜資源緊缺的問題;且本發明可根據各互相重疊的小區的空閑信道情況,靈活選擇分流負載小區,合理利用了頻譜資源,且不需要增加額外開銷。另外,分流用戶設備在與新小區建立連接之前,會一直保持與原小區的連接,保證了用戶設備的業務服務質量。實現同源同宿的方法一般是把報文的源ip和目的ip做對稱的位運算,在進行復雜的同源同宿計算時,因為網段的掩碼可以非常靈活,一般是在軟體中實現的,軟體對每一個報文,提取出ip後,根據同源同宿要求,對ip進行掩碼運算後做位運算,得到報文應該分發到的進程號。在高速網路上,軟體對每個報文的同源同宿計算,往往成為系統的瓶頸。
4. 同源策略與跨域問題解決
如果兩個頁面的協議,埠(如果有指定)和域名都相同,則兩個頁面具有相同的 源 。
舉個例子:
下表給出了相對 http://a.bbb.com/dir/page.html 同源檢測的示例:
由同源策略導致的的AJAX請求失敗
例如:頁面路徑為: http://127.0.0.1:8848/fileTest/test.html
後台介面地址為: http://localhost:8080/sayHello
產生的結果:
此即為跨域請求失敗
CORS是一個W3C標准,全稱是"跨域資源共享"(Cross-origin resource sharing)。它允許瀏覽器向跨源伺服器,發出 XMLHttpRequest 請求,從而克服了AJAX只能 同源 使用的限制。
在此之前,需要知道 簡單請求、復雜請求
簡單請求:
某些請求不會觸發 CORS 預檢請求 。本文稱這樣的請求為「簡單請求」,請注意,該術語並不屬於 Fetch (其中定義了 CORS)規范。若請求滿足所有下述條件,則該請求可視為「簡單請求」:
復雜請求:
與前述簡單請求不同,「需預檢的請求」要求必須首先使用 OPTIONS 方法發起一個預檢請求到伺服器,以獲知伺服器是否允許該實際請求。"預檢請求「的使用,可以避免跨域請求對伺服器的用戶數據產生未預期的影響。當請求滿足下述任一條件時,即應首先發送預檢請求:
若需要跨域,則需要在請求頭里添加 Origin 欄位
請求至後台若符合後台請求規則則可成功請求,並且後台會返回相應的規則
當請求為復雜請求時,瀏覽器會在請求前先發送一個 OPTIONS 請求
OPTIONS 是一個預檢請求,與簡單請求不同的是它會額外攜帶兩個參數: Access-Control-Request-Method :該次請求的請求方式 Access-Control-Request-Headers :該次請求的自定義請求頭欄位
OPTIONS 發送至後台若後台成功響應,則繼續發送復雜請求,若響應失敗則不會發送復雜請求
繼續發送復雜請求
(1)、OPTIONS不會攜帶body若後台方法上使用@RequestBody註解,則會報錯:
例如:
此時需要在@RequestBody後添加參數required=false,允許body為空
即可解決該問題
(2)、OPTIONS請求不應被過多的發送,因為它也是一個http請求也會佔用一部分資源,相應的一種解決方法
在響應中添加緩存欄位,以減少OPTIONS請求
(1)、在Java web工程中加如下列過濾器即可
(2)、在nginx中配置
使用反向代理工具解決跨域問題:如 Nginx 、 node.js
以Nginx為例:
在Nginx的配置文件中加入:
啟動Nginx再以
http://127.0.0.1/fileTest/test.html 地址訪問頁面
http://127.0.0.1/sayHello 訪問後台介面
發現可正常請求
上述以
http://127.0.0.1/fileTest/test.html 地址訪問頁面
http://127.0.0.1/sayHello 訪問後台介面
的方式遵循了,瀏覽器的同源策略自然不存在跨域
Nginx代理了頁面請求和介面請求,所以頁面請求和介面請求都在Nginx源內由Nginx去完成頁面請求和介面的請求即: http://127.0.0.1:80 內
所以瀏覽器訪問頁面和介面都是以 http://127.0.0.1:80 來進行訪問的,滿足了同源策略自然不存在跨域之說
圖解:
跨域:
Nginx代理,滿足同源策略
Nginx反向代理其實是一種欺騙瀏覽器的方法
[1] http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html 瀏覽器同源政策及其規避方法
[2] http://www.ruanyifeng.com/blog/2012/09/xmlhttprequest_level_2.html XMLHttpRequest Level 2 使用指南
[3] http://www.ruanyifeng.com/blog/2016/04/cors.html 跨域資源共享 CORS 詳解
[4] https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS HTTP訪問控制(CORS)
5. 跨域以及解決跨域的幾種方式
跨域是指瀏覽器允許向伺服器發送跨域請求,從而克服Ajax只能 同源 使用的限制。
同源策略 是一種約定,由Netscape公司1995年引入瀏覽器,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,瀏覽器很容易受到XSS、CSFR等攻擊。所謂同源是指"協議 + 域名 + 埠"三者相同,即便兩個不同的域名指向同一個ip地址,也非同源。
常見的跨域場景:
對於簡單請求,瀏覽器會直接發出CORS請求,具體的就是在頭信息中,增加一個 Origin 欄位。
非簡單請求是那種對伺服器有特殊要求的請求,譬如 put delete 方法,或者 Content-Type 欄位類型是 application/json 的,非簡單請求在正式通信前,會增加一次請求,稱為預檢請求,也就是 options 方法。
瀏覽器先詢問伺服器,當前網頁所在的域名是否在伺服器的許可名單之中,以及可以使用哪些HTTP動詞和頭信息欄位。只有得到肯定答復,瀏覽器才會發出正式的 XMLHttpRequest 請求,否則就報錯。
與簡單請求不同的是, option 請求多了2個欄位:
Access-Control-Request-Method :必須欄位,用來列出瀏覽器的CORS請求會用到哪些HTTP方法。
Access-Control-Request-Headers :該欄位是一個逗號分隔的字元串,指定瀏覽器CORS請求會額外發送的頭信息欄位。
伺服器收到"預檢"請求以後,檢查了 Origin 、 Access-Control-Request-Method 和 Access-Control-Request-Headers 欄位以後,確認允許跨源請求,就可以做出回應。
表明伺服器支持的所有跨域請求的方法。
表明伺服器支持的所有頭信息欄位,不限於瀏覽器在"預檢"中請求的欄位。
表示是否允許發送認證信息(Cookie)。
指定本次預檢請求的有效期,單位為秒,允許緩存。在緩存期間,不用發出另一條預檢請求。
6. 什麼是同源策略如何解決跨域
此時,客戶端會出現跨域問題,同源策略是指一段腳本只能讀取來自同一來源的窗口和文檔的屬性、協議和埠號的組合.
跨域問題是由於javascript語言安全限制中的同源策略造成的.
簡單來說,這里的同一來源指的是主機名1.什麼是跨域
經常會在頁面上使用ajax請求訪問其他伺服器的數據
7. Nginx的反向代理跨域
什麼是跨域?
跨域是指a頁面想獲取b頁面資源,如果a、b頁面的協議、域名、埠、子域名不同,或是a頁面為ip地址, b頁面為域名地址,所進行的訪問行動都是跨域
瀏覽器為了安全問題一般都限制了跨域訪問,也就是不允許跨域請求資源
同ip(或domain),同埠,同協議視為同一個域,一個域內的腳本僅僅具有本域內的許可權,可以理解為本域腳本只能讀寫 本域內的資源,而無法訪問其它域的資源。這種安全限制稱為同源策略
現代瀏覽器在安全性和可用性之間選擇了一個平衡點。 在遵循同源策略的基礎上,選擇性地為同源策略「開放了後門」。例如img script style等標簽,都允許垮域引用資源,然而, 你也只能是引用這些資源而已,並不能讀取這些資源的內容
同源策略限制以下幾種行為:
1.Cookie、LocalStorage 和 IndexDB 無法讀取
2.DOM 和 Js對象無法獲得
3.AJAX 請求不能發送
http://www.domain.com/a.jshttp://www.domain.com/b.js 同一域名,不同文件或路徑 允許http://www.domain.com/lab/c.jshttp://www.domain.com:8000/a.jshttp://www.domain.com/b.js 同一域名,不同埠 不允許http://www.domain.com/a.jshttps://www.domain.com/b.js 同一域名,不同協議 不允許http://www.domain.com/a.jshttp://192.168.4.12/b.js 域名和域名對應相同ip 不允許http://www.domain.com/a.jshttp://x.domain.com/b.js 主域相同,子域不同 不允許http://domain.com/c.jshttp://www.domain1.com/a.jshttp://www.domain2.com/b.js 不同域名 不允許
1、 通過jsonp跨域
2、 document.domain + iframe跨域
3、 location.hash + iframe
4、 window.name + iframe跨域
5、 postMessage跨域
6、 跨域資源共享(CORS)
7、 nginx代理跨域
8、 nodejs中間件代理跨域
9、 WebSocket協議跨域
正向代理 :代理位於網站和客戶端中間, 客戶端無法訪問某網站,就將請求發送給代理伺服器,代理從網站取回來再發送給客戶端,網站並不知道為誰提供服務
反向代理 :客戶端訪問某網站的一個頁面, 但是網站並沒有,就偷偷從另外一台伺服器上取回來,然後作為自己的內容吐給用戶,用戶不知道真正提供服務的是誰
對於瀏覽器來說,訪問的就是同源伺服器上的一個url。而nginx通過 檢測url前綴,把http請求轉發到後面真實的物理伺服器。並通過rewrite命令把前綴再去掉。這樣真實的伺服器就可以正確 處理請求,並且並不知道這個請求是來自代理伺服器的。
簡單說,nginx伺服器欺騙了瀏覽器,讓它認為這是同源調用,從而解決了瀏覽器的跨域問題。又通過重寫url,欺騙了真實 的伺服器,讓它以為這個http請求是直接來自與用戶瀏覽器的。
Location/carrots-admin-ajax/{
proxy_passhttp://dev.admin.carrots.ptteng.com/;
}
proxy_pass 把請求代理到其他主機
兩種寫法hhttp://dev.admin.carrots.ptteng.com/ 和 http://dev.admin.carrots.ptteng.com
如果訪問url = http://server/html/test.jsp ,則被nginx代理後
情況1,將test/作為根路徑,請求test/路徑下的資源。
情況2,則被nginx代理後,請求路徑會變為http://proxy_pass/test.jsp,直接訪問server的根資源。
是一個匹配規則,用於攔截請求,匹配任何以/proxy/html/開頭的地址,匹配符合以後,停止往下搜索正則。
對於瀏覽器來說,訪問的就是同源伺服器上的一個url。而nginx通過檢測url前綴,把http請求轉發到後面真實的物理伺服器。並通過rewrite命令把前綴再去掉。這樣真實的伺服器就可以正確處理請求,並且並不知道這個請求是來自代理伺服器的。
簡單說,nginx伺服器欺騙了瀏覽器,讓它認為這是同源調用,從而解決了瀏覽器的跨域問題。又通過重寫url,欺騙了真實的伺服器,讓它以為這個http請求是直接來自與用戶瀏覽器的。
1.執行server塊的rewrite指令(這里的塊指的是server關鍵字後{}包圍的區域,其它xx塊類似)
2.執行location匹配
3.執行選定的location中的rewrite指令
如果其中某步URI被重寫,則重新循環執行1-3,直到找到真實存在的文件
如果循環超過10次,則返回500 Internal Server Error錯誤
7.參考文獻
參考一: https://www.cnblogs.com/gabrielchen/p/5066120.html
參考二: http://blog.csdn.net/shendl/article/details/48443299
8.更多討論
提問:
Q :例如img script style等標簽,都允許垮域引用資源?
A :在瀏覽器中,並且載入的方式其實相當於一次普通的GET請求,唯一不同的是,為了安全起見,瀏覽器不允許這種方式下對載入到的資源的讀寫操作,而只能使用標簽本身應當具備的能力(比如腳本執行、樣式應用等等)。
Q :例如img script style等標簽,都允許垮域引用資源?
A :在瀏覽器中,並且載入的方式其實相當於一次普通的GET請求,唯一不同的是,為了安全起見,瀏覽器不允許這種方式下對載入到的資源的讀寫操作,而只能使用標簽本身應當具備的能力(比如腳本執行、樣式應用等等)。
Q:JSONP和nginx跨域有什麼不同
JSONP和nginx是完全不同的 是可以跨域的,而且在跨域腳本中可以直接回調當前腳本的函數
原理:是可以跨域的,而且在跨域腳本中可以直接回調當前腳本的函數
script標簽是可以載入異域的JavaScript並執行的,通過預先設定好的callback函數來實現和母頁面的交互。它有一個大名,叫做JSONP跨域,JSONP是JSON with Padding的略稱。它是一個非官方的協議,明明是載入script,為啥和JSON扯上關系呢?原來就是這個callback函數,對它的使用有一個典型的方式,就是通過JSON來傳參,即將JSON數據填充進回調函數,這就是JSONP的JSON+Padding的含義。JSONP只支持GET請求。
8. 瀏覽器同源策略
同源是指 "協議+域名(主域名、子域名)+埠" 三者相同,即便兩個不同的域名指向同一個 IP 地址,也非同源。
下表給出了相對 http://store.company.com/dir/page.html 同源檢測的示例:
瀏覽器中的大部分內容都是受同源策略限制的,但是以下三個標簽可以不受限制:
注意, 普通的腳本和加上 type="mole" 的腳本對 CORS(跨源資源共享)的處理方式不同。
如果您在模塊上下文中請求 JavaScript 文件,則響應需要定義一個 Access-Control-Allow-Origin 頭,否則它將被瀏覽器阻止。
解決跨域的方案有很多種,詳細內容可以閱讀阮一峰老師的 瀏覽器同源政策及其規避方法 。
跨域資源共享 CORS 詳解
9. 請解釋一下什麼叫同源策略,以及為什麼瀏覽器會有同源策略
同源策略,它是由Netscape提出的一個著名的安全策略。
現在所有支持JavaScript 的瀏覽器都會使用這個策略。
所謂同源是指,域名,協議,埠相同。
當一個瀏覽器的兩個tab頁中分別打開來 網路和谷歌的頁面
當瀏覽器的網路tab頁執行一個腳本的時候會檢查這個腳本是屬於哪個頁面的,
即檢查是否同源,只有和網路同源的腳本才會被執行。
如果非同源,那麼在請求數據時,瀏覽器會在控制台中報一個異常,提示拒絕訪問。