`

跨域(cross-domain)访问 cookie (读取和设置)

阅读更多

Passport 一方面意味着用一个帐号可以在不同服务里登录,另一方面就是在一个服务里面登录后可以无障碍的漫游到其他服务里面去。坦白说,目前 sohu passport 在这一点实现的很烂(不过俺的工作就是要把它做好啦,hehe)

搜狐的 SSO 需求比较麻烦,因为它旗下有好多域名:sohu.com、chinaren.com、sogou.com、focus.cn、17173.com、go2map.com,登录用户漫游的主要障碍也来自于此。

以前亿邮的邮件系统在和别的系统整合的时候是提供一个 URL,用户从第三方系统里面点击这个链接就可以生成访问邮件界面所需的 cookie,然后进入邮件。这个方式的确很有效,但问题是:
1. 每个外部链接都必须用特殊的 URL 跳转,维护很麻烦
2. 两个系统集成已经很麻烦了,若是集成的系统有好几个,彼此都需要跳转而缺乏一个中心机制就成了噩梦
3. 根本无法处理用户直接在地址栏输入地址进行访问的情况

即使是跨域,上述的解决方法相对来说还是容易的。
A. 首先是所有登录必须首先通过一个中央服务器进行认证,然后在它那里给浏览器种下 cookie(下面称之为 sso cookie)
B. 当用户访问另外的域名 app 的时候,浏览器是无法直接发送 sso cookie 给服务器认证的。此时应该利用 javascript,动态创建一个隐藏的 iframe,让其访问 sso
C. 这个 iframe 的请求是可以把 sso cookie 送给 sso server 的。sso server 验证 cookie 后,返回一个重定向页面到 app 的某个 URL,由该 URL 设置 app cookie
D. 此时浏览器上可看见的页面容器实际上也是可以和重定向回来的内容交互的。比如可以用 js 控制发现重定向页面成功返回后,就刷新整个页面,让它看起来和用户登录后访问没有什么区别。

下面是真正的技巧:怎样才能在 IE 里面跨域去设置 cookie
上述技术看起来是不是很好?但它的前提是所有的登录都 post 到 sso server 上,认证成功后再返回 app 页面。可我接受到的需求之一就是要支持页面无刷新登录。

哈!就是说本来在 chinaren.com 上提交登录表单的 action 应该是 passport.sohu.com 这个 sso server。可是在 AJAX 大潮下,chinaren 计划采用 XMLHTTPRequest 提交,这个就麻烦了,因为是不能跨域来提交的。

那么解决方法就是跨域产生 cookie,即 js 发现口令校验成功后,再在 passport.sohu.com 上种上合法的 cookie.

套用上面的跨域读 cookie 的方案似乎很简单去推论:就是创建一个隐含的 iframe,让那个 iframe 去调用 passport.sohu.com 的 URL 来产生 cookie。很遗憾,此方法在 Fx 下工作的很好,但是不能在 IE 上应用。(在 IE 状态栏上显示 cookie 隐私警告,红色圆底白横杠)

我试了很多很多方法,包括创建 、 node,包括用 js 设置,但都一次次被 IE 无情的挡在了浏览器外。google 之,也没有任何真正可用的答案,中文网页要么介绍的方法是错的,要么说无解。

最后还是在 chinaren 一哥们的帮助下,翻出了他们所使用的,以和 alumni.sohu.com 交互的方法(不知道是哪位牛人发现的),只需要设置 P3P HTTP Header,在隐含 iframe 里面跨域设置 cookie 就可以成功。他们所用的内容是:

P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"

最后是我做的一个小小的演示:cookie 怎么在 vmx.cn 和 dup2.net 之间交互

1. http://qiuyingbo.test.vmx.cn/cookie.php

2. 随便输入什么,点 reset cookie,就可以看到 vmx.cn 的 cookie 已经被设上了

3. 在该页面点连接到 http://www.dup2.net/vmx/cookie.html

4. 点"get corss-domain cookie" .. (此时 js 会去创建一个iframe,请求 qiuyingbo.test.vmx.cn ,返回页面把 cookie 值作为 GET 参数重定向回 dup2.net 的另外一个URL。)

5. 点 "display corss-domain cookie" .. 就可以看到 vmx.cn 的 cookie 了

6. 在该页面的输入框中输入其它的值,然后点 "set cross-domain cookie",该行为将主动设置 vmx.cn 的 cookie

7. 点链接回到 http://qiuyingbo.test.vmx.cn/cookie.php ,就可以看到新的值了

评论

相关推荐

    P3P 和 跨域 (cross-domain) cookie 访问(读取和设置)

    例如,在IE浏览器中,若要在跨域情况下设置cookie,可以通过在服务器端的响应头中添加P3P策略声明,这样浏览器就能根据P3P声明的隐私政策来决定是否允许跨域cookie访问。 根据提供的文档内容,实现跨域cookie设置的...

    Cross-Domain (XDC) Cookies:支持 HTTP 中的跨域 cookie-开源

    该项目包括一个 Firefox 扩展(通常会嵌入浏览器软件的客户端代码)、一个读取和写入 XDC cookie 的 Web 应用程序、生成证书的支持实用程序以及有关如何配置 Apache HTTP 服务器以提供服务器支持的说明拟议协议要求...

    crossdomain

    "crossdomain"这个关键词与Flex应用和GIS(地理信息系统)服务的交互紧密相关。当Flex应用试图从一个源(例如,本地或者一个不同的服务器)访问另一个源(如地图服务器)上的资源时,浏览器的安全策略——安全沙箱会...

    解决ajax跨域请求数据cookie丢失问题

    crossDomain: true, // 表明请求为跨域请求 success: function() { // 请求成功后的回调函数 successCallback.apply(this, arguments); }, failure: function() { // 请求失败后的回调函数 failureCallback....

    js -- 跨域问题.doc

    跨域会导致Ajax请求别的域的资源失败,无法读取别的域中网页的Cookie、LocalStorage和IndexedDB,无法获取别的域中网页中的DOM对象等。 二、跨域解决方法 跨域问题有多种解决方法,以下是常见的几种方法: (1)...

    解决前后端分离 vue+springboot 跨域 session+cookie失效问题

    2. **设置Session域**:确保Spring Boot应用服务器返回的Set-Cookie响应头中的Path和Domain属性设置正确,以便浏览器在正确的上下文中存储Session ID。 3. **代理服务器**:使用Nginx或其他反向代理服务器,让Vue...

    web跨域完美解决方式

    在Web开发中,"跨域"(Cross Domain)是一个常见的问题,它涉及到浏览器的同源策略,这是一种安全机制,限制了网页只能与同一协议、同一域名、同一端口的资源进行交互。当一个请求试图从一个域访问另一个域的资源时...

    什么是跨域?跨域解决方法.docx

    可以通过设置相同的 document.domain 来解决无法读取非同源网页的 Cookie 问题。 七、跨文档通信 API:window.postMessage() window.postMessage() 方法可以实现父窗口和子窗口之间的通信。子窗口可以通过该方法...

    php跨域cookie共享使用方法

    总的来说,PHP跨域Cookie共享是通过在主域设置Cookie时指定目标域,并在目标域中正确读取Cookie来实现的。需要注意的是,这可能会带来一些安全风险,因为跨域设置Cookie可能导致敏感信息泄露。因此,务必谨慎使用,...

    ajax跨域问题的解决办法.rar

    允许跨域可能会使服务器暴露于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)等风险,因此在设置CORS时应谨慎考虑允许的源和方法。 总结,解决Ajax跨域问题有多种方法,选择哪种取决于项目需求和安全考虑。JSONP适用于...

    JS跨域请求解决方案.docx

    1. **Cookie、LocalStorage和IndexDB**的读取; 2. **DOM和JS对象**的获取; 3. **AJAX请求**的发送。 #### 二、常见的跨域场景 1. **资源跳转**:如通过`A`标签重定向或表单提交至其他域名。 2. **资源嵌入**:...

    asp.net 集合flash使用

    - **利用 Flash Player 的安全性限制**: 通过设置正确的域策略文件(crossdomain.xml),确保 Flash 可以跨域访问 Cookie 数据。 #### 2. Flash 中设置 Cookie Flash 中设置 Cookie 通常也是通过与 ASP.NET 服务端...

    剑指前端offerPDF版.pdf

    - 使用`window.name`属性可以实现在iframe间传递数据,通过设置和读取`iframe`元素的`window.name`属性来实现数据的传递。 - 由于`iframe`元素与父窗口存在不同的域,因此可以利用`window.name`属性的特殊性来进行...

    js前端解决跨域问题的8种方案(最新最全)

    跨域问题通常出现在前端JavaScript代码试图访问不同源的API、读取或写入Cookie等场景。由于安全原因,浏览器严格实施同源策略,防止恶意脚本窃取或篡改用户数据。 【前端解决跨域问题的方案】 1. **文档域设置+...

    FlashSec:存储库旨在编译可在渗透测试期间使用的脚本和工具,以评估不同闪存相关场景的安全性

    Crossdomain.mxml:用 FLEX 编写的脚本,利用宽松的跨域 Flash 策略文件向目标网站发出任意请求。 要编译,只需下载 FLEX SDK(可从)并运行mxmlc : $ ./mxmlc Crossdomain.mxml Loading configuration file C:\...

    uploadify在Firefox下丢失session问题的解决方法

    为此,需要在服务器端提供一个跨域策略文件(crossdomain.xml),允许指定的域名进行带有cookie的请求。 5. **更新或更换插件**:如果以上方法都无效,可能需要考虑升级uploadify到最新版本,或者切换到其他支持...

Global site tag (gtag.js) - Google Analytics