V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ysoserious
V2EX  ›  问与答

这种情况下可以读到 session 吗?

  •  
  •   ysoserious · 2019-09-23 22:11:48 +08:00 · 1341 次点击
    这是一个创建于 1677 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假如我通过 vue 页面发送了一个请求到 a.php, a.php 创建了一个请求发给了另一个域下的 b.php, b.php 把请求中的数据存放在 session 中.

    此时如果我直接发请求给 b.php 去取 session 中的数据, 能取到前面存放的数据吗?

    12 条回复    2019-09-24 08:23:35 +08:00
    haiyang416
        1
    haiyang416  
       2019-09-23 22:35:13 +08:00
    不行,除非你带上 a 请求时的 session_id。
    chinvo
        2
    chinvo  
       2019-09-23 22:38:10 +08:00 via iPhone
    如果你用 cookie 下发了 session id (这也是 PHP 默认的 session id 传递方式),那么 b 就能自动获取 session id
    jugelizi
        3
    jugelizi  
       2019-09-23 22:52:16 +08:00
    a 是如何请求 b 的
    jugelizi
        4
    jugelizi  
       2019-09-23 22:52:52 +08:00
    可以去看下 sso 相关知识
    ysoserious
        5
    ysoserious  
    OP
       2019-09-23 23:00:53 +08:00 via Android
    @haiyang416
    @chinvo
    谢谢,根据你们的回答我的理解是:a 向 b 发起的会话并不是


    @jugelizi 厉害,一下就知道我在看什么
    ysoserious
        6
    ysoserious  
    OP
       2019-09-23 23:03:22 +08:00 via Android
    不小心发出去了

    @haiyang416
    @chinvo
    谢谢,根据你们的回答我的理解是:a 向 b 发起的会话并不是我创建的,那么另一个人向 a 发起请求,然后 a 转发请求给 b,b 能取到之前(我存放在 b )的 session 数据吗?全程不带 sessionID 和 cookies
    starsriver
        7
    starsriver  
       2019-09-23 23:14:54 +08:00 via Android
    session 是创建在服务器的,不同服务器之间没有令牌同步,怎么可能读取 session.
    haiyang416
        8
    haiyang416  
       2019-09-23 23:47:19 +08:00 via Android
    @ysoserious 这些都要看 a 的逻辑是怎么处理的,a 一直带状态的话,它和 b 之间多次请求都可以当作同一个会话,b 可以读取。但如果 a 不带状态,则不管谁请求的都拿不到数据。
    ysoserious
        9
    ysoserious  
    OP
       2019-09-24 00:02:01 +08:00 via Android
    @starsriver
    @haiyang416
    再次感谢,我对 session 又了解了一点,回头我再查查有关 session 的资料。
    also24
        10
    also24  
       2019-09-24 01:30:22 +08:00   ❤️ 1
    引用一下自己在之前帖子里的回复:
    https://www.v2ex.com/t/520410

    这就体现出了很多人混淆 session / session-data / session-id / cookies 的情况了。


    不少人因为 cookies 里存储了一个叫做 session 的变量,就粗暴的认为这是 session 的本体了。

    我倾向于把东西划分为 session 和 session-data 来解释:
    session 是个虚拟概念,代表了一个虚拟的会话过程
    session-data 是个实体概念,代表这个会话中的独享数据(例如登录状态、用户信息等)

    在大部分实现中( flask 除外),cookies 里存储的只是 session-id,只是一个索引 id 而已,就一串字符 id 而已。
    真正的 session-data,其实是存储在服务端程序中的,服务端程序,根据 session-id,取出了 session-data 参与运算渲染。
    于是在外界看来,就好像这个 session 是通过 cookies 里的 session-id 来维持的一样。




    这就造成了许多人 “ session 是存储在 cookies 中” 的误解。
    同时也造成了,在讨论 session 的时候,很多人混淆 session 会话 / session-data / session-id 的情况。


    当然,刚才被我排除掉的 flask,人家是真的把 session-data 存储在 cookies 中的(即 “客户端 session ”),所以在使用 flask 的时候,要处理好 secret_key 的安全性,否则容易出现 伪造 session 的问题,另外就是 flask 只对 session 做了签名,没做校验,所以本地 session 是可以被解码查看的。当然那就是另一个话题了,不多说。
    also24
        11
    also24  
       2019-09-24 01:35:19 +08:00   ❤️ 1
    OK,背景普及完毕,楼主的问题是怎么出现的呢?
    很简单,session 是 B 服务器生成的,session-id 也是 B 服务器下发的,而 session-id 存储在 a.php 所在的 A 服务器,你使用不带 session-id 信息的本地客户端去 B 服务器查,当然就查不到相应的 session-data 啦。

    而关于 “另一个人” 此时访问 a.php 的问题,其实涉及 a.php 的实现。
    默认情况下,a.php 里应该是没有做 session-id 的保存和复用的,也就是说 a.php 下次请求 B 的时候,连 session-id 都不会带,那么自然就取不到相应的 session-data 啦。

    杠精情况下,a.php 可以自己实现一套类似 cookies 的 session-id 持久化机制,来保证自己下一次请求 B 的时候会带上 session-id,那么自然就能取到相应的 session-data 啦。
    ysoserious
        12
    ysoserious  
    OP
       2019-09-24 08:23:35 +08:00 via Android
    @also24
    我发起这个疑问的时候并不知道 session id 是通过 cookies 来传递的,经过前面几位朋友的回答有所了解,非常感谢您不嫌麻烦地讲解。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2238 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 00:51 · PVG 08:51 · LAX 17:51 · JFK 20:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.