会话ID太长或包含非法字符,有效字符为az,AZ,0-9和' - ,'

Nan*_*uri 22 php session

怎么解决 :

警告:session_start()[function.session-start]:会话ID太长或包含非法字符,有效字符是az,AZ,0-9和' - ,'在......第3行

警告:session_start()[function.session-start]:无法发送会话cookie - 已经发送的标头(输出从.....:3开始).....在第3行

警告:session_start()[function.session-start]:无法发送会话缓存限制器 - 已经发送的头文件(输出从.....:3开始).....在第3行

Evi*_*ker 44

这是一个信息漏洞,恶意攻击者可能会更改cookie并将非法字符分配给PHPSESSID以公开此PHP警告,其实际上包含文件路径和用户名等多汁信息!

  • 值得一提的是[owasp.org docs](https://www.owasp.org/index.php?title=Full_Path_Disclosure):***仅通过关闭错误报告来防止此漏洞,因此您的代码不会吐出出错.*** (5认同)

Ser*_*min 15

看看这个session_start()讨论的解决方法:

session_start() 如果PHPSESSID包含非法字符,则生成警告

警告:在session_start()[function.session启动]:会话ID包含非法字符,有效字符包括AZ,az,0-9和 - 在上线/home/para/dev/mon_site/header.php '' 17

为了避免我写这个:

   <?php
        function my_session_start()
        {
            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-z0-9]{32}$/', $sessid)) {
                return false;
            }
            session_start();

           return true;
        }
    ?>
Run Code Online (Sandbox Code Playgroud)

  • 它们是,但是将您链接到生成的会话ID的cookie是客户端.如果该cookie变为无效格式(某人试图利用某些东西),PHP会注意到它. (16认同)
  • 你是如何在"PHPSESSID"中首先获得非法字符的?它们不是由PHP自动生成的吗? (9认同)
  • 你是否在正则表达式中缺少`-`,因为那是一个有效的字符. (3认同)
  • 最初的答案引入了潜在的安全漏洞-我已对其进行编辑以进行修复。 (2认同)

alp*_*ere 14

这个问题有一个错误报告(https://bugs.php.net/bug.php?id=68063)

您可以检查session_start是否成功,并在需要时生成id:

$ok = @session_start();
if(!$ok){
session_regenerate_id(true); // replace the Session ID
session_start(); 
}
Run Code Online (Sandbox Code Playgroud)


小智 12

我编辑了Andron之前的解决方案!(修复返回值)并添加my_session_start()的评估输出.以前的解决方案解决了错误消息的问题,但我需要开始会话.

/**
 * @return boolean return TRUE if a session was successfully started
 */        
function my_session_start()
{
      $sn = session_name();
      if (isset($_COOKIE[$sn])) {
          $sessid = $_COOKIE[$sn];
      } else if (isset($_GET[$sn])) {
          $sessid = $_GET[$sn];
      } else {
          return session_start();
      }

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

if ( !my_session_start() ) {
    session_id( uniqid() );
    session_start();
    session_regenerate_id();
}
Run Code Online (Sandbox Code Playgroud)


And*_*ron 6

我建议使用"更正确"的功能版本.

几点说明:

  1. 更正确的正则表达式(允许在z AZ 0-9,(逗号)和范围内的字符- (负))所描述的在这里.
    正则表达式取决于php ini设置,如此此处所述.
  2. 使用会话名称方法

所以更新版本看起来像这样:

<?php
    function my_session_start()
    {
        $sn = session_name();
        if (isset($_COOKIE[$sn])) {
            $sessid = $_COOKIE[$sn];
        } else if (isset($_GET[$sn])) {
            $sessid = $_GET[$sn];
        } else {
            session_start();
            return false;
        }

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

       return true;
    }
?>
Run Code Online (Sandbox Code Playgroud)