Идентификатор сеанса слишком длинный или содержит недопустимые символы, допустимые символы: az, AZ, 0-9 и '-,' - PullRequest
22 голосов
/ 06 июля 2010

Как решить:

Предупреждение: session_start () [function.session-start]: идентификатор сессии слишком длинный или содержит недопустимые символы, допустимые символы: az, AZ, 0-9и '-,' в ..... в строке 3

Предупреждение: session_start () [function.session-start]: невозможно отправить cookie сеанса - заголовки уже отправлены (вывод начался в ......: 3) в ..... в строке 3

Предупреждение: session_start () [function.session-start]: невозможно отправить ограничитель кэша сеанса - заголовки уже отправлены (вывод начался в .....: 3) в ..... в строке 3

Ответы [ 7 ]

41 голосов
/ 01 мая 2013

Это информационная уязвимость, злоумышленник может изменить файлы cookie и назначить недопустимые символы для PHPSESSID, чтобы показать это предупреждение PHP, которое на самом деле содержит сочные данные, такие как путь к файлу и имя пользователя!

15 голосов
/ 06 июля 2010

посмотрите на это session_start() обсуждение для обхода:

session_start() сгенерируйте предупреждение, если PHPSESSID содержит недопустимые символы

Предупреждение: session_start () [function.session-start]: идентификатор сессии содержит недопустимые символы, допустимые символы - это 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;
        }
    ?>
14 голосов
/ 02 декабря 2014

Существует сообщение об ошибке для этой проблемы (https://bugs.php.net/bug.php?id=68063)

. Вы можете проверить успешность своего session_start и сгенерировать идентификатор, если необходимо:

$ok = @session_start();
if(!$ok){
session_regenerate_id(true); // replace the Session ID
session_start(); 
}
11 голосов
/ 16 июня 2014

Я редактировал Предыдущее решение Андрона !(исправьте возвращаемое значение) и добавили результат оценки 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();
}
5 голосов
/ 13 марта 2014

Предлагаю использовать «более правильную» версию функции.

Несколько заметок:

  1. Более правильное регулярное выражение ( допускает символы в диапазоне a-z A-Z 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;
    }
?>
2 голосов
/ 23 сентября 2015

Я пришел с этим простым методом, просто попробуйте перехватить начало сеанса, и, если возникнет проблема, создайте сеанс заново.

try {
   session_start();
} catch(ErrorExpression $e) {
   session_regenerate_id();
   session_start();
} 
2 голосов
/ 21 сентября 2014

Если вас не волнуют другие пользователи (например, если это частный интерфейс), просто проверьте браузер, найдите файл cookie PHPSESSID (или имя, которое вы дали), удалите его и обновите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...