同源策略为什么而生?

JS可以读取/修改网页的值。

一个浏览器中,打开一个银行网站和一个恶意网站,如果恶意网站能够对银行网站进行修改,那么就会很危险。

你打开了恶意网站和另一个网站,如果没有同源限制,该恶意网站就可以构造AJAX请求频繁在另一个网站发广告帖。

同源策略就是为了解决这类问题而出现的。

同源策略限制一个加载于A origin的document或者script能够如何和来自于另外一个origin的resource交互。同源策略是隔离潜在恶意网页的安全机制。

浏览器的同源策略,限制了来自不同源的"document"或脚本,对当前"document"读取或设置某些属性。 在浏览器中,<script>、<img>、<iframe>、<link>等标签都可以加载跨域资源,同源策略只对网页的HTML文档做了限制,对加载的其他静态资源如javascript、css、图片等仍然认为属于同源。

源的定义

两个网页只有具有相同的protocol,port以及host才被认为是具有相同的origin的。

比如http://xxx.yyy.com:8000/zzz/page.html和http://xxx.yyy.com:8000/kkk/index.html具有相同的origin

about:blankjavascript: and data: URLs则从加载那个URL的文件中继承origin.

同源策略控制了异源之间的互操作,比如,当你使用XMLHttpRequest或者一个<img>元素时就存在这个问题。这些互操作(interactions)典型地放在三个category中:

  • cross-origin writes通常是被允许的,比如links,redirect,或者提交一个表单form.
  • cross-origin embedding也通常是被允许的,例如:
    • 使用<script src="..."></script>引入的javascript,这种情况下关于语法错误的错误消息只在同源的脚本中存在;(Content-Type:text/javascript或者application/javascript)
    • 使用<link rel="stylesheet" href="...">来引入的css。注意由于css的语法rule,跨域的css需要一个合适的content-type header (Content-Type:text/css)
    • 使用<img>标签引入的图片,包括PNG,JPEG,GIF,BMP,SVG等。。。
    • 使用<video><embed>或者<applet>来引入的plug-in
    • 使用@font-face引入的字体.但是要注意虽然chrome能很好的工作,但是有些浏览器,比如firefox,ie可能不允许非同源的字体文件被加载,这种情况下,如果使用你自己的CDN网络(这很普遍),则需要配置
      1. # Apache config
      2. <FilesMatch ".(eot|ttf|otf|woff)">
      3. Header set Access-Control-Allow-Origin "*"
      4. </FilesMatch>
    • 任何使用<frame>和<iframe>引入的东西。注意:一个网站可以通过使用X-Frame-Options 头来防止你自己的网页被别人frame过去!
  • cross-origin read一般是不允许的,但是一般如果通过embed方式来调用则往往会泄漏部分读的权限。比如,你可以读取到embedded image的宽和高  

如何允许跨源访问呢?使用CORS机制吧

  1. var invocation = new XMLHttpRequest();
  2. var url = 'http://bar.other/resources/public-data/';
  3.  
  4. function callOtherDomain() {
  5. if(invocation) {
  6. invocation.open('GET', url, true);
  7. invocation.onreadystatechange = handler;
  8. invocation.send();
  9. }
  10. }
  1. GET /resources/public-data/ HTTP/1.1
  2. Host: bar.other
  3. User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1b3pre) Gecko/20081130 Minefield/3.1b3pre
  4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  5. Accept-Language: en-us,en;q=0.5
  6. Accept-Encoding: gzip,deflate
  7. Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
  8. Connection: keep-alive
  9. Referer: http://foo.example/examples/access-control/simpleXSInvocation.html
  10. Origin: http://foo.example
  11.  
  12. HTTP/1.1 200 OK
  13. Date: Mon, 01 Dec 2008 00:23:53 GMT
  14. Server: Apache/2.0.61
  15. Access-Control-Allow-Origin: *
  16. Keep-Alive: timeout=2, max=100
  17. Connection: Keep-Alive
  18. Transfer-Encoding: chunked
  19. Content-Type: application/xml

如何阻止跨域(源)访问呢?

  • 为了组织cross-origin writes,通过判断一个在request中存在的不易猜出的token(CSRF)TOKEN。注意你必须阻止cross-origin reads of pages that know this token.
  • 为了阻止cross-origin reads of a resource,必须确保它是不能被embedded(not embeddable)。通常,我们是需要阻止embedding的,因为embedding一个resource通常会泄漏它的部分信息的!
  • 为了阻止cross-origin embedding,确保你的资源不能被翻译为上述embeddable格式中的任何一种。浏览器大多数情况下并不会respect Content-Type.比如如果你将<script>tag指向一个html文档,那么浏览器则将尽自己所能将HTML解析为javascript.当你的资源不是一个你站点的入口时,你可以使用CSRF token来阻止embedding.

Cross-orgin script API access

Javascript API,比如iframe.contentWindow, window.parent, window.open,window.opener允许documents来直接引用彼此。当两个document不同源时,这些reference则仅对Window和Location对象开放相当有限的访问权限,下面将分别列出。

https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy

不遵循同源限制的标签:

<script>  <img>  <iframe>中的src,href都可以任意链接网络资源,相当于对所要求的源进行了一次请求。

源继承:

来自about:blank,JavaScript:和data:URLs中的内容,继承了将其载入的文档所指定的源,因为它们的URL本身未指定任何关于自身源的信息。

AJAX跨域的问题

Ajax (XMLHttpRequest)请求应该受到同源策略的限制,但是我们来看实际情况:

Ajax通过XMLHttpRequest能够与远程的服务器进行信息交互,另外XMLHttpRequest是一个纯粹的Javascript对象,这样的交互过程,是在后台进行的,用户不易察觉。

因此,XMLHTTP实际上已经突破了原有的Javascript的安全限制。

举个例子:

假设某网站引用了其它站点的javascript,这个站点被compromise并在javascript中加入获取用户输入并通过ajax提交给其他站点,这样就可以源源不断收集信息。

或者某网站因为存在漏洞导致XSS注入了javascript脚本,这个脚本就可以通过ajax获取用户信息并通过ajax提交给其他站点,这样就可以源源不断收集信息。

如果我们又想利用XMLHTTP的无刷新异步交互能力,又不愿意公然突破Javascript的安全策略,可以选择的方案就是给XMLHTTP加上严格的同源限制。

这样的安全策略,很类似于Applet的安全策略。IFrame的限制还仅仅是不能访问跨域HTMLDOM中的数据,而XMLHTTP则根本上限制了跨域请求的提交。(实际上下面提到了CORS已经放宽了限制)

随着Ajax技术和网络服务的发展,对跨域的要求也越来越强烈。下面介绍Ajax的跨域技术。

2.1 JSONP

请参考: http://www.jb51.net/article/75484.htm

JSONP技术实际和Ajax没有关系。我们知道<script>标签可以加载跨域的javascript脚本,并且被加载的脚本和当前文档属于同一个域。因此在文档中可以调用/访问脚本中的数据和函数。如果javascript脚本中的数据是动态生成的,那么只要在文档中动态创建<script>标签就可以实现和服务端的数据交互。

JSONP就是利用<script>标签的跨域能力实现跨域数据的访问,请求动态生成的JavaScript脚本同时带一个callback函数名作为参数。其中callback函数本地文档的JavaScript函数,服务器端动态生成的脚本会产生数据,并在代码中以产生的数据为参数调用callback函数。当这段脚本加载到本地文档时,callback函数就被调用。

javascript 同源策略及web安全的更多相关文章

  1. Javascript同源策略对context.getImageData的影响

    在本机测试HTML5 Canvas程序的时候,如果用context.drawImage()后再用context.getImageData()获取图片像素数据的时候会抛出错:SECURITY_ERR: ...

  2. JavaScript——同源策略

    概念:同源策略是客户端脚本(尤其是Javascript)的重要的安全度量标准.它最早出自Netscape Navigator2.0,其目的是防止某个文档或脚本从多个不同源装载.   这里的同源指的是: ...

  3. JavaScript 同源策略

    在JavaScript安全性限制Same-Origin Policy(同源策略)=>JavaScript只能访问与包含它的文档在同一域下的内容. 同源=>域名+协议+端口相同.

  4. javascript 同源策略和 JSONP 的工作原理

    同源策略 同源策略是一个约定,该约定阻止当前脚本获取或操作另一域的内容.同源是指:域名.协议.端口号都相同. 简单地说,A 服务器下的 a 端口执行 ajax 程序,不能获取 B 服务器或者 A 服务 ...

  5. 1.7 xss之同源策略与跨域访问

    同源策略: 同源策略 在web应用的安全模型中是一个重要概念.在这个策略下,web浏览器允许第一个页面的脚本访问第二个页面里的数据,但是也只有在两个页面有相同的源时.源是由URI,主机名,端口号组合而 ...

  6. JavaScript 的同源策略

    同源策略限制了一个源(origin)中加载文本或脚本与来自其它源(origin)中资源的交互方式. 同源定义 如果两个页面拥有相同的协议(protocol),端口(如果指定),和主机,那么这两个页面就 ...

  7. [转]JavaScript 的同源策略

    同源策略限制了一个源(origin)中加载文本或脚本与来自其它源(origin)中资源的交互方式. 同源定义 如果两个页面拥有相同的协议(protocol),端口(如果指定),和主机,那么这两个页面就 ...

  8. javascript中的同源策略

    如果两个页面拥有相同的协议(protocol),端口(如果指定),和主机,那么这两个页面就是属于同一个源 览器有一个很重要的概念——同源策略(Same-Origin Policy).所谓同源是指,域名 ...

  9. JavaScript JSON timer(计时器) AJAX HTTP请求 同源策略 跨域请求

    JSON 介绍 1. JSON: JavaScript Object Notation 是一种轻量级的数据交换格式. 它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是 ...

随机推荐

  1. Springboot集成WebSocket通信全部代码,即扣即用。

    websocket通信主要来自两个类以及一个测试的html页面. MyHandler 和 WebSocketH5Config,下面全部代码 MyHandler类全部代码: package com.un ...

  2. Request.QueryString 的用法

    比如常见的URL网页地址都有 xxx.asp?type=reLogin   ?号后面的就是querystring querystring是asp中获取数据的一个方法. 那么就可以用request.qu ...

  3. JetBrains PyCharm(Professional版本)的下载、安装和初步使用

    不多说,直接上干货! 首先谈及这款软件,博主我用的理由:搞机器学习和深度学习! 想学习Python的同学们,在这里隆重介绍一款 Python 的开发工具 pyCharm IDE.这是我最喜欢的 Pyt ...

  4. 在Eclipse或工作空间中 ,复制或修改项目后,把项目部署后发现还是原来的项目名称

    1 问题引出 1 在eclipse中直接复制一个项目,修改名称之后,然后部署,部署之后的项目名称还有原来的项目名称 2 在eclipse的工作空间中直接复制一个项目,修改名字之后,发布也会出现同样的问 ...

  5. hadoop包含哪些技术?

    1.Hadoop包含哪些技术?Common, Avro, MapReduce, HDFS, Pig, Hive, Hbase, ZooKeeper, Sqoop, Oozie. 2.简介Common: ...

  6. 使用NDK编译含JNI的Android项目常见问题解决方案

    有时候,自己下载的或者拷贝过来的JNI项目出现莫名错误,通常是找不到头文件,可能解决方案如下: Removing the C nature: The only way I could find to ...

  7. fetch将替代ajax?

    原谅我做一次标题党,Ajax 不会死,传统 Ajax 指的是 XMLHttpRequest(XHR),未来现在已被 Fetch 替代. 最近把阿里一个千万级 PV 的数据产品全部由 jQuery 的  ...

  8. Truncated incorrect DOUBLE value: 'NO_REFUND'

    解决办法:Mysql中,如果一个字段是字符串,则一定要加单引号 问题原因: `item_refund_state` ) NOT NULL item_refund_state字段的类型是varchar但 ...

  9. Js的小技巧

    感谢好友破狼提供的这篇好文章,也感谢写这些知识点的作者们和将他们整理到一起的作者.这是github上的一篇文章,在这里本兽也就只做翻译,由于本兽英语水平和编程能力都不咋地,如有不好的地方也请多理解体谅 ...

  10. Java复习第一天

    Day01 1.独立编写Hello World程序. public class Test{ public static void main(String[] args){ System.out.pri ...