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

資訊專欄INFORMATION COLUMN

Http同源限制

Acceml / 2095人閱讀

摘要:協(xié)議相同域名相同端口相同目的同源政策的目的,是為了保證用戶信息的安全,防止惡意的網(wǎng)站竊取數(shù)據(jù)。因?yàn)闉g覽器同時(shí)還規(guī)定,提交表單不受同源政策的限制。同源除了架設(shè)服務(wù)器代理瀏覽器請(qǐng)求同源服務(wù)器,再由后者請(qǐng)求外部服務(wù),有三種方法規(guī)避這個(gè)限制。

同源
Cookic
Document.cookic
Http返回

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

domcument.domain

1.概述 1.1含義

A 網(wǎng)頁設(shè)置的 Cookie,B 網(wǎng)頁不能打開,除非這兩個(gè)網(wǎng)頁“同源”。所謂“同源”指的是“三個(gè)相同”。

協(xié)議相同

域名相同

端口相同

1.2目的

同源政策的目的,是為了保證用戶信息的安全,防止惡意的網(wǎng)站竊取數(shù)據(jù)。

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

1.3限制范圍

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

無法向非同源地址發(fā)送 AJAX 請(qǐng)求(可以發(fā)送,但瀏覽器會(huì)拒絕接受響應(yīng))。

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

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()

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

2.Cookie 同源

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

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

注意,A 和 B 兩個(gè)網(wǎng)頁都需要設(shè)置document.domain屬性,才能達(dá)到同源的目的。因?yàn)樵O(shè)置document.domain的同時(shí),會(huì)把端口重置為null,因此如果只設(shè)置一個(gè)網(wǎng)頁的document.domain,會(huì)導(dǎo)致兩個(gè)網(wǎng)址的端口不同,還是達(dá)不到同源的目的

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

3.iframe 和多窗口通信

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

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

document
.getElementById("myIFrame")
.contentWindow
.document
// Uncaught DOMException: Blocked a frame from accessing a cross-origin frame.
上面命令中,父窗口想獲取子窗口的 DOM,因?yàn)榭缬驅(qū)е聢?bào)錯(cuò)。

反之亦然,子窗口獲取主窗口的 DOM 也會(huì)報(bào)錯(cuò)。

window.parent.document.body
// 報(bào)錯(cuò)

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

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

3.1片段識(shí)別符 # 傳數(shù)據(jù)

Url#后面的

如果只是改變片段標(biāo)識(shí)符,頁面不會(huì)重新刷新。

父窗口可以把信息,寫入子窗口的片段標(biāo)識(shí)符。

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

window.onhashchange = checkMessage;

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

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

3.2window.postMessage()可不同

舉例來說,父窗口aaa.com向子窗口bbb.com發(fā)消息,調(diào)用postMessage方法就可以了

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

子窗口向父窗口發(fā)送消息的寫法類似。

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

父窗口和子窗口都可以通過message事件,監(jiān)聽對(duì)方的消息。

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

event.source:發(fā)送消息的窗口
event.origin: 消息發(fā)向的網(wǎng)址
event.data: 消息內(nèi)容

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

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

3.3LocalStorage 同源 4.AJAX

除了架設(shè)服務(wù)器代理(瀏覽器請(qǐng)求同源服務(wù)器,再由后者請(qǐng)求外部服務(wù)),有三種方法規(guī)避這個(gè)限制。

4.1.JSONP

第一步,網(wǎng)頁添加一個(gè)
注意,請(qǐng)求的腳本網(wǎng)址有一個(gè)callback參數(shù)(?callback=bar),用來告訴服務(wù)器,客戶端的回調(diào)函數(shù)名稱(bar)。

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

第三步,客戶端會(huì)將服務(wù)器返回的字符串,作為代碼解析,因?yàn)闉g覽器認(rèn)為,這是

閱讀需要支付1元查看
<