关于JavaScript的同源策略

Mar 26, 2016

同源策略,它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的主流浏览器都会使用这个策略(注意关键字:“浏览器” 使用的 “安全策略”)

同源

源继承

跨域脚本API访问

跨域数据存储访问

跨域网络访问,同源策略控制了不同源之间的交互,例如在使用XMLHttpRequest 或 标签时则会受到同源策略的约束。交互通常分为三类:

  1. “通常允许”进行跨域“写”操作(Cross-origin writes)。例如链接(links),重定向以及表单提交。特定少数的HTTP请求需要添加 preflight。
  2. “通常允许“跨域资源“嵌入”(Cross-origin embedding)。之后下面会举例说明。
  3. “通常不允许”跨域“读”操作(Cross-origin reads)。但常可以通过内嵌资源来巧妙的进行读取访问,也可以通过在服务端向HTTP Header 添加Access-Control-Allow-Origin:hosts或* 来使此资源可以被读取(FireFox 3.6+, Safari 4+, Chrome 4+, Edge, and IE 10+ 均支持此特性)也叫作 跨域资源共享(CORS )。(所以在我们使用XMLHttpRequest跨域操作时, 浏览器是可以发出请求并获得到response的,只是限制了我们使用那些其他域的资源) CORS浏览器支持情况

以下是一些可以跨域内嵌的资源示例:

  1. 标签嵌入跨域脚本。语法错误信息只能在同源脚本中捕捉到。
  2. 标签嵌入CSS。由于CSS的松散的语法规则,CSS的跨域需要一个设置正确的Content-Type消息头。不同浏览器有不同的限制: IE, Firefox,Chrome, Safari (跳至CVE-2010-0051)部分 和 Opera。
  3. 嵌入图片。支持的图片格式包括PNG,JPEG,GIF,BMP,SVG,…
  4. 嵌入多媒体资源
  5. iframe

由于 “跨域” 是 “同源策略” 的衍生产物,初期各大浏览器的表现也不尽相同,也存在着 各种千奇百怪的 解决方案,上面是我所了解到的常用解决方案!如有问题请帮忙指正!