微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP中的会话名称有哪些限制?

如何解决PHP中的会话名称有哪些限制?

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会话名称的实际限制是什么?

解决方法

我对此有了进一步的了解。会话名称的规则在this validation function中定义,该规则允许[a-zA-Z0-9,-]{1,256}(但不限于数字)。除字母数字外,会话名称中还可以包含逗号和破折号,因此该文档是错误的。从内部session_create_id函数调用此函数,如果会话名称未通过该验证,则该函数triggers a warning进行调用。

尽管如此,传入包含_的会话名称时,不会触发任何警告。这是可以证明的:

<?php
ini_set('display_errors',true);
error_reporting(E_ALL);
session_name('__Secure-MySession');
session_start();
if (!array_key_exists('test',$_SESSION)) {
    $_SESSION['test'] = '';
}
$_SESSION['test'] .= "\n" . rand(0,100);

var_dump($_SESSION);
echo session_name();

这非常有效,不会触发任何错误或警告,并且显示了越来越多的随机数列表(表明会话存储正在运行,因此cookie也是如此),并且第二次session_name调用都没有参数显示我们设置的会话名称:

__Secure-MySession

HTTP标头显示该脚本设置了一个名为__Secure-MySession的cookie:

Headers showing correct session name in cookie

我还尝试命名会话My_Session,以防PHP寻找明确的__Session-前缀,但这也很好。 #(之类的其他字符也不会触发错误。在这些情况下,会话名称是用URL编码的,看起来很像this bug,它在很早以前就已确定。正如预期的那样,123,可以使用,但也可以对逗号进行URL编码。

因此,尽管这表明在会话名称中使用_可以正常工作,但我不能告诉您原因。我也曾在其他地方问过,如果发现了,我会更新这个问题!

巧合的是draft 06 of RFC6265bis expires today

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。