论坛首页 Web前端技术论坛

淘宝如何跨域获取Cookie分析

浏览 64198 次
精华帖 (13) :: 良好帖 (16) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-04-13   最后修改:2011-06-25
      最近在发现使用Taobao的时候的一个小细节,于是便萌发起了写这篇文章。
      当我们在 www.taobao.com 中进行登录之后,然后直接切换到 www.tmall.com 域名下,发现www.tmall.com首页的最顶部马上显示成了”您好, andyfaces“,于是便对此处的实现机制进行分析。
      首先,用户名应该是存储在cookie中的,于是在taobao.com的域名中用 firefox看到用户名确实是存储在 cookie, 而tmall.com中没有存储该cookie:


      可以确定的是对于cookie来说肯定是不允许垮域访问的。无论是通过JS还是Server端程序来说都是如此,那么tmall.com是如何访问到taobao.com下的cookie的呢?

      于是打开 tmall.com,然后使用firebug来进行调试,发现了一条这样的请求语句,
     

      其页面的JS代码为:
<script>
        KISSY.getScript("http://www.taobao.com/go/app/tmall/login-api.php?"+Math.random())
        </script>


     看到这里之后于是也大概知道他如何处理了的,为了确认一下,于是搜索一下 KISSY.getScript 函数代码,确实采用了JS跨域的 JSONP 解决方案:
    
getScript: function(url, success, charset) {
            var isCSS = RE_CSS.test(url),
                node = doc.createElement(isCSS ? 'link' : 'script'),
                config = success, error, timeout, timer;

                node.src = url;
                node.async = true;

            scriptOnload(node, function() {
                    if (timer) {
                        timer.cancel();
                        timer = undef;
                    }

                    S.isFunction(success) && success.call(node);

                    // remove script
                    if (head && node.parentNode) {
                        head.removeChild(node);
                    }
                });
            head.insertBefore(node, head.firstChild);
      }

    其原理是通过动态create js include 动态加载js,然后为该script节点bind onload事件或判断onreadystatechange,其具体细节可以参考以上 scriptOnload 的函数的处理。 当js加载完成之后 采用回调方式来执行 success 函数。

    为了进一步确实,于是使用 Jquery的 $.getScript 来测试一把,首先在 taobao.com下进行登录成功,然后随便在本地写了一个测试页,通过以下语句:
$.getScript('http://www.taobao.com/go/app/tmall/login-api.php?0.6783450077710154', function(){
    console.log("the taobao.com cookie object:" + userCookie + " username:" + userCookie._nk_);
});

    Firbug结果:
   

   其实大致原理如此,通过在www.taobao.com 的server端提供一个获取当前域下所有cookie的 php的请求地址,然后该php获取到cookie之后将期并成 js 代码,也就是以上第二个截图所看到的。然后再在 tmall 采用 jsonp 的方式跨域加载该 js 代码,从而实现 cookie 的跨域访问。
     
   发表时间:2011-04-13  

嗯,学习到很到很多东西啊

0 请登录后投票
   发表时间:2011-04-13   最后修改:2011-04-13
这算不算一个安全隐患呢?任意的站点都可以访问此数据,从而它们都可以取得淘宝的登录信息。

至少,它应该做下限制,只有Referer为自己分站时才返回数据
0 请登录后投票
   发表时间:2011-04-13  
clue 写道
这算不算一个安全隐患呢?任意的站点都可以访问此数据,从而它们都可以取得淘宝的登录信息。

----
风险无处不在,不差这点。
真出事了,还有运营的兄弟们顶着。
0 请登录后投票
   发表时间:2011-04-13  
clue 写道
这算不算一个安全隐患呢?任意的站点都可以访问此数据,从而它们都可以取得淘宝的登录信息。

所以一般经常说 cookie 中不建议存储用户的重要隐私等信息,这里的话应该还算好,主要就是昵称(_nk_ = nickname)。
0 请登录后投票
   发表时间:2011-04-13  
denger 写道
clue 写道
这算不算一个安全隐患呢?任意的站点都可以访问此数据,从而它们都可以取得淘宝的登录信息。

所以一般经常说 cookie 中不建议存储用户的重要隐私等信息,这里的话应该还算好,主要就是昵称(_nk_ = nickname)。

昵称也是登录帐号吧?(淘宝好像只有帐号名?)
这个其实也挺敏感的,如果某网站还带有注册功能,没准你用的密码和淘宝的一样,so...

虽然淘宝的支付需要数字证书,光有密码不顶用,但还是以防万一嘛


有时不光要考虑帐号安全,还要考虑信息安全。
比如我想知道论坛上某人的淘宝帐号,就发消息引诱他去访问我给他订制的网站;如果他还是卖家,还可以拍个物品得到真实姓名、联系方式等

传说中的人肉么?汗一个……
0 请登录后投票
   发表时间:2011-04-13  
clue 写道
denger 写道
clue 写道
这算不算一个安全隐患呢?任意的站点都可以访问此数据,从而它们都可以取得淘宝的登录信息。

所以一般经常说 cookie 中不建议存储用户的重要隐私等信息,这里的话应该还算好,主要就是昵称(_nk_ = nickname)。

昵称也是登录帐号吧?(淘宝好像只有帐号名?)
这个其实也挺敏感的,如果某网站还带有注册功能,没准你用的密码和淘宝的一样,so...

虽然淘宝的支付需要数字证书,光有密码不顶用,但还是以防万一嘛


有时不光要考虑帐号安全,还要考虑信息安全。
比如我想知道论坛上某人的淘宝帐号,就发消息引诱他去访问我给他订制的网站;如果他还是卖家,还可以拍个物品得到真实姓名、联系方式等

传说中的人肉么?汗一个……

嗯,你说的确实有道理,正如楼上兄弟所说 ~ 风险无处不在 
0 请登录后投票
   发表时间:2011-04-13   最后修改:2011-04-13
clue 写道
至少,它应该做下限制,只有Referer为自己分站时才返回数据

另外 Referer 也可以很容易伪造的。
0 请登录后投票
   发表时间:2011-04-13  
记得以前淘宝内部员工写了一个篇文章,提到使用cookie解决session集中存储的问题。过段时间文章中这段话被删除了。:) 你可以窥探一下、
0 请登录后投票
   发表时间:2011-04-13  
denger 写道
clue 写道
至少,它应该做下限制,只有Referer为自己分站时才返回数据

另外 Referer 也可以很容易伪造的。

那些“被收集”的浏览器可不会伪造,你伪造也只能收集你自己的cookie而已
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics