ysoserious
V2EX  ›  问与答

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

  •  
  •   ysoserious · Sep 23, 2019 · 1794 views
    This topic created in 2436 days ago, the information mentioned may be changed or developed.

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

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

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


    @jugelizi 厉害,一下就知道我在看什么
    ysoserious
        6
    ysoserious  
    OP
       Sep 23, 2019 via Android
    不小心发出去了

    @haiyang416
    @chinvo
    谢谢,根据你们的回答我的理解是:a 向 b 发起的会话并不是我创建的,那么另一个人向 a 发起请求,然后 a 转发请求给 b,b 能取到之前(我存放在 b )的 session 数据吗?全程不带 sessionID 和 cookies
    starsriver
        7
    starsriver  
       Sep 23, 2019 via Android
    session 是创建在服务器的,不同服务器之间没有令牌同步,怎么可能读取 session.
    haiyang416
        8
    haiyang416  
       Sep 23, 2019 via Android
    @ysoserious 这些都要看 a 的逻辑是怎么处理的,a 一直带状态的话,它和 b 之间多次请求都可以当作同一个会话,b 可以读取。但如果 a 不带状态,则不管谁请求的都拿不到数据。
    ysoserious
        9
    ysoserious  
    OP
       Sep 24, 2019 via Android
    @starsriver
    @haiyang416
    再次感谢,我对 session 又了解了一点,回头我再查查有关 session 的资料。
    also24
        10
    also24  
       Sep 24, 2019   ❤️ 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  
       Sep 24, 2019   ❤️ 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
       Sep 24, 2019 via Android
    @also24
    我发起这个疑问的时候并不知道 session id 是通过 cookies 来传递的,经过前面几位朋友的回答有所了解,非常感谢您不嫌麻烦地讲解。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   953 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 52ms · UTC 19:44 · PVG 03:44 · LAX 12:44 · JFK 15:44
    ♥ Do have faith in what you're doing.