- 浏览: 338609 次
- 性别:
- 来自: 北京
博客专栏
-
高性能PHP框架Yii分析...
浏览量:84898
文章分类
最新评论
-
huxiaoyunhust:
价值观这种东西,说不好听是口号,其实是公司每天潜移默化的感染, ...
关于企业价值观的一点点感悟 -
silentime:
stef831018 写道你想多了,企业价值观就两个字:利益怎 ...
关于企业价值观的一点点感悟 -
stef831018:
你想多了,企业价值观就两个字:利益
关于企业价值观的一点点感悟 -
guoyuqiangf8:
关于企业价值观的一点点感悟 -
silentime:
mangguo 写道推荐大家去看看我写的python入门,可以 ...
python如何打印变量的类型
原文地址:http://www.ued163.com/?p=1800
同源策略
在客户端编程语言中,如JavaScript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意 义。同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法。那么什么叫相同域,什么叫不同的域呢?当两个域具 有相同的协议(如http), 相同的端口(如80),相同的host(如www.example.org),那么我们就可以认为它们是相同的域。比如 http://www.example.org/index.html和http://www.example.org/sub/index.html是 同域,而http://www.example.org, https://www.example.org, http://www.example.org:8080, http://sub.example.org中的任何两个都将构成跨域。同源策略还应该对一些特殊情况做处理,比如限制file协议下脚本的访问权限。 本地的HTML文件在浏览器中是通过file协议打开的,如果脚本能通过file协议访问到硬盘上其它任意文件,就会出现安全隐患,目前IE8还有这样的 隐患。
受到同源策略的影响,跨域资源共享就会受到制约。但是随着人们的实践和浏览器的进步,目前在跨域请求的技巧上,有很多宝贵经验的沉淀和积累。这里我 把跨域资源共享分成两种,一种是单向的数据请求,还有一种是双向的消息通信。接下来我将罗列出常见的一些跨域方式,以下跨域实例的源代码可以从这里获得 。
单向跨域
JSONP
JSONP (JSON with Padding)是一个简单高效的跨域方式,HTML中的script标签可以加载并执行其他域的JavaScript,于是我们可以通过script标 记来动态加载其他域的资源。例如我要从域A的页面pageA加载域B的数据,那么在域B的页面pageB中我以JavaScript的形式声明pageA 需要的数据,然后在pageA中用script标签把pageB加载进来,那么pageB中的脚本就会得以执行。JSONP在此基础上加入了回调函 数,pageB加载完之后会执行pageA中定义的函数,所需要的数据会以参数的形式传递给该函数。JSONP易于实现,但是也会存在一些安全隐患,如果 第三方的脚本随意地执行,那么它就可以篡改页面内容,截获敏感数据。但是在受信任的双方传递数据,JSONP是非常合适的选择。
Flash URLLoader
Flash有自己的一套安全策略,服务器可以通过crossdomain.xml文件来声明能被哪些域的SWF文件访问,SWF也可以通过API来 确定自身能被哪些域的SWF加载。当跨域访问资源时,例如从域www.a.com请求域www.b.com上的数据,我们可以借助Flash来发送 HTTP请求。首先,修改域www.b.com上的crossdomain.xml(一般存放在根目录,如果没有需要手动创建) ,把www.a.com加入到白名单。其次,通过Flash URLLoader发送HTTP请求,最后,通过Flash API把响应结果传递给JavaScript。Flash URLLoader是一种很普遍的跨域解决方案,不过需要支持iOS的话,这个方案就无能为力了。
Access Control
Access Control是比较超越的跨域方式,目前只在很少的浏览器中得以支持,这些浏览器可以发送一个跨域的HTTP请求(Firefox, Google Chrome等通过XMLHTTPRequest实现,IE8下通过XDomainRequest实现),请求的响应必须包含一个Access- Control-Allow-Origin的HTTP响应头,该响应头声明了请求域的可访问权限。例如www.a.com对www.b.com下的 asset.php发送了一个跨域的HTTP请求,那么asset.php必须加入如下的响应头:
header("Access-Control-Allow-Origin: http://www.a.com");
window.name
window对象的name属性是一个很特别的属性,当该window的location变化,然后重新加载,它的name属性可以依然保持不变。 那么我们可以在页面A中用iframe加载其他域的页面B,而页面B中用JavaScript把需要传递的数据赋值给 window.name,iframe加载完成之后,页面A修改iframe的地址,将其变成同域的一个地址,然后就可以读出window.name的值 了。这个方式非常适合单向的数据请求,而且协议简单、安全。不会像JSONP那样不做限制地执行外部脚本。
server proxy
在数据提供方没有提供对JSONP协议或者window.name协议的支持,也没有对其它域开放访问权限时,我们可以通过server proxy的方式来抓取数据。例如当www.a.com域下的页面需要请求www.b.com下的资源文件asset.txt时,直接发送一个指向 www.b.com/asset.txt的ajax请求肯定是会被浏览器阻止。这时,我们在www.a.com下配一个代理,然后把ajax请求绑定到这 个代理路径下,例如www.a.com/proxy/, 然后这个代理发送HTTP请求访问www.b.com下的asset.txt,跨域的HTTP请求是在服务器端进行的,客户端并没有产生跨域的ajax请 求。这个跨域方式不需要和目标资源签订协议,带有侵略性,另外需要注意的是实践中应该对这个代理实施一定程度的保护,比如限制他人使用或者使用频率。
双向跨域
document.domain
通过修改document的domain属性,我们可以在域和子域或者不同的子域之间通信。同域策略认为域和子域隶属于不同的域,比如 www.a.com和sub.a.com是不同的域,这时,我们无法在www.a.com下的页面中调用sub.a.com中定义的JavaScript 方法。但是当我们把它们document的domain属性都修改为a.com,浏览器就会认为它们处于同一个域下,那么我们就可以互相调用对方的 method来通信了。
FIM – Fragment Identitier Messaging
不同的域之间,JavaScript只能做很有限的访问和操作,其实我们利用这些有限的访问权限就可以达到跨域通信的目的了。FIM (Fragment Identitier Messaging)就是在这个大前提下被发明的。父窗口可以对iframe进行URL读写,iframe也可以读写父窗口的URL,URL有一部分被称 为frag,就是#号及其后面的字符,它一般用于浏览器锚点定位,Server端并不关心这部分,应该说HTTP请求过程中不会携带frag,所以这部分 的修改不会产生HTTP请求,但是会产生浏览器历史记录。FIM的原理就是改变URL的frag部分来进行双向通信。每个window通过改变其他 window的location来发送消息,并通过监听自己的URL的变化来接收消息。这个方式的通信会造成一些不必要的浏览器历史记录,而且有些浏览器 不支持onhashchange事件,需要轮询来获知URL的改变,最后,URL在浏览器下有长度限制,这个制约了每次传送的数据量。
Flash LocalConnection
页面上的双向通信也可以通过Flash来解决,Flash API中有LocalConnection这个类,该类允许两个SWF之间通过进程通信,这时SWF可以播放在独立的Flash Player或者AIR中,也可以嵌在HTML页面或者是PDF中。遵循这个通信原则,我们可以在不同域的HTML页面各自嵌套一个SWF来达到相互传递 数据的目的了。SWF通过LocalConnection交换数据是很快的,但是每次的数据量有40kb的大小限制。用这种方式来跨域通信过于复杂,而且 需要了2个SWF文件,实用性不强。
window.postMessage
window.postMessage是HTML5定义的一个很新的方法 ,这个方法可以很方便地跨window通信。由于它是一个很新的方法,所以在很旧和比较旧的浏览器中都无法使用。
Cross Frame
Cross Frame是FIM的一个变种,它借助了一个空白的iframe,不会产生多余的浏览器历史记录,也不需要轮询URL的改变,在可用性和性能上都做了很大 的改观。它的基本原理大致是这样的,假设在域www.a.com上有页面A.html和一个空白代理页面proxyA.html, 另一个域www.b.com上有个页面B.html和一个空白代理页面proxyB.html,A.html需要向B.html中发送消息时,页面会创建 一个隐藏的iframe, iframe的src指向proxyB.html并把message作为URL frag,由于B.html和proxyB.html是同域,所以在iframe加载完成之后,B.html可以获得iframe的URL,然后解析出 message,并移除该iframe。当B.html需要向A.html发送消息时,原理一样。Cross Frame是很好的双向通信方式,而且安全高效,但是它在Opera中无法使用,不过在Opera下面我们可以使用更简单的 window.postMessage来代替。
总结
跨域的方法很多,不同的应用场景我们都可以找到一个最合适的解决方案。比如单向的数据请求,我们应该优先选择JSONP或者 window.name,双向通信我们采取Cross Frame,在未与数据提供方没有达成通信协议的情况下我们也可以用server proxy的方式来抓取数据。
发表评论
-
【转】npm用法及离线安装方法
2015-06-15 14:44 2700原文转自:https://cnodejs.org/to ... -
[转]PHP的内存管理
2015-05-11 22:03 885原文出处:http://blogread.cn/it/ar ... -
《高性能PHP应用开发》读书笔记
2014-12-24 09:20 794注:只记录了一些关键点,部分知识点/内容请看到的朋友 ... -
HTTP API Design Guide(HTTP API接口设计指南)
2014-09-09 18:27 3511原文在这里:https://github.com/inte ... -
IE系列不支持圆角等CSS3属性的解决方案
2013-07-23 23:38 1279IE系列浏览器不支持CSS的圆角(border-radius ... -
[转]HTTP缓存算法
2013-01-04 14:34 1350原文地址:http://www.p ... -
【转】漫谈社区PHP 业务开发
2012-11-19 10:07 1117原文地址:http://stblog.baidu-tech.c ... -
【转】javascript中的urlencode
2012-09-20 23:04 1149原文地址:http://www.cnblo ... -
Yii分析13:Yii核心组件之AssetManager
2012-04-10 00:37 4396我们通过使用来讲解CAssetManager的使用和工 ... -
Yii分析12:Yii核心web组件之会话类CHttpSession
2012-03-06 09:44 3228CHttpSession提供session级的数据管理和配置 ... -
Yii分析11:Yii核心组件之错误处理类CErrorHandler
2012-02-24 09:57 4133类如其名,CErrorHandler在Yii中主要的功能 ... -
Yii分析10:Yii核心组件之数据库类CDbConnection
2012-02-17 09:18 8538数据库类几乎是每个PHP框架必不可少的组件之一,Yii的 ... -
Javascript面向对象之十装饰者模式-《javascript设计模式》笔记
2012-01-18 14:59 1490装饰者模式的含义是将要装饰的对象作为一个成员放在装饰者的内部, ... -
Javascript面向对象之九适配器模式-《javascript设计模式》笔记
2012-01-18 14:58 1304关于适配器模式的定义:适配器模式(有时候也称包装样式或者包装) ... -
Javascript面向对象之八门面模式-《javascript设计模式》笔记
2012-01-17 14:43 1346关于门面模式的定义:门面模式为了系统提供一个 统一的高层接口供 ... -
Javascript面向对象之七组合模式-《javascript设计模式》笔记
2012-01-17 14:42 1376关于组合模式的定义:组合模式(Composite Patter ... -
Javascript面向对象之五工厂模式-《javascript设计模式》笔记
2012-01-13 11:31 1197工厂模式和单例模式(http://blog.sina.com. ... -
Javascript面向对象之四链式调用-《javascript设计模式》笔记
2011-12-30 14:22 13761.链式调用:jquery可能是目前大家最常用到的js框架了, ... -
Javascript面向对象之三单例模式-《javascript设计模式》笔记
2011-12-30 14:21 13091.单例模式概述源自百 ... -
Javascript面向对象之二继承-《javascript设计模式》笔记
2011-12-29 10:49 11631.关于继承:百度百科对继承的解释是:继承是指一个对象直接使用 ...
相关推荐
标题"10种方式实现跨域资源的共享"暗示了我们将探讨多种克服同源策略限制的方法。以下是一些主要的跨域资源共享实现方式: 1. **JSONP(JSON with Padding)**: JSONP是一种较早的跨域方法,通过动态插入`<script>`...
然而,随着Web服务的复杂性和交互性增加,跨域资源共享(CORS)和会话(Session)共享成为开发者需要面对的重要问题。本文将详细讲解如何在Spring Boot应用中解决跨域session共享的问题,并探讨防止SQL注入的相关...
跨域资源共享(CORS)是一种安全机制,允许一个域(网站)上的Web应用访问另一个域上的资源。随着Web应用变得越来越复杂,为了增强用户体验,经常需要在一个域名下发起对另一个域名的HTTP请求。CORS的出现解决了...
跨域的方法很多,不同的应用场景我们都可以找到一个最合适的解决方案。比如单向的数据请求,我们应该优先选择JSONP或者window.name,双向通信我们采取Cross Frame,在未与数据提供方没有达成通信协议的情况下我们也...
本文档介绍了在SpringBoot应用中实现跨域资源共享的5种方式,包括使用CorsFilter、重写WebMvcConfigurer、使用注解@CrossOrigin、手动设置响应头以及在SpringBoot 2.4.x中对@CrossOrigin的支持情况。 首先,通过...
### CORS跨域资源共享及其解决方案详解 #### 一、CORS跨域资源共享背景 在现代Web应用开发中,前后端分离已成为一种主流趋势。在这种模式下,前端负责展示逻辑,而后端处理业务逻辑与数据交互。然而,由于浏览器...
跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种机制,旨在允许Web应用程序向不同源的服务器请求数据,而不会受到浏览器的同源策略限制。这一功能对于现代Web应用的开发至关重要,因为它允许开发者构建...
CORS(跨域资源共享)是Web开发中解决跨域访问问题的一种机制,它允许浏览器在遵循同源策略的前提下,通过特定的HTTP头部与服务器通信,从而实现不同源之间的资源访问。这种机制是为了解决现代Web应用中由于同源策略...
然而,随着Web应用的发展,跨域数据交互的需求日益增多,因此催生了一系列跨域解决方案,包括JSONP、Flash、Iframe以及CORS(跨域资源共享,Cross-Origin Resource Sharing)。 首先,JSONP(JSON with Padding)是...
**SpringBoot + Ajax + CORS 前后端分离:跨域资源共享详解** 在现代Web开发中,前后端分离已经成为一种常见的架构模式。SpringBoot作为Java领域的一个轻量级框架,常用于构建后端服务,而Ajax则在前端用于实现异步...
在实际应用中,以下两种技术常用于跨域资源请求: 1. **配置反向代理**:反向代理服务器(如Nginx或Apache)可以接收来自不同源的请求,并将它们转发到同一源的资源。这样,不同域名的客户端可以通过代理服务器访问...
因此,在开发涉及跨域资源共享的应用时,开发者应该参考各浏览器的文档,确保应用的兼容性和安全性。 综上所述,跨域图片资源权限(CORS enabled image)对于网站开发者来说是一个重要的安全特性,它在提供便利的...
跨域资源共享(Cross-Origin Resource Sharing,简称CORS)是一种安全机制,用于控制一个域下的资源被另一个域所访问。本文将介绍Django实现跨域的两种主要方法,即使用JSONP(JSON with Padding)和CORS(Cross-...
因此,跨域资源共享成为了一项挑战,但也催生了许多创新的解决策略。这些策略通常分为两类:单向数据请求和双向消息通信。 1. JSONP(JSON with Padding): JSONP是一种简单的跨域解决方案,通过动态插入`...
在现代Web应用开发中,数据共享和跨域访问是常见的需求。Spring Boot作为一个轻量级的框架,提供了方便快捷的方式来实现这些功能。本教程将详细讲解如何在Spring Boot项目中利用Redis来存储和共享Session,并解决...
跨域资源共享(CORS,Cross-Origin Resource Sharing)是一种机制,允许浏览器在执行JavaScript时,通过HTTP请求访问不同源的资源。这种机制是为了安全考虑,防止恶意脚本从一个站点窃取另一个站点的数据。在传统的...
跨域资源共享CORS(Cross-origin Resource Sharing),是W3C的一个标准,允许浏览器向跨源的服务器发起XMLHttpRequest请求,克服ajax请求只能同源使用的限制。关于CORS的详细解读,可参考阮一峰大神的博客:跨域资源...
为了解决这个问题,我们需要使用CORS(Cross-Origin Resource Sharing,跨源资源共享)机制。 实现跨域上传文件的关键在于服务器端的配置和客户端的请求处理。在.NET中,我们可以使用ASP.NET MVC或者ASP.NET Core来...
跨域资源共享(CORS,Cross-Origin Resource Sharing)是现代Web应用中解决浏览器同源策略限制的一种机制。同源策略是浏览器安全的一项重要措施,它禁止了来自不同源的"脚本"获取或操作网页上的资源,例如...