如何跨域請求
為何要跨域
瀏覽器為了防止csrf(跨站請求偽造),NetScape提出的一個著名的安全策略:同源策略。所謂的同源,指的是協議,域名,端口相同。瀏覽器處於安全方面的考慮,只允許本域名下的接口交互,不同源的客戶端腳本,在沒有明確授權的情況下,不能讀寫對方的資源。
同源三要素
- 協議相同
- 域名相同(域名和對應的ip也被視為不同,因為瀏覽器不會為你請求dns判斷)
- 端口相同
隨着互聯網的發展,”同源政策”越來越嚴格。目前,如果非同源,共有三種行為受到限制。
- Cookie、LocalStorage和IndexDB無法讀取。
- DOM 無法獲取。
- AJAX 請求不能發送。
如何跨域
如果需要跨域請求,那麼有如下幾種方法:
不同二級域名下cookie共享
如果兩個網頁一級域名相同,只是二級域名不同,瀏覽器允許通過設置document.domain共享 Cookie。
設置方法:
#兩個網站設置相同的document.domain屬性
document.domain = 'example.com';
A網站設置cookie:
document.cookie = "test1=hello";
B網站訪問cookie:
var allCookie = document.cookie; //可以獲取到
注意:如果共享了cookie,也就意味着只要有一個網站被攻擊成功,另一個網站的cookie也將被獲取。有黑客論壇專門講過從其他二級域名下手攻克網站的教程。
這種方法有一定局限性如下:
- 如果修改了document.domain,則在某些機器上的IE678里,獲取location.href有權限異常。
- 如果頁面修改了document.domain,則它包含的iframe,必須也設domain,才能進行交互。就算是同域的頁面也必須要設。
- 這種方法不適用於LocalStorage 和 IndexDB ,要使用其他方法規避。
JSONP
它的基本思想是,瀏覽器對於帶有src的標籤,不被同源策略限制,網頁通過添加一個