JavaScript 同源策略
概念:同源策略是客戶端腳本(尤其是JavaScript)的重要安全度量標準宛蚓。其目的是防止某個文檔或腳本從多個不同源裝載跃闹。
同源指的是:協(xié)議,域名(包括子域名),端口相同挠进。同源策略是一種安全協(xié)議沮明。
具體表現(xiàn)在JS中:一段腳本自能讀取來自同一來源的窗口的文檔和屬性辕坝。(iframe.contentDocument 等訪問錯誤)
為什么要有同源限制?
如果沒有同源策略荐健,黑客通過iframe偽造一個網(wǎng)銀登錄界面酱畅,在父頁面上直接獲取iframe里面輸入框的值。就能完成竊取賬號密碼的侵入行為江场。
跨域的一些方案
只列出了一些方案纺酸,具體示例可查看參考鏈接里面的文章。
document.domain
通過iframe嵌入頁面
修改兩個頁面的 document.domain 為相同的主域(適用于主域相同扛稽,子域不同的頁面通信吁峻,修改domain只能修改為自身或更高一級)
兩個頁面的 JavaScript通過對應的方法和屬性訪問彼此的元素和屬性
jsonp
本地提供需要執(zhí)行的方法
動態(tài)加載 script 提供callback參數(shù)
動態(tài)請求 script,服務端塞入數(shù)據(jù) jsonp(json with padding)
請求完的 script 在頁面上執(zhí)行(已塞入遠端數(shù)據(jù))
window.name (個人感覺使用 window.name 跨域的方式比較雞肋在张,一定是我打開的方式不對吧)
- 原理:一個窗口(window)的生命周期內(nèi)用含,窗口載入的所有頁面都共享一個 window.name,每個頁面對window.name 都有讀寫權限帮匾。(在測試中覺得父頁面和iframe是不共享 window.name 的)
- 生命周期是指一個tab頁面從打開到關閉啄骇。包括發(fā)生在該頁面上的跳轉(zhuǎn)操作。只要沒有關閉頁面瘟斜,依舊可以讀取之前設置的window.name 屬性缸夹。
- 跨域?qū)崿F(xiàn):首先在 parent 頁面通過 iframe 引入要設置 window.name 的頁面痪寻,待頁面加載完畢后,跳轉(zhuǎn)到和 parent 頁面同域的一個中間頁面(保留了目標頁面設置的 window.name 屬性)虽惭。在父頁面通過獲取 iframe橡类,調(diào)用 iframe.contentWindow.name 獲取到設置好的 window.name 屬性。
- HTML5 postMessage
- HTML5 所提供的一個 API 方法
- window.postMessage(data, origin) 向 origin 匹配域頁面發(fā)送 data 數(shù)據(jù)芽唇。
- window.onmessage = function(msg) {} 監(jiān)聽 message 事件顾画,在收到 post 過來的數(shù)據(jù)時觸發(fā)。 msg.data存儲傳遞過來的message匆笤,msg.soruce 存儲發(fā)送消息的窗口對象研侣,msg.origin 存儲發(fā)送消息的窗口的源(協(xié)議+主機+端口號)
參考文章: