假如我通过 vue 页面发送了一个请求到 a.php, a.php 创建了一个请求发给了另一个域下的 b.php, b.php 把请求中的数据存放在 session 中.
此时如果我直接发请求给 b.php 去取 session 中的数据, 能取到前面存放的数据吗?
1
haiyang416 2019-09-23 22:35:13 +08:00
不行,除非你带上 a 请求时的 session_id。
|
2
chinvo 2019-09-23 22:38:10 +08:00 via iPhone
如果你用 cookie 下发了 session id (这也是 PHP 默认的 session id 传递方式),那么 b 就能自动获取 session id
|
3
jugelizi 2019-09-23 22:52:16 +08:00
a 是如何请求 b 的
|
4
jugelizi 2019-09-23 22:52:52 +08:00
可以去看下 sso 相关知识
|
5
ysoserious OP |
6
ysoserious OP 不小心发出去了
@haiyang416 @chinvo 谢谢,根据你们的回答我的理解是:a 向 b 发起的会话并不是我创建的,那么另一个人向 a 发起请求,然后 a 转发请求给 b,b 能取到之前(我存放在 b )的 session 数据吗?全程不带 sessionID 和 cookies |
7
starsriver 2019-09-23 23:14:54 +08:00 via Android
session 是创建在服务器的,不同服务器之间没有令牌同步,怎么可能读取 session.
|
8
haiyang416 2019-09-23 23:47:19 +08:00 via Android
@ysoserious 这些都要看 a 的逻辑是怎么处理的,a 一直带状态的话,它和 b 之间多次请求都可以当作同一个会话,b 可以读取。但如果 a 不带状态,则不管谁请求的都拿不到数据。
|
9
ysoserious OP |
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 是可以被解码查看的。当然那就是另一个话题了,不多说。 |
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 啦。 |
12
ysoserious OP @also24
我发起这个疑问的时候并不知道 session id 是通过 cookies 来传递的,经过前面几位朋友的回答有所了解,非常感谢您不嫌麻烦地讲解。 |