【问题标题】:Session start validation会话开始验证
【发布时间】:2015-05-24 21:55:52
【问题描述】:

我有这个功能:

public static function sessionStart()
{
    try {
        if (ini_get('session.use_cookies') && isset($_COOKIE['PHPSESSID'])) {
            $sessid = $_COOKIE['PHPSESSID'];
        } elseif (!ini_get('session.use_only_cookies') && isset($_GET['PHPSESSID'])) {
            $sessid = $_GET['PHPSESSID'];
        } else {
            session_start();
            return false;
        }

        if (preg_match('/[^a-zA-Z0-9\-]{32}/i', $sessid)) {
            return false;
        }
        session_start();

        return true;
    } catch (Exception $ex) {
        return false;
    }
}

但是,在某些情况下,session_start 仍会引发警告。我如何验证会话 ID,这样我就永远不会收到警告?当我将 PHP 版本从 5.3 更改为 5.6 时,问题开始蔓延。

警告:

会话ID过长或包含非法字符,有效 字符是 a-z、A-Z、0-9 和 '-,'

【问题讨论】:

  • 警告是什么?
  • 我已将警告添加到问题中

标签: php session session-state


【解决方案1】:

一种解决方案是使用 PHP error control operator:

@session_start();

如果您想验证它是否正确启动,只需从中返回布尔值:

return @session_start();

(如documentation中所述:)

如果会话成功启动,此函数返回 TRUE,否则返回 FALSE。

您的正则表达式检查功能似乎也不正确,我已在下面进行了更新:

!preg_match('/^[a-z0-9\-]{32}$/i', $sess)

你可以看到结果here

【讨论】:

  • 我不想取消警告。我想阻止它。困扰我的是我正在使用无效的会话 ID 调用 session_start。要么太长,要么有其他问题。
  • 另外,试着改变你的 preg_match,(它似乎没有正确匹配:tehplayground.com/#6ZYnn9VKL!preg_match('/^[a-z0-9\-]{32}$/i', $sess),尽管你可能想检查this,因为它可能不完全正确32 个字符。(你应该让 session_start() 来检查 IMO)。让我知道确切的警告,我可以提供进一步的帮助。
  • 我对正则表达式语法一无所知,所以你的最后一条评论可能有道理
  • 我将不得不等待看看这是否真的有效。看起来不错,但我会在测试后返回,希望很快能回答这个问题
  • Danbopes,似乎 if (preg_match('/^[a-z0-9\-]{32}$/i', $sessid)) { 是解决方案。如果您通过预防问题而不是抑制错误消息来编辑答案,那么我会接受它,因为它似乎是解决方案。如果我明天不取消对解决方案的接受,那么它就是最终的。
猜你喜欢
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多