国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Http同源限制

Acceml / 2099人閱讀

摘要:協議相同域名相同端口相同目的同源政策的目的,是為了保證用戶信息的安全,防止惡意的網站竊取數據。因為瀏覽器同時還規定,提交表單不受同源政策的限制。同源除了架設服務器代理瀏覽器請求同源服務器,再由后者請求外部服務,有三種方法規避這個限制。

同源
Cookic
Document.cookic
Http返回

1.概述
1.1含義
1.2目的
1.3限制范圍
2.Cookie 同源
3.iframe 和多窗口通信
3.1片段識別符 # 穿數據 父子窗口
3.2window.postMessage()可不同 父子窗口
3.3LocalStorage 同源父子窗口
4.AJAX 服務器和客戶端之間
4.1JSONP 在script標簽加callback 參數就是數據體 Get
4.2WebSocket
4.3CORS
參考鏈接

domcument.domain

1.概述 1.1含義

A 網頁設置的 Cookie,B 網頁不能打開,除非這兩個網頁“同源”。所謂“同源”指的是“三個相同”。

協議相同

域名相同

端口相同

1.2目的

同源政策的目的,是為了保證用戶信息的安全,防止惡意的網站竊取數據。

設想這樣一種情況:A 網站是一家銀行,用戶登錄以后,A 網站在用戶的機器上設置了一個 Cookie,包含了一些隱私信息(比如存款總額)。用戶離開 A 網站以后,又去訪問 B 網站,如果沒有同源限制,B 網站可以讀取 A 網站的 Cookie,那么隱私信息就會泄漏。
更可怕的是,Cookie 往往用來保存用戶的登錄狀態,如果用戶沒有退出登錄,其他網站就可以冒充用戶,為所欲為。
因為瀏覽器同時還規定,提交表單不受同源政策的限制。

1.3限制范圍

1.無法讀取非同源cookic.localstorage,indexesDB
.2.無法讀取dom

無法向非同源地址發送 AJAX 請求(可以發送,但瀏覽器會拒絕接受響應)。

另外,通過 JavaScript 腳本可以拿到其他窗口的window對象。如果是非同源的網頁,目前允許一個窗口可以接觸其他網頁的window對象的九個屬性和四個方法。

window.closed
window.frames
window.length
window.location
window.opener
window.parent
window.self
window.top
window.window
window.blur()
window.close()
window.focus()
window.postMessage()

上面的九個屬性之中,只有window.location是可讀寫的,其他八個全部都是只讀。而且,即使是location對象,非同源的情況下,也只允許調用location.replace方法和寫入location.href屬性

2.Cookie 同源

次級域名不同的,可以改相同document.domain來共享cookic

舉例來說,A 網頁的網址是http://w1.example.com/a.html,B 網頁的網址是http://w2.example.com/b.html,那么只要設置相同的document.domain

注意,A 和 B 兩個網頁都需要設置document.domain屬性,才能達到同源的目的。因為設置document.domain的同時,會把端口重置為null,因此如果只設置一個網頁的document.domain,會導致兩個網址的端口不同,還是達不到同源的目的

注意,這種方法只適用于 Cookie 和 iframe 窗口,LocalStorage 和 IndexedDB 無法通過這種方法,規避同源政策,而要使用下文介紹 PostMessage API

3.iframe 和多窗口通信

Iframe用于在頁面中嵌入頁面,每個iframe形成自己的窗口。自己的windom對象。

iframe窗口之中的腳本,可以獲得父窗口和子窗口。
但是,只有在同源的情況下,父窗口和子窗口才能通信;如果跨域,就無法拿到對方的 DOM

document
.getElementById("myIFrame")
.contentWindow
.document
// Uncaught DOMException: Blocked a frame from accessing a cross-origin frame.
上面命令中,父窗口想獲取子窗口的 DOM,因為跨域導致報錯。

反之亦然,子窗口獲取主窗口的 DOM 也會報錯。

window.parent.document.body
// 報錯

對于完全不同源的網站,目前有兩種方法,可以解決跨域窗口的通信問題。

片段識別符(fragment identifier)
跨文檔通信API(Cross-document messaging)

3.1片段識別符 # 傳數據

Url#后面的

如果只是改變片段標識符,頁面不會重新刷新。

父窗口可以把信息,寫入子窗口的片段標識符。

var src = originURL + "#" + data;
document.getElementById("myIFrame").src = src;

window.onhashchange = checkMessage;

function checkMessage() {
var message = window.location.hash;
// ...
}
同樣的,子窗口也可以改變父窗口的片段標識符。

parent.location.href = target + "#" + hash;

3.2window.postMessage()可不同

舉例來說,父窗口aaa.com向子窗口bbb.com發消息,調用postMessage方法就可以了

// 父窗口打開一個子窗口
var popup = window.open("http://bbb.com", "title");
// 父窗口向子窗口發消息
popup.postMessage("Hello World!", "http://bbb.com");
postMessage方法的第一個參數是具體的信息內容,第二個參數是接收消息的窗口的源(origin),即“協議 + 域名 + 端口”。也可以設為*,表示不限制域名,向所有窗口發送。

子窗口向父窗口發送消息的寫法類似。

// 子窗口向父窗口發消息
window.opener.postMessage("Nice to see you", "http://aaa.com");

父窗口和子窗口都可以通過message事件,監聽對方的消息。

// 父窗口和子窗口都可以用下面的代碼,
// 監聽 message 消息
window.addEventListener("message", function (e) {
console.log(e.data);
},false);
message事件的參數是事件對象event,提供以下三個屬性。

event.source:發送消息的窗口
event.origin: 消息發向的網址
event.data: 消息內容

下面的例子是,子窗口通過event.source屬性引用父窗口,然后發送消息。

window.addEventListener("message", receiveMessage);
function receiveMessage(event) {
event.source.postMessage("Nice to see you!", "*");
}

3.3LocalStorage 同源 4.AJAX

除了架設服務器代理(瀏覽器請求同源服務器,再由后者請求外部服務),有三種方法規避這個限制。

4.1.JSONP

第一步,網頁添加一個
注意,請求的腳本網址有一個callback參數(?callback=bar),用來告訴服務器,客戶端的回調函數名稱(bar)。

第二步,服務器收到請求后,拼接一個字符串,將 JSON 數據放在函數名里面,作為字符串返回(bar({...}))。

第三步,客戶端會將服務器返回的字符串,作為代碼解析,因為瀏覽器認為,這是

閱讀需要支付1元查看
<