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

2019-09-23 22:11:48 +08:00
 ysoserious

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

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

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


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

@haiyang416
@chinvo
谢谢,根据你们的回答我的理解是:a 向 b 发起的会话并不是我创建的,那么另一个人向 a 发起请求,然后 a 转发请求给 b,b 能取到之前(我存放在 b )的 session 数据吗?全程不带 sessionID 和 cookies
starsriver
2019-09-23 23:14:54 +08:00
session 是创建在服务器的,不同服务器之间没有令牌同步,怎么可能读取 session.
haiyang416
2019-09-23 23:47:19 +08:00
@ysoserious 这些都要看 a 的逻辑是怎么处理的,a 一直带状态的话,它和 b 之间多次请求都可以当作同一个会话,b 可以读取。但如果 a 不带状态,则不管谁请求的都拿不到数据。
ysoserious
2019-09-24 00:02:01 +08:00
@starsriver
@haiyang416
再次感谢,我对 session 又了解了一点,回头我再查查有关 session 的资料。
also24
2019-09-24 01:30:22 +08:00
引用一下自己在之前帖子里的回复:
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
2019-09-24 01:35:19 +08:00
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
2019-09-24 08:23:35 +08:00
@also24
我发起这个疑问的时候并不知道 session id 是通过 cookies 来传递的,经过前面几位朋友的回答有所了解,非常感谢您不嫌麻烦地讲解。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/603510

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX