Идентификатор сеанса слишком длинный или содержит недопустимые символы, действительными символами являются a-z, A-Z, 0-9 и '-,'
Как решить:
Предупреждение: session_start() [function.session-start]: идентификатор сеанса слишком длинный или содержит недопустимые символы, допустимые символы: az, AZ, 0-9 и "-" в строке..... on line 3
Предупреждение: session_start() [function.session-start]: не удается отправить cookie сеанса - уже отправленные заголовки (вывод запущен в......: 3) в строке..... по строке 3
Предупреждение: session_start() [function.session-start]: Не удается отправить ограничитель кеша сеанса - уже отправлены заголовки (вывод запущен в.....: 3) в строке..... в строке 3
Ответы
Ответ 1
посмотрите на 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;
}
?>
Ответ 2
Это уязвимость в информации, вредоносный злоумышленник может изменить файлы cookie и назначить незаконные символы PHPSESSID, чтобы разоблачить это предупреждение PHP, которое на самом деле содержит сочную информацию, такую как путь к файлу и имя пользователя!
Ответ 3
Для этой проблемы есть отчет об ошибке (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();
}
Ответ 4
Я отредактировал предыдущее решение 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();
}
Ответ 5
Я предлагаю использовать "более правильную" версию функции.
Несколько примечаний:
- Более правильное регулярное выражение (позволяет символы в диапазоне a-z A-Z 0-9, (запятая) и - (минус)), как описано здесь.
Регулярное выражение зависит от настроек php ini, как описано здесь и здесь.
- Использовать метод имени сеанса
Таким образом, обновленная версия выглядит следующим образом:
<?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;
}
?>
Ответ 6
Если вам не нравятся другие пользователи (например: если это частный интерфейс), просто проверьте браузер, найдите файл cookie PHPSESSID (или имя, которое вы ему дали), удалите его и обновите.
Ответ 7
Я пришел с этим простым методом, просто попробую и поймаю начало сеанса, и если есть проблема, восстановите сеанс.
try {
session_start();
} catch(ErrorExpression $e) {
session_regenerate_id();
session_start();
}