Подтвердить что ты не робот

Почему идентификатор сеанса изменяется при запросе через ajax в php?

Я вошел в систему Banana.com. Банана имеет ссылку api на /app/ajax_loggedin.

Мой сайт - обезьяна. Monkey запускает простой GET json для банана /app/ajax_loggedin, который возвращает значение loggedin 1 или 0.

Почему он всегда возвращает 0, когда он проходит через ajax, хотя я действительно вошел в систему на Banana, а также при обращении к ссылке напрямую дает мне 1. Как разработчик в Банане может это исправить?

Я бы понял это, если это вызов на стороне сервера, но я не понимаю, почему он не скажет мне, если я вошел в систему, если Банана сделает запрос. Выполняя проверку session_id(), он генерирует новый каждый вызов через ajax, и при непосредственном доступе он работает просто отлично и сохраняет то же самое.

Есть ли какое-либо исправление или другой способ сделать это?

4b9b3361

Ответ 1

Каждая точка входа или вызов сервера (API) должна иметь session_start() в начале. Если он не читается в идентификаторе сеанса, он будет действовать так, как будто его не было, а затем возвращает новый идентификатор сеанса. Когда ваш браузер получит ответ, он перезапишет идентификатор сеанса новым. Убедитесь, что у вас есть session_start() в верхней части всех мест, где вы делаете вызов на сервер, чтобы он знал, какой сеанс использовать.

Ответ 2

На самом деле информации недостаточно, чтобы окончательно ответить на этот вопрос. Однако вот что мы можем сказать на основе этой информации.

Если вы используете стандартный обработчик сеанса PHP, у cookie сеанса будет связанный с ним домен (который, если он не настроен в php.ini или в вашем коде, скорее всего, будет доменом Сначала был вызван script). Например, если вы вызываете script, который вызывает session_start() из домена www.stackoverflow.com, а другой script на chat.stackoverflow.com начинает сеанс, у него не будет доступа к файлу cookie с доменом www.stackoverflow.com и, таким образом, он начнет новый сеанс.

Домены в заголовке файла cookie могут пузыриться, но не вниз. Поэтому, если вы хотите, чтобы ваш cookie сеанса имел доступ ко всем субдоменам Banana.com, вы должны обязательно правильно установить параметр домена в каждом запросе инициализации сеанса с этим доменом.

Подробнее см. session_set_cookie_params и session_get_cookie_params...

Домен, доступный для файла cookie. Настройка домена на "www.example.com" сделает файл cookie доступным в субдомене www и более высоких поддоменах. Файлы cookie, доступные для более низкого домена, такие как example.com, будут доступны для более высоких субдоменов, таких как "www.example.com". Старые браузеры, все еще реализующие устаревшие "RFC 2109, могут потребовать ведущих. для соответствия всем поддоменам.

Кроме того, вы должны заметить, что файлы cookie, отправленные с параметром безопасный или http_only, установленным в true, не будут читаться по небезопасным или инициированным JavaScript соединениям, например, в случае Ajax.

Ответ 3

Причины, по которым вы получите новый идентификатор сеанса,

  • Вы очистили файл cookie идентификатора сеанса (обычно называемый PHPSESSID)
  • Вы посетили страницу, которая называлась session_regenerate_id() (маловероятно)
  • Ваша сессия попала в максимальная продолжительность жизни и была сбор мусора. Это отличная возможность, если у banana.com много посетителей, потому что мусор собирается случайным образом при вызове PHP.
  • session_id() был вызван с другим сеансом

Итак, что делать?

  • Проверьте файлы сеанса на сервере. Это простой текст, поэтому вы можете открыть их и посмотреть, что внутри. Убедитесь, что ваш сеанс существует.
  • Проверьте php.ini на короткое время сеанса сеанса.
  • Загрузите сеансы во что-то еще и посмотрите, продолжатся ли. Использование системы MySQL/memcached с помощью настраиваемого обработчика сеансов может выявить проблемы.

Ответ 4

Вместо вызова api и проверки активности сеанса. Идентификатор сеанса хранится в файле cookie, если указан, где хранить идентификатор сеанса в файле конфигурации, или вы действительно можете проверить, установлен ли идентификатор сеанса, используя следующий код после

session_start();      
$session_id=session_id();     
if(isset($_SESSION[$session_id]))