Идентификатор сеанса слишком длинный или содержит недопустимые символы, действительными символами являются az, AZ, 0-9 и '-,'

Как решить :

Предупреждение: 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

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

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

Предупреждение: session_start () [function.session-start]: идентификатор сеанса содержит недопустимые символы, допустимые символы: az, AZ, 0-9 и '-,' в /home/para/dev/mon_site/header.php on line 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; } ?> 

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

Для этой проблемы есть отчет об ошибке ( 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(); } 

Я отредактировал предыдущее решение 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(); } 

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

Несколько примечаний:

  1. Более правильное регулярное выражение ( позволяет использовать символы в диапазоне az 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; } ?> 

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

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

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