brower-same-origin-policy-and-cross-origin-http-request
[toc]
同源策略
是一種約定,他是瀏覽器最核心也是最基本的安全功能。
兩個頁面擁有相同的協(xié)議、端口、和主機那么這兩個頁面就屬于同源,當然了IE有例外
- 兩個互相之間高度互信的域名,如公司域名(corporate domains),不遵守同源策略的限制
- 端口:IE未將端口號加入到同源策略的組成部分。
在同源策略中有一個例外,腳本可以設(shè)置 document.domain 的值為當前域的一個后綴,如果這樣做的話,短的域?qū)⒆鳛楹罄m(xù)同源檢測的依據(jù)。例如,假設(shè)在 http://store.company.com/dir/other.html 中的一個腳本執(zhí)行了下列語句:
document.domain = "company.com";
這條語句執(zhí)行之后,頁面將會成功地通過對 http://company.com/dir/page.html 的同源檢測。
使用document.domain是讓子域訪問其父域,需要同時將子域和父域的document.domain設(shè)置為相同的值。必須要這么做,即使是簡單的將父域設(shè)置為其原來的值。沒有這么做的話可能導致授權(quán)錯誤。
跨域內(nèi)嵌的資源
- script
- link
- img
- video和audio
- object,embed,applet
- @font-face
- frame和iframe
實現(xiàn)跨域訪問
使用CORS來實現(xiàn)跨域訪問
- 簡單請求,只需要設(shè)置
Access-Control-Allow-Origin: * - 預請求
- 附帶憑證信息的請求
xml.withCredentials = true;如果服務器端的響應中,如果沒有返回Access-Control-Allow-Credentials: true的響應頭,那么瀏覽器將不會把響應結(jié)果傳遞給發(fā)出請求的腳步程序,以保證信息的安
使用跨域內(nèi)嵌資源實現(xiàn)
- JSONP
- iframe
- window.name
- document.domain
- location.hash
- window.postMessage
HTTP請求頭
OriginAccess-Control-Request-MethodAccess-Control-Request-Headers
HTTP響應頭
Access-Control-Allow-OriginAccess-Control-Expose-Headers-
Access-Control-Max-Age預請求的結(jié)果有效期是多久 Access-Control-Allow-CredentialsAccess-Control-Allow-MethodsAccess-Control-Allow-Headers
跨域腳本API和跨域數(shù)據(jù)存儲訪問
-
iframe.contentWindow,window.parent,window.open,window.opener允許文檔之間相互引用,當兩個文檔的源不同時,這些引用方式將受到影響。可使用window.postMessage作為替代方案。 -
localStorage和indexedDB每個源擁有單獨空間,不能跨域做讀寫操作。 -
window.name屬性可以用來臨時存儲數(shù)據(jù),支持跨域訪問。 -
Cookies使用不同的源定義方式。一個頁面可以為本域和任何父域設(shè)置cookie,只要是父域不是公共后綴(public suffix)即可。Firefox和Chrome使用Public Suffix List決定一個域是否是一個公共后綴(public suffix)。不管使用哪個協(xié)議(HTTP/HTTPS)或端口號,瀏覽器都允許給定的域以及其任何子域名(sub-domains)來訪問cookie。設(shè)置cookie時,你可以使用Domain,Path,Secure,和Http-Only標記來限定其訪問性。讀取cookie時,不會知曉它的出處。盡管使用安全的https連接,任何可見的cookie都是使用不安全的連接設(shè)置的。