You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

带随机PHPSESSID的cURL请求为何会让MODX会话使用该ID?

问题

当使用cURL发起请求并携带值为随机字符串的PHPSESSID Cookie时,MODX会话直接以该Cookie的值启动,这是否属于异常行为?还是对PHP会话工作机制理解有误?

MODX会话与Cookie配置

anonymous_sessions: Yes
default_username: (anonymous)
session_cookie_httponly: Yes
session_cookie_secure: Yes
session_handler_class: [empty] 
session_name: PHPSESSID

示例请求

curl -i  -X GET "https://www.example.com/test-page" -b "PHPSESSID=adventure-time" -v

请求头

> GET /test-page HTTP/2
> Host: www.example.com
> User-Agent: curl/8.1.2
> Accept: */*
> Cookie: PHPSESSID=adventure-time
> 

响应头

< HTTP/2 200 
< date: Fri, 17 Nov 2023 09:58:21 GMT
< server: Apache
< expires: 0
< cache-control: no-store, no-cache, must-revalidate
< pragma: no-cache
< set-cookie: PHPSESSID=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; secure; HttpOnly
< vary: Accept-Encoding
< content-length: 1636
< content-type: text/html; charset=UTF-8

PHP响应结果

$_COOKIE['PHPSESSID']: adventure-time
session_id(): adventure-time
session_id() == $_COOKIE['PHPSESSID']: access granted 
解答

这属于PHP会话的正常行为,并非MODX或PHP的异常表现。

PHP默认的会话处理逻辑如下:

  1. 当客户端请求中携带了指定名称(此处为PHPSESSID)的Session ID Cookie时,PHP会直接将该值设为当前会话的ID,不会预先验证这个ID是否在服务器端存在。
  2. 若该Session ID对应的会话数据不存在,PHP会初始化一个空会话(使用客户端提供的ID),直到会话被写入数据时,才会在服务器端创建对应的会话记录。
  3. 响应头中出现PHPSESSID=deleted的Set-Cookie头,是MODX或PHP的后续逻辑触发的(比如匿名会话的清理机制),但这不会影响当前请求周期内会话ID的使用——当前请求中session_id()依然会返回客户端提交的值。

简言之,PHP允许客户端提交任意Session ID作为当前会话的标识,服务器端仅在需要读取/写入会话数据时才验证其有效性;若只是启动会话而未操作数据,客户端提交的ID会被直接使用。

内容的提问来源于stack exchange,提问作者user1398498

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 02:46:17