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

时间:2010-07-06 11:30:18

标签: session php

如何解决:

  

警告: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行

7 个答案:

答案 0 :(得分:41)

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

答案 1 :(得分:15)

查看此session_start() discussion进行解决方法:

  如果PHPSESSID包含非法字符,则

session_start()会生成警告

     

警告:session_start()[function.session-start]:会话ID包含非法字符,有效字符为/ home / para / dev / mon_site / header中的az,AZ,0-9和“ - ”。第17行的PHP

     

为了避免我写这个:

   <?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;
        }
    ?>

答案 2 :(得分: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(); 
}

答案 3 :(得分:11)

我编辑了 Andron's previous solution! (修复返回值)并添加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();
}

答案 4 :(得分:5)

我建议使用“更正确”的功能版本。

几点说明:

  1. 更正确的正则表达式(允许范围为a-z A-Z 0-9,(逗号)和 - (减号)的字符),如here所述。
    正则表达式取决于php ini设置,如herehere所述。
  2. 使用会话名称方法
  3. 所以更新后的版本如下:

    <?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;
        }
    ?>
    

答案 5 :(得分:2)

如果你不关心其他用户(例如:如果它是私人界面),只需检查浏览器,找到cookie PHPSESSID(或你给它的名字),删除它,然后刷新。

答案 6 :(得分:2)

我提出了这个简单的方法,只是尝试捕捉会话开始,如果有问题重新生成会话。

try {
   session_start();
} catch(ErrorExpression $e) {
   session_regenerate_id();
   session_start();
}