【发布时间】:2018-07-01 00:08:05
【问题描述】:
我正在创建自己的会话管理系统,我想在使用 session_create_id() 函数开始会话之前创建自己的自定义 ID,虽然我不确定前缀是如何工作的,但我的问题如果我回显带有前缀的 session_create_id,我将看到带有会话 ID 的前缀,尽管当我将此 session_create_id 输入到 session_id 函数中时,我在回显时只看到标准的 26 长度 ID。我在https://wiki.php.net/rfc/session-create-id 上找到的这篇文章确实解释了为什么我只看到我在配置文件中设置的标准长度。但我不确定我是如何知道这个前缀存在的,本质上它是否真的添加了一个更安全的 session_id。
这篇文章的信息满足了我的一些好奇心。
注意:前缀长度不被视为 session.sid_length 的一部分。会话 ID 长度变为“前缀长度”+ session.sid_length。总长度必须少于 256 个字符。
代码:
//SessionRegeneration
function sess_regenration(){
if (session_status() == PHP_SESSION_NONE){
//CreateRandomStringForPrefix
$RandomizerForPreFix = str_split("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
shuffle($RandomizerForPreFix);
$EmptyStringToAppenRandomizer = '';
foreach($RandomizerForPreFix as $Element ){
$EmptyStringToAppenRandomizer .= $Element;
}
//CreateNewSessionIdWithPrefix
$CreatedId = session_create_id($EmptyStringToAppenRandomizer);
session_id($CreatedId);
//StartSession
session_start();
echo session_id();
}
}
【问题讨论】:
-
请注意,
shuffle()不适合加密用途,因为the docs 已经发出警告。这意味着上面的代码是易受攻击的,生成的会话 id 是可预测的。任何使用它的应用程序也可能容易受到会话固定的影响。这样的项目可以用于教育目的,但对于实际应用,不要自己动手——它已经安全地实施了。 -
@Gabor Lengyel 你对使用合适的前缀有什么建议吗?