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

第三方 cookie 写入问题

阅读更多

场景:

xx.com/y.html 代码为:

 

<iframe id='ok' name='ok' src='http://zz.com/w.htm?authKey=ertwg'></iframe>

 

w.htm 需要根据 authKey 写入 cookie ,授权 y.html 嵌入 zz.com 站点的其他页面(例如即时重定向到另一个页面显示写入的 cookie )。

 

w.htm 内容为:

 

if (request.getParameter("authKey") != null) {
			response.addCookie(new Cookie("logined", "ok"));
			response.sendRedirect(request.getContextPath() + request.getServletPath());

		} else {
			Cookie[] cs = request.getCookies();
			if (cs != null) {
				for (Cookie c : cs) {
					if (c.getName().equals("logined")) {
						response.getWriter().println("logined : " + c.getValue());
					}
				}
			}

		}

问题 :

但是在 ie6,7 以及 safari 中发现 cookie 并没有被写入,重定向的读页面读不出刚刚设置的cookie。

解决:

涉及到 p3p 简洁策略 的设置以及在 safari 下的特殊处理:

ie6,7

需要在 w.htm 的返回响应中加入 p3p 简明策略响应头:

 

// ie need this
response.addHeader("P3P", "CP=\"CAO PSA OUR\"");
 

允许在嵌入自己情况下写入cookie。

safari

不能直接通过 iframe.src 来请求第三方页面,需要通过表单 post 提交来允许第三方页面 cookie 写入 :

 

S.use("ua,dom", function(S, UA, DOM) {
    var ok = S.get("#ok");
    var action = "http://zz.com/w.htm?authKey=ssdf";
    if (UA.safari) {
        var form = DOM.create("<form " +
                " method='post' " +
                "action='" + action + "'" +
                " target='ok'" +
                " style='position: absolute;left: -9999;top: -9999px'>");
        DOM.append(form,document.body);
        DOM.append(DOM.create("<input name='authKey' value='ssdf'/>"), form);
        form.submit();
    } else {
        ok.src = action;
    }
});
 

 

update 2011-05-26

 

1.该问题和 iframe 没有关系,只要是当前页面往第三方页面发送 get 请求,该 get 请求无论是通过 iframe发送,还是通过 img.src 或者通过 script.src ,第三方页面都会写不进 cookie.

 

2.多次重定向以及 https 情景下依然可用。

 

 

场景:

 

http://a.com/demo.html 嵌入 iframe 页面 http://b.com/cookie.htm?set=2

 

a.com/demo.html :

 

<iframe src='http://b.com/cookie.htm?set=2'></iframe>

 

b.com/cookie.htm :

 

if (request.getParameter("set") != null) {
			// ie need this
			//response.addHeader("P3P", "CP=\"CAO PSA OUR\"");
			String set = request.getParameter("set");
			if (set.equals("1")) {
				System.out.println(request.getPathInfo());
				response.addCookie(new Cookie("logined", "ok"));
				response.sendRedirect(request.getContextPath() + request.getServletPath());
			} else {
				response.sendRedirect("https://a.com/iframe_post.html");
			}
		} else {
			Cookie[] cs = request.getCookies();
			if (cs != null) {
				for (Cookie c : cs) {
					if (c.getName().equals("logined")) {
						response.getWriter().println("logined : " + c.getValue());
					}
				}
			}

		}

 

会使得 a.com 中的 iframe 跳转多次,

 

iframe -> b.com/cookie.htm?set=2 -> https://a.com/iframe_post.htm

 

a.com/iframe_post.htm 会再次发送请求给 b.com/cookie.htm?set=1 ,这时会设置 cookie:

 

a.com/iframe_post.htm :

 

<meta charset='utf-8'/>
<script type="text/javascript" src="../../base/javascript/kissy.js"></script>
<script type="text/javascript">
    KISSY.ready(function(S) {
        S.use("ua,dom", function(S, UA, DOM) {
            var ok = S.get("#ok");
            var action = "https://b.com/cookies?set=1";
            if (UA.safari) {
                var form = DOM.create("<form " +
                        " method='post' " +
                        "action='" + action + "'" +
                       
                        " style='position: absolute;left: -9999;top: -9999px'>");
                DOM.append(form,document.body);
                DOM.append(DOM.create("<input name='set' value='1'/>"), form);
                form.submit();

            } else {
                window.location = action;
            }
        });
    });
</script>
 

关键在于设置 cookie 前的这一请求在 safari 下必须为 post 过去的!即 a.com/iframe_post.html 中的 UA 判断,通过 form 提交使得自身跳转到 b.com/cookie.htm

 

 

 

 

 

 

分享到:
评论

相关推荐

    Android下登录Demo(使用了读写Cookie操作)

    OkHttp还支持使用`CookieJar`接口,可以配合第三方库如`Square`s `Jsoup`来实现Cookie的存储和读取。 在登录Demo中,通常的步骤如下: 1. 用户输入用户名和密码,点击登录按钮。 2. 发送登录请求到服务器,服务器...

    百度知道第三方用户系统接入开发接口文档V2.1.doc

    【百度知道第三方用户系统接入开发接口文档V2.1】主要介绍了如何使第三方用户系统与百度知道平台进行集成,以实现用户身份验证、登录、登出及注册等功能。以下是相关知识点的详细说明: 1. **用户登录接口**: - ...

    cookie管理.rar

    6. **Cookie策略**:网站可以设置Cookie策略,比如仅限第一方Cookie、禁止第三方Cookie等。这有助于控制用户数据的使用,并符合GDPR等数据保护法规。 7. **用户控制**:用户可以在浏览器设置中管理Cookie,选择接受...

    Django的cookie跨域问题解决方法

    1. **CORS Middleware**:Django CORS Headers是一个第三方中间件,可以方便地管理允许跨域请求的域。安装该中间件后,通过配置`CORS_ORIGIN_WHITELIST`,可以指定允许跨域的域名列表。例如: ```python INSTALLED...

    delphi 使用cookies

    在Delphi中,我们可以利用第三方库或内置的HTTP组件来与Cookies交互。 二、Delphi处理Cookies的方法 1. Indy库:Indy是一个强大的网络组件库,包含了一系列用于HTTP通信的组件,如TIdHTTP。通过TIdHTTP的Cookie...

    cookie

    1. **发送HTTP请求**:使用Java的`HttpURLConnection`或第三方库如Apache HttpClient,发送GET、POST等请求。 2. **设置Cookie**:在请求头中添加Cookie信息,以维持会话状态。 3. **解析响应Cookie**:从HTTP响应头...

    cookie编辑器

    2. **隐私风险**:虽然编辑Cookie可以帮助保护隐私,但过度依赖或滥用也可能暴露个人偏好,甚至让恶意第三方有机会利用。 3. **版本兼容**:不同的浏览器和系统可能需要特定版本的Cookie编辑器,使用前要确保编辑器...

    JavaScript实现cookie的写入、读取、删除功能

    最后,考虑到用户隐私和安全,应该谨慎使用Cookie,尤其是第三方Cookie,因为它们可能用于追踪用户的行为。现代浏览器提供了更多的隐私控制选项,允许用户选择接受哪些网站的Cookie。 了解并掌握Cookie的基本操作是...

    基于cookie实现ztree树刷新后,展开状态不变-demo

    - 对于安全性,不要在`Cookie`中存储敏感信息,因为它们可以被第三方获取。 5. **代码示例**: 通常会有一个初始化函数,如`initTree`,在这个函数中,先读取`Cookie`,然后设置`ZTree`的状态。同时,为`ZTree`的...

    一个简单的轻量级JavaScript API,用于处理浏览器cookie.zip

    使用js-cookie时,应考虑到安全和隐私问题,避免存储敏感信息,因为Cookie默认情况下会随着HTTP请求发送,可能被第三方拦截。同时,合理设置过期时间和作用域,防止内存泄漏和不必要的数据暴露。 10. **文档和社区...

    JavaScript检测浏览器cookie是否已经启动的方法

    JavaScript检测浏览器cookie是否已经启动,代码稍显复杂,通过写入一个测试cookie判断cookie是否已经启动 var dt = new Date(); dt.setSeconds(dt.getSeconds() + 60); [removed] = cookietest=1; expires= + dt....

    sso-user-cookie.zip

    - 使用Cookie实现SSO,需要考虑跨域问题,确保所有应用系统能够访问到同一Cookie。 - 认证中心需要具备处理登录请求、验证用户凭证、生成和解析令牌的能力。 - 应用系统需要配置以信任认证中心的令牌,并能正确...

    jQuery操作cookie方法实例教程

    jQuery库并没有内置的cookie管理函数,但可以通过第三方插件如`jquery-cookie`来实现。在这个教程中,我们将使用`$.cookie`这个函数,它是一个模拟的API,用于简化cookie的操作。 **写入Cookie** 写入cookie使用`$....

    写入cookie后只显示一次的DIV提示框代码

    记住,对于敏感数据,不应使用Cookie存储,因为它可以通过HTTP请求被第三方获取。对于更安全的本地存储,可以考虑使用Web Storage(localStorage或sessionStorage)。 总结一下,这个知识点主要涉及了以下几个方面...

    如何在纯HTML的静态网页中添加一段统计网页访问量的JAVAScript代码.pdf

    这个问题的解决方案可以分为两个部分:第一部分是注册第三方服务网站,第二部分是直接在网站上添加代码。 注册第三方服务网站 在网站上进行流量统计可以找第三方服务网站去注册。这些服务网站通常提供了统计网页...

    C#中Cookie之存储对象

    在.NET框架中,我们可以利用第三方库如Newtonsoft.Json来实现JSON序列化和反序列化。首先,确保已经下载并引用了Newtonsoft.Json.dll库,这个库提供了方便的JsonConvert类,可以方便地进行对象与JSON字符串之间的...

    Forms身份认证在IE11下无法保存Cookie的问题

    - **隐私设置**:用户的浏览器隐私设置可能阻止了第三方Cookie或所有Cookie的存储。 - **P3P政策**:Internet Explorer要求网站提供P3P(平台用于隐私偏好)政策,以允许跨站点脚本设置Cookie。 - **Session问题*...

    awesome-cookie-manager:很棒的Cookie管理员

    在JavaScript环境中,Cookie的操作通常需要借助于内置的Document对象或第三方库。然而,Awesome Cookie Manager通过提供直观的用户界面,简化了这一过程,让用户无需编写任何代码就能实现对Cookie的精细化控制。这...

Global site tag (gtag.js) - Google Analytics