`
yiminghe
  • 浏览: 1460241 次
  • 性别: 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安全策略

    HttpOnly属性可以防止JavaScript访问Cookie,从而减少Cookie被篡改或窃取的风险。然而,尽管Cookie安全策略比同源策略更为严格,但JavaScript依然可以通过某些方式绕过限制,如改变Cookie的Path属性。 【Flash安全...

    cookie访问限制ip

    这样,只有与指定IP地址匹配的客户端才能访问这个Cookie。 然而,这种方法并非完美无缺,因为它依赖于JavaScript在客户端运行,而恶意用户可能会禁用或绕过JavaScript。此外,它不适用于跨域设置Cookie,因为浏览器...

    跨域访问解决方案,关于跨域访问cookie的资料

    #### 二、关于跨域访问Cookie的处理 在跨域访问中处理Cookie是一项重要的任务,因为Cookie往往包含用户的认证信息。在跨域请求中,默认情况下Cookie不会被发送。因此,在某些场景下需要显式地配置服务器端允许发送...

    jquery.cookie.js 以及用法 cookie读取与存储

    请注意,由于同源策略的限制,Cookie只能在创建它的域内读取。跨域读写Cookie可能涉及安全问题,需谨慎处理。此外,由于HTTP-only标志的存在,JavaScript可能无法访问某些Cookie,这是为了防止XSS攻击。 ### 8. ...

    JS添加Cookie的例子

    比如,同源策略限制了跨域访问Cookie,而HTTP Only属性可以防止JavaScript代码访问某些敏感的Cookie,以降低XSS攻击的风险。此外,Cookie大小有限制,一般不超过4KB,因此不适合存储大量数据。 总的来说,...

    .net最完整的cookie操作类

    - **同源策略**:默认情况下,JavaScript只能访问同源的Cookie,可以通过设置`withCredentials`为true在AJAX请求中跨越。 总结,".net最完整的cookie操作类"是一个为了简化和增强.NET平台下Cookie管理而设计的...

    Cookie实验成果

    - **同源策略**:理解Cookie的同源策略,即只有来自同一源的请求才能访问该源的Cookie。 - **Cookie的生命周期**:了解Cookie的生命周期是如何设定的,以及默认情况下浏览器如何处理过期的Cookie。 由于“Cookie...

    jquery.cookie

    `httpOnly`选项可以防止JavaScript访问cookie,增加安全性,但jQuery.cookie不直接支持这个选项,需要在服务器端设置。 三、跨域与同源策略 由于浏览器的同源策略限制,通常一个页面只能访问属于同一域的cookie。...

    documentCookie的使用

    - **安全性**:Cookie遵循同源策略,即只能由设置它们的域下的页面访问,其他站点无法访问。 - **隐私保护**:用户可以在浏览器设置中选择禁用或清除Cookie,影响网站的个性化功能和用户追踪。 6. **设置Cookie的...

    关于Iframe如何跨域访问Cookie和Session的解决方法

    本文主要探讨如何解决Iframe跨域访问Cookie和Session的问题。 首先,理解跨域访问的基本概念。在Web浏览器的安全策略中,同源策略(Same-origin policy)禁止了一个源(协议+域名+端口)的文档或脚本直接获取另一个...

    safari,opera嵌入iframe页面cookie读取问题解决方法

    Safari和Opera等浏览器遵循一种称为“同源策略”的安全机制,它限制了不同源之间的交互,包括读取cookie。在用户未直接访问过iframe加载的源的情况下,这些浏览器会阻止iframe内的页面读取或设置cookie。为了解决这...

    cookie保存并读取用户登录信息

    9. **跨域问题**:Cookie有同源策略限制,即只能在创建它的域内读取。如果应用涉及到跨域,需要考虑如何处理跨域登录。 理解并掌握以上知识点,有助于开发者构建安全、便捷的自动登录系统。在实际开发中,还需关注...

    PHP程序设计-3期(KC016) 3.11.3服务端访问常见问题cookie.docx

    在3.11.3章节中,我们将聚焦于服务端访问Cookie时常见的问题,这对于初学者来说是至关重要的学习环节。 问题1:获取Cookie的值 在PHP中,我们通常使用全局数组$_COOKIE来访问存储在客户端的Cookie。当服务器接收到...

    Dubbox跨域请求、Cookie设置

    默认情况下,浏览器只会发送同源的Cookie。如果需要在跨域请求中携带Cookie,可以设置`Access-Control-Allow-Credentials`响应头为`true`,同时确保服务器端允许携带credentials的请求。 例如,在上述的CorsFilter...

    Cookie自动登录用户名密码

    这个Cookie通常包含一个唯一的会话ID,与数据库中用户的登录信息关联。这样,当用户下次访问时,浏览器自动发送这个Cookie,服务器通过识别Cookie中的会话ID来确认用户的身份,从而实现无感知的自动登录。 实现专业...

    cookie 文档

    - **HttpOnly**:防止JavaScript通过document.cookie访问Cookie,增加安全性。 3. **Cookie的应用场景** - **会话管理**: 识别用户会话,如保持登录状态。 - **个性化设置**: 存储用户偏好,如页面布局、字体...

    cookie之困

    将Cookie标记为`HttpOnly`可以防止JavaScript脚本访问Cookie,降低跨站脚本攻击的风险。 ##### 3. 设置Secure属性 对于需要安全传输的Cookie,应设置`Secure`属性,确保只有在HTTPS连接下才会发送该Cookie。 #####...

    js做的cookie记忆功能

    7. **兼容性与最佳实践**:考虑到跨域、同源策略和不同浏览器的差异,确保你的cookie实现能在主流浏览器中正常工作。同时,现代Web应用可能更倾向于使用localStorage或sessionStorage,因为它们提供了更大的存储容量...

    浏览器cookie获取插件Demo.rar

    5. **跨域问题**:由于浏览器的同源策略限制,JavaScript通常只能访问同源(协议、域名和端口相同)的Cookie。为了跨越这个限制,插件可能利用了浏览器插件的权限,允许读取不同源的Cookie。 6. **安全与隐私**:在...

    利用COOKIE保存层拖动数据实例

    8. **跨域问题**:Cookie有同源策略限制,即只能由创建它的域读取,因此在处理多域名环境时,需要特别注意Cookie的设置,确保数据能在正确的站点之间共享。 通过上述方法,我们可以实现更加个性化的Web应用,让用户...

Global site tag (gtag.js) - Google Analytics