【发布时间】:2021-02-05 18:16:45
【问题描述】:
The PHP docs on session_name()说:
它应该只包含字母数字字符;它应该简短且具有描述性(即对于启用了 cookie 警告的用户)。 ...会话名称不能仅由数字组成,必须至少存在一个字母。否则每次都会生成一个新的会话 ID。
所以很明显你必须有一些非数字的东西,但不清楚你不能有哪些字符。 cookie 规范本身拒绝 ()<>@,;:\"/[]?={},但这仍然留下了其他可能被允许但不是严格字母数字的。这很重要,因为 cookie security prefixes 在 __Secure-PHPSESSID 之类的名称中使用 - 和 _。所以我翻遍了in the PHP source code at the session_name function——但除了检查它是一个字符串之外,我看不到它有什么作用。在实践中,它工作得很好,但我会更清楚地知道为什么!例如,这有效:
session_name('__Secure-PHPSESSID');
session_start();
$_SESSION['test'] = $_SESSION['test'] . "\n" . rand(0,100);
var_dump($_SESSION);
那么 PHP 会话名称的实际限制是什么?
【问题讨论】:
-
它在那里说:“只有字母数字字符”。只是字母和数字,而不是所有数字。
-
我知道,这就是我引用文档的原因。请阅读问题 - 它适用于包含
-和_的会话名称,所以我想确切地了解约束是什么,而不仅仅是文档所说的,因为这些显然不是一定是同一件事。 -
它没有强制要求,我认为它只是预测可能发生的问题,所以它指定了一个保守的要求。
-
代码中可能存在实际限制,并且他们从未更新过文档。 OTOH,他们也可能允许稍后在代码中添加限制,您不应该依赖当前的实现。
-
参见文档中的this comment,但它已有 15 年历史,可能已过时。
标签: php session-cookies php-internals