`
yiminghe
  • 浏览: 1432728 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

同源访问与cookie

阅读更多

起因:


  组件采用很常见的无刷新上传文件 方式,但在某处应用一直抛出异常:permission denied 以及 domain 相关的错误,仔细排查原来是调用页面设置了 document.domain ,借此机会总结下。



同源策略:


  每个页面都包含两个概念:origin(源)以及 effective script origin


   origin:


有三个组成部分约束,协议scheme,host,port,形成三元组,两个不同源比较正是比较这三个部分。( host 间是完全比较,子域名间相互包含也认为不相同而不能互相访问)


   effective script origin:


默认和 origin 一样,但是可以经由 document.domain 设置 host 与 port 部分,并且一旦设置, port 部分会变成特殊值:"manual override" ,这个值除了和"manual override"相同外不和其他任何值相同。但是要注意的是


1. domain 只能设宽泛,比如页面 xx.iteye.com 的domain可设置为 iteye.com ,但是不能互逆,并且设置只能越来越宽泛,一旦页面 y.xx.com 设置了 xx.com 那么这个页面就再也不能重新设置 domain 为 y.xx.com.

 

2. 对于国际化域名,domain 不能设置太宽泛,比如 xx.javaeye.co.us 的最多可设 javaeye.co.us,而不能是 co.us

 

3. 共享域名的情况要特别注意,最好不要设置domain,否则xx.com 可能会被 xx.com:8080 的页面访问,引发同源保护失效(设置了domain,port就变成"manual override"!).


页面互访规则:


两页面能够互相访问正是比较两个 effective script origin 是否相同,相同的话则可以互相访问,比如 主页面嵌入了一个同一个域名下的子页面,那么如果主页面设置了 document.domain ,那么子页面也必须设置相同的值,否则两者就不能互相通信了,这也正是开头场景遇到的问题。

 

demo @ google code

解决:


对于开头的错误,原先可能 server 端只需返回:

 

{"url":"http://xx/y.jpg"}
 

我们只需访问 iframe.contentDocument.body.innerHTML 来访问浏览器 parse 好的内容,而如果主页面设置了 domain :

 

document.domain='xx.com';
 

那么server 现在需要返回的 iframe 内容需要加入对应的设置相同 domain 脚本:

 

<html>
<head>
<script>
    document.domain="xx.com";    
</script>
</head>
<body>
{ "url":"http://xx.com/sns_album/i3/y.jpg"}
</body>
</html>
 

将脚本单独放在 head 中和 body 分开,则仍然可以取 body 内容,否则脚本会和 body 混合在一起。


延伸:


由于 XHR 也会受到同源策略的影响:

 

y.xx.com 页面不可以发送 xhr 请求给 xx.com ,但是如果在 y.xx.com 设置 domain=xx.com ,就可以发了 (当然仍然可以给 y.xx.com 发送接收 xhr),但是无论怎么设都不可以往 z.xx.com 发送请求,因为 domain 只能设置当前页面 hostname 的后缀!

 

 

另一方面 XHR 作为数据传输技术,没法执行 domain 设置脚本,不过有人已经实现了通过设置 domain 的iframe作为中转层进行通信 , KISSY io 也对此进行了支持。推荐比较简单的替代方案为:JSONP

 

Cookie

 

但是同源策略却和 cookie 完全没有关系, cookie 是自己独立的一套规则 (甚至和访问的 port 端口都没有关系):


0. 注意 cookie 总大小(4k)以及个数(20) 的所有浏览器支持的极端限制


1. 通过服务器 Set-Cookie 或客户端 document.cookie= 进行添加,如果添加后,


 1.1 当前页面的cookie(本host以及host后缀域)总大小 (name=value;串)大于 4096 byte 则添加无效。


 1.2 当前添加域的cookie个数超过上限,添加无效 


通过设置 expire 小于当前事件来控制 cookie 删除.如果不设置 expire,则该 cookie 为 session cookie,浏览器关闭后自动删除。


2. 访问一个页面前,首先列出当前 host 下以及当前 host 的后缀系列下设置的 cookie 列表


3. 对 2 的列表进行循环过滤


   3.1 path 是当前页面的 path 的前缀,进入 3.2 ,否则不发

   3.2 secure == true 并且 页面不是 https ,不发,否则进入 3.3

   3.3 按照 host 以及 path,越特殊的越靠前,(选取个数上限的cookie ? 不确定 !),以name=value;拼成字符串,发送往服务器,(根据 1.1 这个串不大于 4096 byte)

 

reference :


same origin w3 规范


document.domain @ MDC


Same_origin_policy_for_JavaScript @ MDC


Same-origin policy for file: URIs @ MDC


About Cross-Frame Scripting and Security @ MSDN


How to make XMLHttpRequest calls to another server in your domain @ ajaxian

 

 

 

 

 

分享到:
评论

相关推荐

    cookie访问限制ip

    js控制 cookie访问限制ip,有些兼容性问题,需要自行修改,

    jQuery访问浏览器本地存储cookie、localStorage和sessionStorage的基本用法

    前言:cookie,localStorage和...cookie的访问和设置需要导入jquery.cookie.js文件; 浏览器对每一个访问的地址下可添加的cookie是有限制的;同时每个浏览器可添加的cookie个数也存在限制。 作用: 储存用户的痕迹信息

    JavaScript cookie 跨域访问之广告推广

    在实际应用中, 跨域使用...A网页所在的站点和某东某宝的站点肯定是独立的两个域名,在A网页中访问某东某宝的cookie是拿不到滴,因为不同源,那么 在A网页中的本身去呈现商品信息是做不到而且也不合适。 当然就要通

    利用Nginx反向代理解决跨域问题详解

    在之前的分享的跨域资源共享的文章中,有提到要注意跨域时,如果要发送Cookie,Access-Control-Allow-Origin就不能设为*,必须指定明确的、与请求网页一致的域名。在此次项目开发中与他人协作中就遇到此类问题。 ...

    .Net Core Cors中间件的深入讲解

    用户访问两个网站A/B,并登录了A网站,A网站会在计算机本地存储Cookie或者Token等等,在访问B网站的时候,B网站就可以访问这些本地的存储信息,B网站可以使用用户的Cookie去登录A网站,那这样用户信息就被泄露了。...

    端到端安全协议的威胁、演进和部署.pdf

    出于安全的目的,Web浏览器的同源策略(Same Origin Policy)限制了跨域的网络资源访问。然而,开发者由于业务的需要许多时候必须访问跨域的资源。跨域资源共享CORS(Cross-Origin Resource Sharing)是目前解决跨域...

    WebApi 跨域问题解决方案:CORS

    同源策略:出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容。 正是由于这个原因,我们不同项目之间的调用就会被浏览器阻止。比如我们最常见的场景:WebApi作为...

    WebApi跨域demon

    同源策略:出于安全考虑,浏览器会限制脚本中发起的跨站请求,浏览器要求JavaScript或Cookie只能访问同域下的内容。 正是由于这个原因,我们不同项目之间的调用就会被浏览器阻止。比如我们最常见的场景:WebApi作为...

    你可能不知道的CORS跨域资源共享

    默认情况下,为预防某些而已行为,浏览器的XHR对象只能访问来源于同一个域中的资源。但是我们在日常实际开发中,常常会遇到跨域请求的需求,因此就出现了一种跨域请求的方案:CORS(Cross-Origin Resource Sharing)...

    JS跨域解决方案之使用CORS实现跨域

     跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),因为我们在日常的项目开发时会不可避免的需要进行跨域...

    jQuery使用ajax跨域请求获取数据

    跨域是我在日常面试中经常会问到的问题,这词在前端界出现的频率不低,主要原因还是由于安全限制(同源策略, 即JavaScript或Cookie只能访问同域下的内容),因为我们在日常的项目开发时会不可避免的需要进行跨域操作...

    精通AngularJS part1

    防止cookie监听、中间人攻击194 防止跨站脚本攻击195 确保AngularJS表达式内HTML内容的安全性195 允许不安全的HTML绑定196 净化HTML196 防止JSON注入攻击197 防止跨站请求伪造198 74客户端安全198 创建...

    详解Ajax跨域(jsonp) 调用JAVA后台

    它允许在服务器端生成script tags返回至客户端,通过javascript callback的形式来实现站点访问。 JSONP是一种script tag的注入,将server返回的response添加到页面实现特定功能。 2.JSONP由来 要解释JSONP的来由,先...

    Ajax请求WebService跨域问题的解决方案

    原因分析:浏览器同源策略的影响(即JavaScript或Cookie只能访问同域下的内容); 3、解决方案: (1) JSONP:只支持GET方式 (2) CROS:跨域资源共享 以下为CROS解决方案:  a.在WebService接口加上响应头信息:  b....

    乐优商城.xmind

    它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。 原理 简单请求 当浏览器发现发现的ajax请求是简单请求时,会在请求头中携带一个字段:Origin 如果服务器允许跨域,...

    JavaScript高级教程

    第 1 章 JavaScript 是什么...............................................1 3 1.1 历史简述..............................................1 1.2 JavaScript 实现................................................

Global site tag (gtag.js) - Google Analytics