`
yiminghe
  • 浏览: 1428472 次
  • 性别: 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

 

 

 

 

 

 

分享到:
评论

相关推荐

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

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

    修改MaxFieldLength与MaxRequestBytes彻底解决Request Too Long的问题

    博客园服务器曾遭遇过这个问题,我为此写过一篇博文(cnzz统计代码引起的Bad Request – Request Too Long),问题的原因是第三方统计服务cnzz的统计代码写入大量的cookie,请求时会携带着这些cookie,从而造成请求...

    Android代码-一个经过充分测试和线上验证的Android客户端自定义数据埋点SDK

    目前, 市面上 做统计的第三方平台有很多, 比如最出名的Google的GTM统计,友盟统计等等. 但是 这些统计, 第一点,就是上传的频率,比较固定, 难以满足要求不同的频次需求. 第二点,需要统计到的字段和规则都是死板

    go web编程

    8.5 第三方Go测试库 217 8.5.1 Gocheck测试包简介 217 8.5.2 Ginkgo测试框架简介 223 8.6 小结 228 第9章 发挥Go的并发优势 230 9.1 并发与并行的区别 230 9.2 goroutine 232 9.2.1 使用...

    开源电子商务iWebShop系统(网店) v5.5.190303.zip

    2. 高安全性,独立自主,所有的程序数据,交易记录,商品图片信息等都安全的放到自己的服务器里面,不需要依赖任何第三方,不受任何第三方约束,你的就是你的! 3. 产品品质突出,无论从代码的架构设计,还是从编写...

    精易模块[源码] V5.15

    6、新增“类_任务栏”可以显示隐藏任何第三方窗口图标,相当于易中的(不在任务栏显示),带【实例】演示。 7、新增“类_线程池1”中的“等待”方法。 8、修复“编码_Utf8到Ansi“分配内存失败BUG,感谢易友【仁鹰】...

    闪灵CMS新闻门户系统(含小程序)

    优化:https模式下对第三方分享代码做了兼容3.优化:联系页面百度地图的调用增加了对https协议的支持闪灵CMS新闻门户系统 v5.0 build20191018更新说明1.修复:修复了在同步本地文件到OSS时一个文件出错就终止上传的...

    《ASP.NET与数据库程序设计》

    第三章表单基本设计 3-1 HTML Control 3-1-1在网页动态显示图片 3-1-2上传文件 3-1-3动态产生表格列及单元格 3-2 WebControl 3-2-1使用月历执行查询 3-2-2使用验证规则 3-2-3使用组合方块...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    第三章 跨域交互缓存处理设计 17 3.1 跨域交互缓存处理需求 17 3.1.1 缓存技术WebStorage 17 3.1.2 跨域交互缓存处理需求 17 3.1.3 页面回退管理需求 17 3.2 缓存处理机制 18 3.2.1 跨域缓存处理 18 3.2.2页面回退...

    编写设备驱动程序

    介绍了一种常用的驱动程序编写方法,该方法允许在编写驱动程序时忽略特定于平台的问题,如字节存储顺序(endianness)和数据排序等。 其他主题包括:强化Solaris驱动程序;电源管理;驱动程序自动配置;程控I/O;直接...

Global site tag (gtag.js) - Google Analytics