假设您有一个网站
A
,您可以通过 PHP 会话 cookie 控制该网站 A
受保护页面的登录和导航。为了获得最大的安全性,这些 cookie 都是 secure
、httponly
,并且使用 samesite
等于 Strict
,并且仅限于 A
的域,因此也是“仅限主机”。
如果现在登录的用户在
A
上确认付款,某些银行/支付服务将自动重定向该用户以在相关服务的 B
页面上执行后续/多重身份验证。客户端响应该附加身份验证后,无论是或否,系统通常会将客户端重定向回A
。
我现在想知道的是安全问题。使用上述会话cookie设置,重定向到
B
并返回A
显然会导致客户端丢失会话,并在重定向到A
后注销。
可以通过在服务器配置中将会话 cookie 的
SameSite
属性设置为 Lax
来避免这种情况。但是,如果我想保持Strict
怎么办?
我想到的解决方案,但不知道如何在 PHP 中实现:
服务器上的会话 cookie 配置定义了
Strict
属性的 sameSite
值,正如我希望的那样,一般来说。当在 A
上确认付款时,该函数会在服务器端处理该确认,因此在重定向到 B
之前,将会话 cookie 的 samesite
值更改为 Lax
。然后,在 B
重定向到的页面上,一开始我将该值重置回 Strict
。
PHP 中可能有这样的事情吗?或者您是否愿意考虑创建一个具有
Lax
的全新会话 cookie,将您的 $_SESSION
数据复制到其中,然后在重定向后将 $_SESSION
数据取回到您用于的 cookie 中使用 A
在 sameSite="Strict"
上进行会话?
或者任何其他更适合的解决方案?
据我所知,支付提供商通常需要在 GET 请求中传递某种签名的交易令牌。此类令牌将与重定向一起在 GET 中发回。
在这种情况下,将会话数据分配给站点 A 中生成的交易令牌,将带有重定向的令牌发送到站点 B,并在从站点 B 接收到带有重定向的令牌时恢复会话数据。
令牌必须经过签名,因此站点 A 和 B 必须确保它源自站点 A。
这需要采取额外的控制措施,以防止拥有此类令牌的人劫持会话:必须采取某种额外的会话验证,例如浏览器指纹识别。
在这种情况下,无需获取相同的会话 cookie。