為什麼要禁止跨域的 Ajax 請求?

2021-09-11 18:42:36 字數 3491 閱讀 9438

作者將「同源策略」分為:

使用者登入了自己的銀行頁面向使用者的cookie中新增使用者標識

使用者瀏覽了惡意頁面 執行了頁面中的惡意ajax請求**

向發起ajax http請求,請求同時對應cookie也同時傳送過去

銀行頁面從傳送的cookie中提取使用者標識,驗證使用者標識無誤,response中返回請求資料。此時資料洩露。

由於ajax的後台執行,此時使用者沒有意識這一過程。

簡單的說,你把cookie託付給瀏覽器儲存,瀏覽器要保證你的cookie不被惡意**利用。

同源策略並不能防止ddos,因為跨域的ajax也會被請求,如果用ajax請求,瀏覽器會先發出請求,並且帶上的cookie。拿到的響應之後(可能有敏感資料),瀏覽器才會根據header裡的access-control-allow-origin決定是否把結果交給裡的指令碼。(或者先發乙個options請求看一下cors設定,再決定是否要發真正的請求。)

因此瀏覽器只是起到了最基本的防禦,在寫程式的時候還是要注意防禦csrf,比如關鍵操作不要用get,post請求要做額外的驗證(驗證碼,隨機數,refer,token)等等

跨域是指跨網域名稱的訪問,以下情況都屬於跨域:

跨域原因說明

示例網域名稱不同

www.jd.comwww.taobao.com

網域名稱相同,埠不同

www.jd.com:8080www.jd.com:8081

二級網域名稱不同

item.jd.commiaosha.jd.com

如果網域名稱和埠都相同,但是請求路徑不同,不屬於跨域,如:

而我們剛才是從manage.leyou.com去訪問api.leyou.com,這屬於二級網域名稱不同,跨域了。

跨域不一定會有跨域問題。

因為跨域問題是瀏覽器對於ajax請求的一種安全限制:乙個頁面發起的ajax請求,只能是於當前頁同網域名稱的路徑,這能有效的阻止跨站攻擊。

因此:跨域問題 是針對ajax的一種限制

但是這卻給我們的開發帶來了不變,而且在實際生成環境中,肯定會有很多臺伺服器之間互動,位址和埠都可能不同,怎麼辦?

目前比較常用的跨域解決方案有3種:

nginx反向**

思路是:利用nginx反向**把跨域為不跨域,支援各種請求方式

缺點:需要在nginx進行額外配置,語義不清晰

cors

規範化的跨域請求解決方案,安全可靠。

優勢:缺點:

cors是乙個w3c標準,全稱是"跨域資源共享"(cross-origin resource sharing)。

它允許瀏覽器向跨源伺服器,發出xmlhttprequest請求,從而克服了ajax只能同源使用的限制。

cors需要瀏覽器和伺服器同時支援。目前,所有瀏覽器都支援該功能,ie瀏覽器不能低於ie10。

瀏覽器會將ajax請求分為兩類,其處理方案略有差異:簡單請求、特殊請求。

簡單請求

只要同時滿足以下兩大條件,就屬於簡單請求。:

(1) 請求方法是以下三種方法之一:

(2)http的頭資訊不超出以下幾種字段:

當瀏覽器發現發現的ajax請求是簡單請求時,會在請求頭中攜帶乙個字段:origin.

origin中會指出當前請求屬於哪個域(協議+網域名稱+埠)。服務會根據這個值決定是否允許其跨域。

如果伺服器允許跨域,需要在返回的響應頭中攜帶下面資訊:

access-control-allow-origin: 

access-control-allow-credentials: true

content-type: text/html; charset=utf-8

注意:

如果跨域請求要想操作cookie,需要滿足3個條件:

特殊請求

不符合簡單請求的條件,會被瀏覽器判定為特殊請求,,例如請求方式為put。

預檢請求

特殊請求會在正式通訊之前,增加一次http查詢請求,稱為"預檢"請求(preflight)。

瀏覽器先詢問伺服器,當前網頁所在的網域名稱是否在伺服器的許可名單之中,以及可以使用哪些http動詞和頭資訊字段。只有得到肯定答覆,瀏覽器才會發出正式的xmlhttprequest請求,否則就報錯。

乙個「預檢」請求的樣板:

user-agent: mozilla/5.0...與簡單請求相比,除了origin以外,多了兩個頭:

預檢請求的響應

服務的收到預檢請求,如果許可跨域,會發出響應:

content-type: text/plain除了access-control-allow-originaccess-control-allow-credentials以外,這裡又額外多出3個頭:

如果瀏覽器得到上述響應,則認定為可以跨域,後續就跟簡單請求的處理是一樣的了。

Ajax跨域請求

一 什麼是跨域請求 網域名稱它由http 協議 www 子網域名稱 baidu 主網域名稱 以及8080 埠號 組成,當另乙個網域名稱與其中任意一項對應不等的話,那麼我們說兩個網域名稱就是跨域的。如的頁面上我們要請求資料到上去,那麼就說這種請求是跨域請求。二 為什麼要講跨域請求 因為在一般的請求條件...

Ajax 跨域請求

隨筆 71 文章 0 客戶端js 服務端 1 string callbackfunname context.request callbackparam 2 context.response.write callbackfunname ps 客戶端的jsonp引數是用來通過url傳參,傳遞jsonpc...

ajax跨域請求

通過xhr實現ajax通訊的乙個主要的限制,於跨域安全策略。在預設情況下,xhr物件只能訪問與包含它的頁面位於同乙個域中的資源。這樣可以防止一些惡意行為。所謂的域,可以理解成網域名稱,如果這個xhr所在的頁面與請求的介面是在同乙個應用下面,那麼就不存在跨域的問題,它們是在同乙個域下面,例如這裡都在本...