V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wjpauli
V2EX  ›  PHP

跨域 cookie 到底应该怎么实现?我需要在 domain-1.com 通过 jquery 调用 domain-2.com 上的 PHP 写 cookie,在 domain-1.com 上读取,有可能实现么?

  •  
  •   wjpauli · 2021-02-07 11:29:39 +08:00 · 3280 次点击
    这是一个创建于 1404 天前的主题,其中的信息可能已经有所发展或是发生改变。

    domain-2.com/setcookie.php 上设置 cookie:

    setcookie('test', 1234, time() + 31536000, '/', 'www.domain-1.com');
    

    domain-2.com/.htaccess

    Header add Access-Control-Allow-Origin: http://www.domain-1.com
    Header add Access-Control-Allow-Credentials: true
    

    使用 jquery 在 domain-1.com 上调用 domain-2.com/setcookie.php

    $.ajax({url: 'domain-2.com/setcookie.php', dataType : 'json', crossDomain: true, xhrFields: {withCredentials: true}});
    

    domain-1.com/test.php 上读取$_COOKIE['test']

    结果:jquery 的 ajax call 显示 setcookie was blocked 。

    看了很多文档提到只要设置好 Allow-Credentials 和 withCredentials 就可以了,指的不是这种情况么

    26 条回复    2021-02-16 17:58:53 +08:00
    sanmaozhao
        1
    sanmaozhao  
       2021-02-07 11:33:08 +08:00   ❤️ 1
    domain-2.com 的页面无法往 domain-1.com 写 cookie
    sub2.domain.comsub1.domain.com 才可以
    brust
        2
    brust  
       2021-02-07 14:32:25 +08:00
    用 token 不好吗
    RLWGQ0AI4MAvYy36
        3
    RLWGQ0AI4MAvYy36  
       2021-02-07 14:34:52 +08:00
    参数加密传递吧
    YouLMAO
        4
    YouLMAO  
       2021-02-07 14:39:05 +08:00   ❤️ 2
    大哥, 不能读 /写 跨域 cookie, 这是法则, 互联网不是法外之地

    Allow-Credentials
    指 zhifubao 服务器允许你将 zhifubao 用户的 cookie 发给服务器

    不是允许你读写 zhifubao 用户的 cookie, 这他妈偷钱都可以了
    moreant
        5
    moreant  
       2021-02-07 15:38:32 +08:00 via iPhone
    csrf 我自己?
    huanruke
        6
    huanruke  
       2021-02-07 15:41:02 +08:00
    我也一直在寻找这样的财富密码 T.T
    meepo3927
        7
    meepo3927  
       2021-02-07 15:56:58 +08:00
    没有 跨域 cookie 这一说法吧
    Ariver
        8
    Ariver  
       2021-02-07 16:04:47 +08:00 via iPhone
    如果两个域名都在你的控制之下就可以
    chinvo
        9
    chinvo  
       2021-02-07 16:08:02 +08:00 via iPhone
    domain 2 set cookie 的时候 set 到 domain 1 就可以
    vvmap
        10
    vvmap  
       2021-02-07 17:05:16 +08:00
    这是啥操作,a.foo.comb.foo.com 可以互相取到 cookie; 但是 a.comb.com 之间 cookie 是限制获取的。4 楼说的很对了,这是规则
    mostkia
        11
    mostkia  
       2021-02-07 17:23:40 +08:00
    反向代理把 domain-2.com 地址代里到 domain-1.com 的某个目录里,然后去这个目录里访问你说的 php 地址,就应该不会跨域了。
    onec
        12
    onec  
       2021-02-07 17:31:31 +08:00   ❤️ 1
    要是跨域能读到 cookie, 做钓鱼网站的不是想拿啥拿啥
    kmonster
        13
    kmonster  
       2021-02-07 17:50:41 +08:00
    你应该是说 session 跨域使用吧,用 redis 来做 session 共享;
    cookie 是带着 sessionId 去服务器校验 session,如果你的 session 没有做共享,A 服务器的 session 无法在 B 服务器使用
    YouLMAO
        14
    YouLMAO  
       2021-02-07 23:26:53 +08:00 via Android
    @kmonster

    两个站点分开登录如何共享呢?

    等同于,你的两个手机共享 sessionid
    S4m
        15
    S4m  
       2021-02-08 10:20:57 +08:00
    为什么不能直接用 oAuth ?
    darknoll
        16
    darknoll  
       2021-02-08 11:35:56 +08:00
    不能实现,第三方 cookie 屏蔽,你怎么折腾都没用
    wjpauli
        17
    wjpauli  
    OP
       2021-02-08 14:19:20 +08:00
    @brust 涉及到现有项目重构
    wjpauli
        18
    wjpauli  
    OP
       2021-02-08 14:24:21 +08:00
    @Ariver 烦请看下我的代码,哪里错了。
    @chinvo 烦请看下我的代码,哪里错了,我的代码就是在 domain-2 set cookie 到 domain-1,但是 chrome 显示 blocked 。但是我现在可以实现 domain-1 通过 ajax 调用 domain-2 的 php 脚本设置 cookie 到 domain-2 。

    @vvmap 他说的那是两个不同归属的网站,我说的是 domain-1.com 通过 ajax 调用 domain-2.com ,这叫 cors,完全是两回事。
    chinvo
        19
    chinvo  
       2021-02-08 15:17:16 +08:00 via iPhone
    @wjpauli #16 时间过去有点久忘了当年怎么弄的了。现在的浏览器会拦截这种给其他域名 set cookie 。

    你试试 p3p,不知道现在还能用么。
    wjpauli
        20
    wjpauli  
    OP
       2021-02-08 16:26:14 +08:00
    @chinvo p3p 是在 domain-1 里使用 iframe 调用 domain-2,设置 domain-2 下面的 cookie,现在这些 adsense 类的广告都是这么插的。思来想去我决定放弃 session+cookie 改用 token 。
    chinvo
        21
    chinvo  
       2021-02-08 18:04:01 +08:00 via iPhone
    @wjpauli #18 时间过去太久只有模糊印象。总之,这些都属于歪门邪道,容易引发安全问题。
    justfun
        22
    justfun  
       2021-02-10 00:56:35 +08:00
    justfun
        23
    justfun  
       2021-02-10 00:57:41 +08:00
    inhal
        24
    inhal  
       2021-02-10 11:11:02 +08:00 via Android
    @wjpauli #20 请问现在你的解决方案是什么?可以分享一下吗?
    laozhoubuluo
        25
    laozhoubuluo  
       2021-02-11 17:41:52 +08:00
    两个不同的域名,肯定是不能直接读取 Cookie 的。
    只能是在 domain-1.com 的前端上让 jQuery 去请求一个 domain-2.com 的接口,让他把 domain-2.com 上的 test Cookie 发过来,完了 domain-1.com 前端再根据返回值决定业务状态。
    拿到返回值之后,不管是写到 domain-1.com 的 cookie,还是直接拼接到请求里面提交给后端都可以。
    markgor
        26
    markgor  
       2021-02-16 17:58:53 +08:00
    withCredentials 印象中只能传不能写吧?
    你需求是访问 A,通过 AJAX 请求 B,把 B 的结果写入 A 的 cookie 里面?
    如果是这样,可以尝试:

    方案 1:
    A 发送请求 B,B 不需要通过 cookie,直接返回 response text,然后再发 ajax 请求去 A 设定 cookie 。
    (涉密可以通过 openssl 加密返回内容,在 a 的请求位置上解密即可。

    方案 2:
    页面通过 AJAX 请求 A,A 通过 curl 请求 B,再把 COOKIE 传递回去。(即 B 的 ajax 访问改为 A 通过 CURL 访问)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   907 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 20:06 · PVG 04:06 · LAX 12:06 · JFK 15:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.