Сохраняют ли запросы AJAX информацию о сеансе PHP?

138

Если бы я зарегистрировал пользователя на моем сайте, указав его идентификатор в $_SESSION, и из своего браузера он нажал кнопку "Сохранить", которая сделает запрос AJAX на сервер. Будут ли сохранены его $_SESSION и файлы cookie в этом запросе, и могу ли я уверенно полагаться на идентификатор, присутствующий в $_SESSION?

Теги:
session

7 ответов

178
Лучший ответ

Ответ:

Сессии поддерживаются на стороне сервера. Что касается сервера, то нет разницы между запросом AJAX и регулярным запросом страницы. Они оба являются HTTP-запросами, и оба они содержат информацию cookie в заголовке тем же способом.

С клиентской стороны те же файлы cookie всегда будут отправляться на сервер, независимо от того, является ли он обычным запросом или запросом AJAX. Код Javascript не должен делать ничего особенного или даже знать об этом, он просто работает так же, как и с обычными запросами.

  • 9
    Продолжение: сервер может установить флаг HttpOnly при установке файла cookie, что означает, что ваш Javascript не сможет увидеть файл cookie. Однако cookie все равно будет отправляться как для AJAX, так и для обычных запросов страниц, и будет продолжать работать точно так же. Ваш Javascript просто не увидит его в document.cookie .
24

То, что вы действительно получаете, это: отправляются файлы cookie с запросом AJAX? Предполагая, что запрос AJAX относится к одному и тому же домену (или к ограничениям домена для файла cookie), ответ да. Поэтому запросы AJAX на один и тот же сервер сохраняют одну и ту же информацию о сеансе (при условии, что вызываемые скрипты выдают session_start(), как любой другой PHP script, желающий получить доступ к информации о сеансе).

  • 1
    Возможно, я ошибаюсь, но я думал, что даже невозможно публиковать запросы AJAX в другие домены (исключая субдомены)?
  • 0
    Возможно, вам удастся обмануть с помощью динамического трюка со скриптом. Никогда не уставал, хотя.
Показать ещё 6 комментариев
19

Если файл PHP для запросов AJAX имеет session_start(), информация о сеансе будет сохранена. (запрет запросов находится в пределах одного домена)

  • 2
    действительно, это то, что я забыл сделать :-)
7

Ну, не всегда. Используя файлы cookie, вы хороши. Но "могу ли я безопасно полагаться на присутствующий идентификатор" призвал меня расширить обсуждение с важным моментом (в основном для справки, так как количество посетителей этой страницы кажется довольно высоким).

PHP может быть настроен на сохранение сеансов путем перезаписи URL вместо файлов cookie. (Как это хорошо или плохо (< - см. например, самый верхний комментарий там) является отдельный вопрос, давайте теперь придерживаться текущего, только с одной стороны: самая важная проблема с сеансами на основе URL-адресов - вопиющая видимость голого идентификатора сеанса - не проблема с внутренним Ajax но затем, если он включен для Ajax, он включается и для остальной части сайта, поэтому там...)

В случае сеансов перезаписи URL (cookieless), вызовы Ajax должны сами позаботиться о себе, чтобы их URL-адреса запросов были правильно обработаны. (Или вы можете свернуть свое собственное решение. Вы даже можете прибегнуть к обслуживанию сеансов на стороне клиента, в менее сложных случаях.) Точка является явной заботой, необходимой для непрерывности сеанса, если не используется куки:

  • Если Ajax вызывает только извлечение URL-адресов из HTML (как получено из PHP), это должно быть ОК, поскольку они уже приготовлены (umm, cookified).

  • Если им необходимо собрать собственные URI-запросы, идентификатор сеанса должен быть добавлен в URL-адрес вручную. (Проверьте здесь или источники страниц, сгенерированные PHP (с URL-адресом -rewriting на), чтобы увидеть, как это сделать.)


От OWASP.org:

Эффективно веб-приложение может использовать оба механизма, файлы cookie или URL-адреса или даже переключаться с одного на другой (автоматический URL-адрес переписывание), если выполняются определенные условия (например, существование веб-клиентов без поддержки cookies или когда файлы cookie не принятые в связи с проблемами конфиденциальности пользователей).

Из Ruby-forum сообщение:

При использовании php с кукисами идентификатор сеанса будет автоматически отправляться в заголовках запроса даже для Ajax XMLHttpRequests. Если вы использовать или разрешать php-сессии на основе URL-адресов, вам нужно будет добавить идентификатор сеанса к каждому URL-адресу запроса Ajax.

  • 0
    Есть ли достоверная статистика о том, у скольких людей сеансовые куки отключены? (Я не смог их найти. Только на Javascript: в США / Европе этот показатель составляет около 2%, а в среднем около 1,2%).
  • 0
    Идентификаторы сеансов в URL-адресе устарели и небезопасны . В сегодняшней сети никто не должен предполагать, что они могут работать с отключенными файлами cookie и по-прежнему заходить на веб-сайты, на которых у них есть аккаунт. Если у одного из ваших посетителей отключены файлы cookie, вероятно, можно с уверенностью предположить, что либо а) они специально не хотят иметь возможность входить на какой-либо сайт по соображениям конфиденциальности; или б) они сделали это случайно, и теперь они не могут войти ни на один сайт, не только на ваш.
Показать ещё 1 комментарий
3

Очень важно, чтобы AJAX-запросы сохраняли сеанс. Самый простой пример - когда вы пытаетесь выполнить запрос AJAX для панели администратора, скажем так. Конечно, вы будете защищать страницу, на которую вы отправляете запрос, а не на доступ к другим, у которых нет сеанса, который вы получаете после входа в систему администратора. Имеет смысл?

0

Что делают рамки, например. если вы инициализируете сеанс в Front Controller или boostrap script, вам не нужно будет заботиться об этом для инициализации либо для контроллеров страниц, либо для контроллеров ajax. Фреймворки PHP не являются панацеей, но они делают так много полезных вещей, как это!

0

Одна вещь, о которой нужно помнить, особенно если вы используете фреймворк, заключается в проверке того, восстанавливает ли приложение идентификаторы сеанса между запросами - все, что явно зависит от идентификатора сеанса, сталкивается с проблемами, хотя, очевидно, остальная часть данные в сеансе не будут затронуты.

Если приложение регенерирует идентификаторы сеанса, подобные этому, тогда вы можете столкнуться с ситуацией, когда запрос ajax фактически недействителен/заменяет идентификатор сеанса на запрашивающей странице.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню