JSONP
- Jsonp(JSON with Padding) 是 json 的一種"使用模式",可以讓網(wǎng)頁(yè)從別的域名(網(wǎng)站)那獲取資料,即跨域讀取數(shù)據(jù)仔引。
- 為什么我們從不同的域(網(wǎng)站)訪問數(shù)據(jù)需要一個(gè)特殊的技術(shù)( JSONP )呢先巴?這是因?yàn)橥床呗浴?/li>
- 同源策略,它是由 Netscape 提出的一個(gè)著名的安全策略仰挣,現(xiàn)在所有支持 JavaScript 的瀏覽器都會(huì)使用這個(gè)策略伴逸。
同源:協(xié)議、域名膘壶、端口號(hào)都相同的兩個(gè)頁(yè)面稱為同源错蝴。
同源策略(Same origin policy)是一種約定洲愤,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略顷锰,則瀏覽器的正常功能可能都會(huì)受到影響柬赐。可以說(shuō)Web是構(gòu)建在同源策略基礎(chǔ)之上的官紫,瀏覽器只是針對(duì)同源策略的一種實(shí)現(xiàn)肛宋。
同源策略,它是由Netscape提出的一個(gè)著名的安全策略束世。
當(dāng)一個(gè)瀏覽器的兩個(gè)tab頁(yè)中分別打開來(lái) 百度和谷歌的頁(yè)面
當(dāng)瀏覽器的百度tab頁(yè)執(zhí)行一個(gè)腳本的時(shí)候會(huì)檢查這個(gè)腳本是屬于哪個(gè)頁(yè)面的酝陈,
即檢查是否同源,只有和百度同源的腳本才會(huì)被執(zhí)行毁涉。
如果非同源沉帮,那么在請(qǐng)求數(shù)據(jù)時(shí),瀏覽器會(huì)在控制臺(tái)中報(bào)一個(gè)異常贫堰,提示拒絕訪問穆壕。
同源策略是瀏覽器的行為,是為了保護(hù)本地?cái)?shù)據(jù)不被JavaScript代碼獲取回來(lái)的數(shù)據(jù)污染严嗜,因此攔截的是客戶端發(fā)出的請(qǐng)求回來(lái)的數(shù)據(jù)接收粱檀,即請(qǐng)求發(fā)送了,服務(wù)器響應(yīng)了漫玄,但是無(wú)法被瀏覽器接收茄蚯。
同源策略是什么
- 同源策略是瀏覽器的一個(gè)安全功能,不同源的客戶端腳本在沒有明確授權(quán)的情況下睦优,不能讀寫對(duì)方資源渗常。所以xyz.com下的js腳本采用ajax讀取abc.com里面的文件數(shù)據(jù)是會(huì)被拒絕的。
- 同源策略限制了從同一個(gè)源加載的文檔或腳本如何與來(lái)自另一個(gè)源的資源進(jìn)行交互汗盘。這是一個(gè)用于隔離潛在惡意文件的重要安全機(jī)制皱碘。
不受同源策略限制的
- 頁(yè)面中的鏈接,重定向以及表單提交是不會(huì)受到同源策略限制的隐孽。
- 跨域資源的引入是可以的癌椿。但是js不能讀寫加載的內(nèi)容。如嵌入到頁(yè)面中的<script src="..."></script>菱阵,<img>踢俄,<link>,<iframe>等晴及。
規(guī)避同源策略
document.domain屬性
如果兩個(gè)window或者frames包含的腳本可以把domain設(shè)置成一樣的值都办,那么就可以規(guī)避同源策略,每個(gè)window之間可以互相溝通。例如琳钉,orders.example.com下頁(yè)面的腳本和catalog.example.com下頁(yè)面的腳本可以設(shè)置他們的document.domain屬性為example.com势木,從而讓這兩個(gè)站點(diǎn)下面的文檔看起來(lái)像在同源下,然后就可以讓每個(gè)文檔讀取另一個(gè)文檔的屬性歌懒。這種方式也不是一直都有用啦桌,因?yàn)槎丝谔?hào)是在內(nèi)部保存的,有可能被保存成null歼培。換句話說(shuō)震蒋,example.com的端口號(hào)80,在我們更新document.domain屬性的時(shí)候可能會(huì)變成null躲庄。為null的端口可能不被認(rèn)為是80查剖,這主要依賴瀏覽器實(shí)現(xiàn)。
跨域資源共享
這種方式使用了一個(gè)新的Origin請(qǐng)求頭和一個(gè)新的Access-Control-Allow-Origin響應(yīng)頭擴(kuò)展了HTTP噪窘。允許服務(wù)端設(shè)置Access-Control-Allow-Origin頭標(biāo)識(shí)哪些站點(diǎn)可以請(qǐng)求文件笋庄,或者設(shè)置Access-Control-Allow-Origin頭為"*",允許任意站點(diǎn)訪問文件倔监。瀏覽器直砂,例如Firefox3.5,Safari4浩习,IE10使用這個(gè)頭允許跨域HTTP請(qǐng)求静暂。
跨文檔通信
這種方式允許一個(gè)頁(yè)面的腳本發(fā)送文本信息到另一個(gè)頁(yè)面的腳本中,不管腳本是否跨域谱秽。在一個(gè)window對(duì)象上調(diào)用postMessage()會(huì)異步的觸發(fā)window上的onmessage事件洽蛀,然后觸發(fā)定義好的事件處理方法。一個(gè)頁(yè)面上的腳本仍然不能直接訪問另外一個(gè)頁(yè)面上的方法或者變量疟赊,但是他們可以安全的通過消息傳遞技術(shù)交流郊供。
JSONP
JOSNP允許頁(yè)面接受另一個(gè)域的JSON數(shù)據(jù),通過在頁(yè)面增加一個(gè)可以從其它域加載帶有回調(diào)的JSON響應(yīng)的<script>標(biāo)簽近哟。
WebSocket
現(xiàn)代瀏覽器允許腳本直連一個(gè)WebSocket地址而不管同源策略驮审。然而,使用WebSocket URI的時(shí)候吉执,在請(qǐng)求中插入Origin頭就可以標(biāo)識(shí)腳本請(qǐng)求的源疯淫。為了確保跨站安全戳玫,WebSocket服務(wù)器必須根據(jù)允許接受請(qǐng)求的白名單中的源列表比較頭數(shù)據(jù)峡竣。
。
量九。
。
。
荠列。
类浪。